Visualizzare articoli della stessa categoria usando i link precedente/successivo
Sto usando questo codice, ma quando clicco sul link dell'articolo successivo/precedente, vengo reindirizzato all'articolo successivo/precedente di una categoria diversa.
previous_post_link( '%link', 'Articolo precedente nella categoria', $in_same_term = true );
next_post_link( '%link', 'Articolo successivo nella categoria', $in_same_term = true );
Sto cercando di risolvere il mio problema usando questo articolo.
Ecco il codice che sto usando per gli articoli e le categorie, e non sto utilizzando tipi di post e categorie personalizzate:
$post_id = $post->ID;
$cat = get_the_category();
$current_cat_id = $cat[0]->cat_ID;
$args = array(
'category' => $current_cat_id,
'orderby' => 'post_date',
'order' => 'DESC'
);
$posts = get_posts( $args );
foreach( $posts as $post ) {
echo $post->post_content;
}
previous_post_link( '%link', 'Articolo precedente nella categoria', $in_same_term = true );
next_post_link( '%link', 'Articolo successivo nella categoria', $in_same_term = true );
In pratica sta recuperando tutti gli articoli in base alla categoria, e ora voglio che il link all'articolo successivo/precedente funzioni solo per questa particolare categoria.

Ecco il codice per ottenere i link precedente e successivo basati sulla categoria negli articoli:
<?php
$post_id = $post->ID; // ID dell'articolo corrente
$cat = get_the_category();
$current_cat_id = $cat[0]->cat_ID; // ID della categoria corrente
$args = array(
'category' => $current_cat_id,
'orderby' => 'post_date',
'order' => 'DESC'
);
$posts = get_posts( $args );
// ottieni gli ID degli articoli recuperati da get_posts
$ids = array();
foreach ( $posts as $thepost ) {
$ids[] = $thepost->ID;
}
// ottieni e mostra il link all'articolo precedente e successivo nella stessa categoria
$thisindex = array_search( $post_id, $ids );
$previd = isset( $ids[ $thisindex - 1 ] ) ? $ids[ $thisindex - 1 ] : false;
$nextid = isset( $ids[ $thisindex + 1 ] ) ? $ids[ $thisindex + 1 ] : false;
if (false !== $previd ) {
?><a rel="prev" href="<?php echo get_permalink($previd) ?>">Precedente</a><?php
}
if (false !== $nextid ) {
?><a rel="next" href="<?php echo get_permalink($nextid) ?>">Successivo</a><?php
}

+1 Questo è esattamente ciò che stavo cercando. La mia esigenza era di ordinare in base al campo Ordine nella casella Modifica attributi pagina. Quindi ho modificato gli $args in $args = array('category'=>$current_cat_id,'orderby'=>'menu_order','order'=> 'ASC');
e questo ha risolto il mio problema. Grazie mille per aver condiviso la soluzione!

Le funzioni previous_post_link
e next_post_link
hanno entrambe cinque parametri:
$format
: Stringa di formato per il link, utilizzata per controllare ciò che viene prima e dopo il link
$link
: Testo del link da visualizzare
$in_same_term
: Se il post successivo/precedente deve essere nello stesso termine di tassonomia del post corrente
$excluded_terms
: Termini da cui escludere i post
$taxonomy
: La tassonomia da utilizzare quando $in_same_term
è vero
Come puoi vedere, il parametro $in_same_term
fa esattamente ciò di cui hai bisogno. Tuttavia, non lo stai utilizzando correttamente nel tuo codice di esempio. In realtà stai passando il risultato dell'assegnazione di true
a una variabile $in_same_term
. Questo non funzionerà: passare un argomento è semplice come passare un valore:
previous_post_link( '%link', 'Post precedente nella categoria', true );
next_post_link( '%link', 'Post successivo nella categoria', true );
Modifica: (modificato dopo l'aggiornamento della domanda da parte dell'OP)
Il problema è che previous_post_link
e next_post_link
utilizzano l'oggetto post globale, che stai sovrascrivendo. Per evitare ciò, utilizza un altro nome di variabile nel tuo ciclo $posts
, come $singlepost
:
foreach ( $posts as $singlepost ) {
echo $singlepost->post_content
}
In questo modo, l'oggetto post globale $post
viene preservato. In alternativa, potresti memorizzare l'oggetto post globale in una variabile temporanea e reimpostare $post
nuovamente in seguito, ma questo è necessario solo se stai chiamando setup_postdata
(cosa che non stai facendo).

Grazie per la tua rapida risposta. Continuo a ottenere lo stesso risultato.

