Afișarea articolelor din aceeași categorie folosind link-urile următorul/anteriorul articol
Folosesc acest cod, dar când dau click pe link-ul către următorul/anteriorul articol, sunt redirecționat către următorul/anteriorul articol dintr-o categorie diferită.
previous_post_link( '%link', 'Articolul anterior din categorie', $in_same_term = true );
next_post_link( '%link', 'Următorul articol din categorie', $in_same_term = true );
Încerc să rezolv problema folosind acest articol.
Iată codul pe care îl folosesc pentru articole și categorii, și nu folosesc tipuri de postări și categorii personalizate:
$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', 'Articolul anterior din categorie', $in_same_term = true );
next_post_link( '%link', 'Următorul articol din categorie', $in_same_term = true );
Practic, codul extrage toate articolele bazate pe categorie, iar acum vreau ca link-urile către următorul/anteriorul articol să funcționeze doar pentru această categorie specifică.
Iată codul pentru a obține legăturile anterioare și următoare bazate pe categorie în articole:
<?php
$post_id = $post->ID; // ID-ul articolului curent
$cat = get_the_category();
$current_cat_id = $cat[0]->cat_ID; // ID-ul categoriei curente
$args = array(
'category' => $current_cat_id,
'orderby' => 'post_date',
'order' => 'DESC'
);
$posts = get_posts( $args );
// obține ID-urile articolelor preluate din get_posts
$ids = array();
foreach ( $posts as $thepost ) {
$ids[] = $thepost->ID;
}
// obține și afișează articolul anterior și următor din aceeași categorie
$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) ?>">Anterior</a><?php
}
if (false !== $nextid ) {
?><a rel="next" href="<?php echo get_permalink($nextid) ?>">Următor</a><?php
}

+1 Exact asta căutam. Cerința mea era să ordonez după câmpul Order din caseta Edit Page Attributes. Așa că am modificat $args în $args = array('category'=>$current_cat_id,'orderby'=>'menu_order','order'=> 'ASC');
și asta a rezolvat problema mea. Mulțumesc mult pentru soluția oferită!

Funcțiile previous_post_link
și next_post_link
au ambele cinci parametri:
$format
: Șablonul de formatare pentru link, folosit pentru a controla ce apare înainte și după link
$link
: Textul linkului care va fi afișat
$in_same_term
: Dacă postarea următoare/anterioară trebuie să fie în același termen de taxonomie ca și postarea curentă
$excluded_terms
: Termenii din care să fie excluse postările
$taxonomy
: Taxonomia care trebuie utilizată când $in_same_term
este adevărat
După cum puteți vedea, parametrul $in_same_term
face exact ceea ce aveți nevoie. Cu toate acestea, nu îl utilizați corect în codul dvs. de exemplu. De fapt, transmiteți rezultatul atribuirii lui true
unei variabile $in_same_term
. Acest lucru nu va funcționa: transmiterea unui argument este la fel de simplă ca transmiterea unei valori:
previous_post_link( '%link', 'Postarea anterioară în categorie', true );
next_post_link( '%link', 'Postarea următoare în categorie', true );
Editare: (editat după ce OP a actualizat întrebarea)
Problema este că previous_post_link
și next_post_link
utilizează obiectul global post, pe care îl suprascrieți. Pentru a preveni acest lucru, utilizați un alt nume de variabilă în bucla dvs. $posts
, cum ar fi $singlepost
:
foreach ( $posts as $singlepost ) {
echo $singlepost->post_content
}
În acest fel, obiectul global $post
este păstrat. Alternativ, puteți stoca obiectul global post într-o variabilă temporară și reseta $post
din nou mai târziu, dar acest lucru este necesar doar dacă apelați setup_postdata
(ceea ce nu faceți).

Va trebui să ne oferi mai multe informații decât atât :-). Folosești un custom post type sau o taxonomie personalizată, sau pur și simplu "Postări" și "Categorii"? Există vreun loc unde putem vedea ce se întâmplă de fapt?

