Visualizzare articoli della stessa categoria usando i link precedente/successivo

17 giu 2014, 10:23:36
Visualizzazioni: 45.5K
Voti: 11

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.

6
Commenti

Stai usando il codice in single.php

Pieter Goosen Pieter Goosen
17 giu 2014 13:54:11

Per quale articolo vuoi mostrare i link agli articoli precedenti/successivi? Per l'ultimo articolo nell'array $posts dal codice che hai fornito, o dall'articolo principale nella pagina corrente?

engelen engelen
17 giu 2014 14:05:11

@pieter Goosen: sì, sto usando il codice in single.php

user54318 user54318
17 giu 2014 14:11:11

@engelen Sto visualizzando tutti i post relativi alla categoria nella pagina corrente e ora voglio che i link successivo e precedente siano limitati solo alla categoria corrente

user54318 user54318
17 giu 2014 14:27:52

Va bene, che tipo di pagina è? Una pagina di singolo post, un archivio di categoria, ..?

engelen engelen
17 giu 2014 14:41:11

@engelen: è una pagina di singolo post

user54318 user54318
17 giu 2014 14:47:59
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 5
3
23

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
}
20 giu 2014 13:34:10
Commenti

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

Devner Devner
8 ott 2014 10:25:51

Grazie, molto utile per me

Sumit Kumar Gupta Sumit Kumar Gupta
3 gen 2020 22:48:51

dove inserisci questo codice?

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

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

17 giu 2014 10:31:33
Commenti

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

user54318 user54318
17 giu 2014 10:50:11

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?

engelen engelen
17 giu 2014 10:52:03

ho aggiornato la mia domanda

user54318 user54318
17 giu 2014 12:08:46

Ho aggiornato la mia risposta di conseguenza.

engelen engelen
17 giu 2014 14:56:08
6

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

17 giu 2014 15:06:15
Commenti

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

user54318 user54318
17 giu 2014 15:18:15

In questa riga echo $post->post_content, manca il ;

Pieter Goosen Pieter Goosen
17 giu 2014 15:19:49

Oh sì, capito :)

user54318 user54318
17 giu 2014 15:20:51

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

Pieter Goosen Pieter Goosen
17 giu 2014 15:22:00

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

Pieter Goosen Pieter Goosen
17 giu 2014 15:24:13

Hmmm sì ho trovato la soluzione al mio problema. Immagino di non aver posto le domande nel modo corretto. Comunque grazie per i tuoi suggerimenti. Ho pubblicato la soluzione al mio problema

user54318 user54318
20 giu 2014 13:35:44
Mostra i restanti 1 commenti
1

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

Grazie, grazie grazie grazie mille!!!!

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

Dove 0 è l'ID della categoria esclusa

21 dic 2022 08:57:30