Afișarea articolelor din aceeași categorie folosind link-urile următorul/anteriorul articol

17 iun. 2014, 10:23:36
Vizualizări: 45.5K
Voturi: 11

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ă.

6
Comentarii

Folosești codul în single.php?

Pieter Goosen Pieter Goosen
17 iun. 2014 13:54:11

Pentru ce articol dorești să afișezi linkurile către articolul anterior/următor? Pentru ultimul articol din array-ul $posts din codul furnizat, sau pentru articolul principal de pe pagina curentă?

engelen engelen
17 iun. 2014 14:05:11

@pieter Goosen: da, folosesc codul în single.php

user54318 user54318
17 iun. 2014 14:11:11

@engelen Afișez toate articolele în legătură cu categoria de pe pagina curentă și acum doresc ca linkurile de „înainte” și „înapoi” să fie restricționate doar la categoria curentă

user54318 user54318
17 iun. 2014 14:27:52

Bine, ce fel de pagină este aceasta? O pagină de articol singular, o arhivă de categorii, ..?

engelen engelen
17 iun. 2014 14:41:11

@engelen: este o pagină de articol singular

user54318 user54318
17 iun. 2014 14:47:59
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 5
3
23

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
}
20 iun. 2014 13:34:10
Comentarii

+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ă!

Devner Devner
8 oct. 2014 10:25:51

Mulțumesc, foarte util pentru mine

Sumit Kumar Gupta Sumit Kumar Gupta
3 ian. 2020 22:48:51

unde pui acest cod?

Shivam Sahil Shivam Sahil
7 nov. 2020 17:53:20
4

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).

17 iun. 2014 10:31:33
Comentarii

Mulțumesc pentru răspunsul rapid. Tot obțin același rezultat.

user54318 user54318
17 iun. 2014 10:50:11

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?

engelen engelen
17 iun. 2014 10:52:03

am actualizat întrebarea mea

user54318 user54318
17 iun. 2014 12:08:46

Am actualizat răspunsul meu în consecință.

engelen engelen
17 iun. 2014 14:56:08
6

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.

17 iun. 2014 15:06:15
Comentarii

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

user54318 user54318
17 iun. 2014 15:18:15

În această linie echo $post->post_content, ai uitat ;

Pieter Goosen Pieter Goosen
17 iun. 2014 15:19:49

Ah da, am înțeles :)

user54318 user54318
17 iun. 2014 15:20:51

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

Pieter Goosen Pieter Goosen
17 iun. 2014 15:22:00

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

Pieter Goosen Pieter Goosen
17 iun. 2014 15:24:13

Hmmm da, am găsit soluția pentru problema mea. Cred că nu am pus întrebările corect. Oricum, mulțumesc pentru sugestii. Am postat soluția pentru problema mea

user54318 user54318
20 iun. 2014 13:35:44
Arată celelalte 1 comentarii
1

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();
9 nov. 2015 15:56:25
Comentarii

Mulțumesc, mulțumesc, mulțumesc foarte mult!!!!

Victor Sokoliuk Victor Sokoliuk
12 ian. 2022 17:21:26
0
<?php next_post_link( '%link', '%title', TRUE, '0' , 'category' ); ?>
<?php previous_post_link( '%link', '%title', TRUE, '0' , 'category' ); ?>

Unde 0 este ID-ul categoriei excluse

21 dec. 2022 08:57:30