Codul tău nu are sens pentru mine, în afară de faptul că conține o eroare de sintaxă. În starea actuală, când dai click pe un post dintr-o pagină de blog, ești redirecționat către vizualizarea individuală a postului, așa cum ar trebui. Doar acel post este afișat în single.php.
Problema apare când dai click pe linkurile către posturi, indiferent dacă este linkul către postul anterior sau următor. Ceea ce se întoarce sunt toate posturile din acea categorie specifică când se încarcă pagina următoare/precedentă. Așa ai codat tu single.php, și de aceea linkurile către posturi nu funcționează cum te-ai aștepta.
Eu nu aș folosi get_posts()
pentru a configura bucla în pagina single.php. Aș folosi pur și simplu bucla normală corectă. Te rog verifică această pagină din codex despre Dezvoltarea de teme.
Iată un exemplu de single.php care va funcționa conform așteptărilor:
<?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
// Începe bucla.
while ( have_posts() ) : the_post(); ?>
<?php
get_template_part( 'content', get_post_format() );
// Navigație între posturi anterioare/următoare.
previous_post_link( '%link', 'Postul anterior în categorie', true );
next_post_link( '%link', 'Postul următor în categorie', true );
// Dacă comentariile sunt deschise sau avem cel puțin un comentariu, încărcăm șablonul de comentarii.
if ( comments_open() || get_comments_number() ) {
comments_template();
}
endwhile;
?>
</div><!-- #content -->
</div><!-- #primary -->
<?php get_sidebar( 'content' ); ?>
</div><!-- #main-content -->
<?php
get_footer();
Așa cum s-a menționat în celălalt răspuns, citește despre cum să folosești next_post_link
și previous_post_link
.

Mulțumesc pentru răspuns. Poți să-mi spui unde este eroarea de sintaxă în codul meu?

Te rog setează debug la true în wp-config. Acest lucru te va ajuta foarte mult

Ar trebui să încerci ce am spus, codul tău nu poate funcționa, așa cum este acum, va reîncărca aceeași pagină iar și iar cu linkurile postărilor

Am avut aceeași problemă ÎN PLUS aveam nevoie de toate acestea pentru un tip de postare personalizată și taxonomie personalizată. user54318 m-a îndreptat în direcția corectă, care nu este capabilă să ruleze cpt-uri, așa că voi împărtăși și eu rezultatele mele aici:
//obține taxonomiile personalizate.
$terms = wp_get_post_terms( get_the_ID(), 'product_cat' ); //ultimul argument este taxonomia personalizată. schimbați la taxa dorită
//parcurge toți termenii și filtrează-l pe cel de care am nevoie.
$stay_in = array();
foreach( $terms as $term ) :
/*acest buclă caută o categorie, care este copilul categoriei cu id-ul 37. schimbați în funcție de nevoile dumneavoastră.
singura importanță este să construiți un array de id-uri de termeni, care să fie incluse în comportamentul anterior/următor, așa că dacă știți deja id-urile dumneavoastră, puteți folosi ceva de genul $stay_in = array( 43 ); și săriți peste acest întreg buclă..*/
if ( $term->parent == 37 ) :
$stay_in[] = $term->term_id;
break; //ieși din foreach, dacă a fost găsit.
endif;
endforeach;
//obține toate id-urile de postări, care sunt în categoria mea definită
$args = array(
'post_type' => 'product', //tip de postare personalizată
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat', // taxonomie personalizată
'field' => 'term_id',
'terms' => $stay_in,
'operator' => 'IN', //schimbați în funcție de nevoile dumneavoastră.. IN, NOT IN, AND, EXISTS, NOT EXISTS
)
),
'orderby' => 'post_date',
'order' => 'ASC',
'fields' => 'ids', //returnează doar id-urile postărilor, nu întregul obiect post
);
$all_posts = new WP_Query( $args );
//caută postarea curentă după id-ul său și caută id-urile anterioare/următoare
$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 ];
//afișează link-uri, dacă există anterior/următor
if ( ! empty( $prev_id ) ) :
echo '<a rel="prev" href="' . get_permalink( $prev_id ) . '">' . __( 'anterior', 'your_theme_text_domain' ) . '</a>';
endif;
if ( ! empty( $next_id ) ) :
echo '<a rel="next" href="' . get_permalink( $next_id ) . '">' . __( 'următor', 'your_theme_text_domain' ) . '</a>';
endif;
wp_reset_postdata();