Dovrai fornirci qualche informazione in più :-). Stai utilizzando un post type personalizzato o una tassonomia personalizzata, o semplicemente "Post" e "Categorie"? C'è un posto dove possiamo vedere cosa sta effettivamente andando storto?

Il tuo codice non ha senso per me, a parte avere un errore di sintassi. Nella sua forma attuale, quando clicchi su un post da una pagina di post/blog, vieni reindirizzato alla visualizzazione singola del post come dovrebbe essere. Solo quel post viene visualizzato su single.php.
Il problema inizia quando clicchi sui link dei post, non importa se è il link del post precedente o successivo. Ciò che viene restituito sono tutti i post di quella particolare categoria quando la pagina successiva/precedente si carica. Questo è come hai codificato il tuo single.php, ed è il motivo per cui i link dei post non funzionano come ti aspetti.
Non userei get_posts()
per impostare il mio loop sulla pagina single.php. Userei semplicemente il normale loop corretto. Dai un'occhiata a questa pagina nel codex riguardo Sviluppo di Temi
Ecco un esempio di single.php che funzionerà come previsto
<?php
get_header(); ?>
<div id="main-content" class="main-content">
<div id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php
// Inizia il Loop.
while ( have_posts() ) : the_post(); ?>
<?php
get_template_part( 'content', get_post_format() );
// Navigazione post precedente/successivo.
previous_post_link( '%link', 'Post precedente nella categoria', true );
next_post_link( '%link', 'Post successivo nella categoria', true );
// Se i commenti sono aperti o abbiamo almeno un commento, carica il template dei commenti.
if ( comments_open() || get_comments_number() ) {
comments_template();
}
endwhile;
?>
</div><!-- #content -->
</div><!-- #primary -->
<?php get_sidebar( 'content' ); ?>
</div><!-- #main-content -->
<?php
get_footer();
Come sottolineato nell'altra risposta, vai a leggere come usare next_post_link
e previous_post_link

Grazie per la tua risposta, puoi dirmi dove si trova l'errore di sintassi nel mio codice?

Per favore imposta debug a true in wp-config. Questo dovrebbe aiutarti molto

Dovresti provare quello che ho detto, il tuo codice non può funzionare, con il tuo codice così com'è, ricaricherà semplicemente la stessa pagina più e più volte con i link dei post

Avevo lo stesso problema PIÙ avevo bisogno di tutto questo per un custom post type e una tassonomia personalizzata. user54318 mi ha indirizzato nella giusta direzione, che però non è in grado di gestire i cpt, quindi condividerò anche qui i miei risultati:
//ottieni le tassonomie personalizzate
$terms = wp_get_post_terms( get_the_ID(), 'product_cat' ); //l'ultimo argomento è la tassonomia personalizzata. cambia secondo necessità
//scorri tutti i termini e filtra quello che ti serve
$stay_in = array();
foreach( $terms as $term ) :
/*questo ciclo cerca una categoria che sia figlia della categoria con id 37. modifica secondo le tue esigenze.
l'unica cosa importante è costruire un array di term id da includere nel comportamento previous/next, quindi se conosci già i tuoi id, potresti anche usare qualcosa come $stay_in = array( 43 ); e saltare tutto questo ciclo..*/
if ( $term->parent == 37 ) :
$stay_in[] = $term->term_id;
break; //esci dal foreach se trovato
endif;
endforeach;
//ottieni tutti gli id dei post che sono nella mia categoria definita
$args = array(
'post_type' => 'product', //custom post type
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat', // tassonomia personalizzata
'field' => 'term_id',
'terms' => $stay_in,
'operator' => 'IN', //cambia secondo necessità.. IN, NOT IN, AND, EXISTS, NOT EXISTS
)
),
'orderby' => 'post_date',
'order' => 'ASC',
'fields' => 'ids', //restituisce solo gli id dei post, non gli interi oggetti post
);
$all_posts = new WP_Query( $args );
//cerca il post corrente per id e cerca gli id previous/next
$this_index = array_search( $post->ID, $all_posts->posts );
$prev_id = $all_posts->posts[ $this_index - 1 ];
$next_id = $all_posts->posts[ $this_index + 1 ];
//mostra i link, se previous/next esistono
if ( ! empty( $prev_id ) ) :
echo '<a rel="prev" href="' . get_permalink( $prev_id ) . '">' . __( 'precedente', 'your_theme_text_domain' ) . '</a>';
endif;
if ( ! empty( $next_id ) ) :
echo '<a rel="next" href="' . get_permalink( $next_id ) . '">' . __( 'successivo', 'your_theme_text_domain' ) . '</a>';
endif;
wp_reset_postdata();
