Mostrare post Precedente e Successivo della stessa Categoria o Tipo

Su WordPress può capitare di dover mostrare sulla pagina di un post, i link per andare al post precedente e successivo.

Ci sono molte soluzioni differenti per raggiungere lo stesso risultato, ma un piccolo dettaglio che nella maggior parte di esse non si trova, è la possibilità di mostrare solamente post appartenenti alla stessa categoria o dello stesso tipo (anche custom).

Questo snippet di codice consente di ottenere i link del post precedente e successivo appartenenti alla stessa categoria.

<?php
$postId = $post->ID;    // id del post corrente
$currentCat = get_the_category()[0]->cat_ID;    // id della categoria corrente

$posts = get_posts( array( 
    'category' => $currentCat,
    'orderby'  => 'post_date',
    'order'    => 'DESC'
) );

// ottiene id dei post recuperati da get_posts
$ids = array();
foreach ( $posts as $post ) {
    $ids[] = $post->ID;
}

// ottiene gli id del post precedente e successivo
$currentIndex = array_search( $postId, $ids );
$prevPostId = isset( $ids[ $currentIndex - 1 ] ) ? $ids[ $currentIndex - 1 ] : 0;
$nextPostId = isset( $ids[ $currentIndex + 1 ] ) ? $ids[ $currentIndex + 1 ] : 0;

// controlla se esiste un post precedente e stampa il link
if ( $prevPostId ) { ?>
    <a href="<?php the_permalink($prevPostId) ?>">Post Precedente</a>
<?php }

// controlla se esiste un post successivo e stampa il link
if ( $nextPostId ) { ?>
    <a href="<?php the_permalink($nextPostId) ?>">Post Successivo</a>
<?php } ?>

Se al posto della categoria volete che i post siano dello stesso tipo, potete semplicemente sostituire il parametro category con quello post_type nei parametri passati a get_posts(). In questo modo:

$currentPostType = get_post_type();

$posts = get_posts( array( 
    'post_type' => $currentPostType ,
    'orderby'   => 'post_date',
    'order'     => 'DESC'
) );

Ovviamente potete tenere sia il parametro per la categoria che quello per il tipo se volete che i post mostrati rispondano ad entrambi i requisiti.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *