Zeigen Sie Beiträge aus derselben Kategorie über den Link zum nächsten / vorherigen Beitrag an

7

Ich verwende diesen Code, aber sobald ich auf den Link zum nächsten Beitrag / vorherigen Beitrag klicke, werde ich zum nächsten Beitrag / vorherigen Beitrag einer anderen Kategorie weitergeleitet.

 previous_post_link( '%link', 'Prev post in category', $in_same_term = true );
 next_post_link( '%link', 'Next post in category', $in_same_term = true );

Ich versuche, mein Problem mithilfe dieses Artikels zu beheben .

Hier ist der Code, den ich für Beiträge und Kategorien verwende, und ich verwende keine benutzerdefinierten Beitragstypen und -kategorien:

$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', 'Prev post in category', $in_same_term = true );
next_post_link( '%link', 'Next post in category', $in_same_term = true );

Im Grunde werden alle Beiträge basierend auf der Kategorie abgerufen, und jetzt möchte ich, dass der Link zum nächsten Beitrag / vorherigen Beitrag nur für diese bestimmte Kategorie funktioniert.

user54318
quelle
Verwenden Sie den Code in single.php
Pieter Goosen
Für welchen Beitrag möchten Sie die Links zum vorherigen / nächsten Beitrag anzeigen? Für den letzten Beitrag im $postsArray aus dem von Ihnen angegebenen Code oder aus dem Hauptbeitrag auf der aktuellen Seite?
Engelen
@pieter Goosen: Ja, ich benutze den Code in single.php
user54318
@engelen Ich zeige alle Beiträge in Bezug auf die Kategorie auf der aktuellen Seite und jetzt möchte ich, dass die nächsten und vorherigen Links nur auf die aktuelle Kategorie beschränkt sind
user54318
Okay, was für eine Seite ist das? Eine einzelne Beitragsseite, ein Kategoriearchiv, ..?
Engelen

Antworten:

18

Hier ist der Code, um kategoriebasierte vorherige und nächste Links zu Posts zu erhalten:

<?php
$post_id = $post->ID; // current post ID
$cat = get_the_category(); 
$current_cat_id = $cat[0]->cat_ID; // current category ID 

$args = array( 
    'category' => $current_cat_id,
    'orderby'  => 'post_date',
    'order'    => 'DESC'
);
$posts = get_posts( $args );
// get IDs of posts retrieved from get_posts
$ids = array();
foreach ( $posts as $thepost ) {
    $ids[] = $thepost->ID;
}
// get and echo previous and next post in the same category
$thisindex = array_search( $post_id, $ids );
$previd    = isset( $ids[ $thisindex - 1 ] ) ? $ids[ $thisindex - 1 ] : 0;
$nextid    = isset( $ids[ $thisindex + 1 ] ) ? $ids[ $thisindex + 1 ] : 0;

if ( $previd ) {
    ?><a rel="prev" href="<?php echo get_permalink($previd) ?>">Previous</a><?php
}
if ( $nextid ) {
    ?><a rel="next" href="<?php echo get_permalink($nextid) ?>">Next</a><?php
}
user54318
quelle
+1 Genau das habe ich gesucht. Meine Anforderung bestand darin, über das Feld Bestellung im Feld Seitenattribute bearbeiten zu bestellen. Also habe ich die $ args in geändert $args = array('category'=>$current_cat_id,'orderby'=>'menu_order','order'=> 'ASC');und das hat mein Problem gelöst. Vielen Dank für das Teilen der Lösung!
Devner
Vielen Dank sehr hilfreich für mich
Sumit Kumar Gupta
3

Die Funktionen previous_post_linkund next_post_linkhaben beide fünf Parameter $format:: Formatzeichenfolge für den Link, mit der gesteuert wird, was vor und nach dem Link kommt
$link: Linktext , der angezeigt werden soll
$in_same_term: Gibt an, ob der nächste / vorherige Beitrag denselben Taxonomiebegriff wie der aktuelle Beitrag haben muss
$excluded_terms: Begriffe von denen Beiträge ausgeschlossen werden sollen $taxonomy: Die Taxonomie, die verwendet werden soll, wenn sie $in_same_termwahr ist Wie Sie sehen, macht der $in_same_termParameter genau das, was Sie benötigen. Sie verwenden es jedoch nicht richtig in Ihrem Beispielcode. Sie übergeben tatsächlich das Ergebnis der Zuweisung truezu einer Variablen $in_same_term. Dies funktioniert nicht: Das Übergeben eines Arguments ist so einfach wie das Übergeben eines Werts:

previous_post_link( '%link', 'Prev post in category', true );
next_post_link( '%link', 'Next post in category', true );

Edit: (bearbeitet nach OP seine Frage aktualisiert) Das Problem ist , dass previous_post_linkund next_post_linkdie globale Post - Objekt verwenden, die du bist überschrieben. Um dies zu verhindern, verwenden Sie einen anderen Variablennamen in Ihrem $posts-loop, wie $singlepost:

foreach ( $posts as $singlepost ) {
    echo $singlepost->post_content
}

Auf diese Weise $postbleibt das globale Objekt erhalten. Alternativ können Sie das globale Post-Objekt in einer temporären Variablen speichern und $postspäter erneut zurücksetzen. Dies ist jedoch nur dann wirklich erforderlich, wenn Sie aufrufen setup_postdata(was Sie nicht sind).

engelen
quelle
Danke für die schnelle Antwort. Ich bekomme immer noch das gleiche Ergebnis.
user54318
Sie müssen uns mehr Informationen geben :-). Verwenden Sie einen benutzerdefinierten Beitragstyp oder eine benutzerdefinierte Taxonomie oder einfach "Beiträge" und "Kategorien"? Gibt es irgendwo einen Ort, an dem wir sehen können, was tatsächlich schief läuft?
Engelen
Ich habe meine Frage aktualisiert
user54318
Ich habe meine Antwort entsprechend aktualisiert.
Engelen
1

Ihr Code macht für mich keinen Sinn, abgesehen von einem Syntaxfehler. Wenn Sie auf einen Beitrag auf einer Post- / Blog-Seite klicken, gelangen Sie in der aktuellen Ansicht Ihres Posts zur Einzelansicht des Posts. Nur dieser Beitrag wird auf single.php angezeigt.

Das Problem beginnt, wenn Sie auf die Post-Links klicken, unabhängig davon, ob es sich um den vorherigen oder den nächsten Post-Link handelt. Was zurückgegeben wird, sind alle Beiträge in dieser bestimmten Kategorie, wenn die nächste / vorherige Seite geladen wird. Auf diese Weise haben Sie Ihre single.php codiert und warum Ihre Post-Links nicht so funktionieren, wie Sie es erwarten.

Ich würde nicht verwenden, get_posts()um meine Schleife auf der single.php-Seite einzurichten. Ich würde nur die normale richtige Schleife verwenden. Bitte lesen Sie diese Seite im Codex über Theme Development

Hier ist ein Beispiel für eine single.php, die wie erwartet funktioniert

<?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
                // Start the Loop.
                while ( have_posts() ) : the_post(); ?>

            <?php
                    get_template_part( 'content', get_post_format() );

                    // Previous/next post navigation.
                    previous_post_link( '%link', 'Prev post in category', true );
                    next_post_link( '%link', 'Next post in category', true );

                    // If comments are open or we have at least one comment, load up the comment template.
                    if ( comments_open() || get_comments_number() ) {
                        comments_template();
                    }
                endwhile;
            ?>
        </div><!-- #content -->
    </div><!-- #primary -->

<?php get_sidebar( 'content' ); ?>
</div><!-- #main-content -->

<?php
get_footer();

Wie in der anderen Antwort erwähnt, lesen Sie, wie Sie das next_post_linkund das verwendenprevious_post_link

Pieter Goosen
quelle
Vielen Dank für Ihre Antwort können Sie mir sagen, wo der Syntaxfehler in meinem Code ist
user54318
In dieser Zeile echo $post->post_contentvergessen;
Pieter Goosen
Oh ja, habe es verstanden :)
user54318
Bitte setzen Sie debug in wp-config auf true. Dies sollte Ihnen sehr helfen
Pieter Goosen
Sie sollten versuchen, was ich gesagt habe, Ihr Code kann nicht funktionieren, mit Ihrem Code, wie er ist, wird er einfach immer wieder dieselbe Seite mit den Post-Links neu laden
Pieter Goosen
0

Ich hatte das gleiche Problem und ich brauchte all das für den benutzerdefinierten Beitragstyp und die benutzerdefinierte Taxonomie. user54318 hat mich in die richtige Richtung gelenkt, in der keine cpt-Dateien ausgeführt werden können. Daher werde ich meine Ergebnisse auch hier veröffentlichen:

//get custom taxonomies.
$terms = wp_get_post_terms( get_the_ID(), 'product_cat' ); //last argument is the custom taxonomy. change to desired tax
//run through all terms and filter out the one, that i need. 
$stay_in = array();
foreach( $terms as $term ) :
/*this loop looks for a category, that is a children of category id 37. change to your needs. 
only importance is to build an array of term ids, to be included in the previous/next behaviour, so if you already know your ids, you could also use something like $stay_in = array( 43 ); and skip this whole loop..*/
    if ( $term->parent == 37 ) :
        $stay_in[] = $term->term_id;
        break; //break out the foreach, if found.
    endif;
endforeach;
//get all post ids, that are in my defined category
$args = array(
    'post_type'         => 'product', //custom post type
    'posts_per_page'    => -1,
    'tax_query'         => array(
        array(
            'taxonomy'  => 'product_cat', // custom taxonomy
            'field'     => 'term_id',
            'terms'     => $stay_in,
            'operator'  => 'IN', //change to your needs.. IN, NOT IN, AND, EXISTS, NOT EXISTS
        )
    ),
    'orderby'           => 'post_date',
    'order'             => 'ASC',
    'fields'            => 'ids', //only return the post ids, not the whole post-objects
);
$all_posts = new WP_Query( $args );
//search for the current post by its id and look for the previous / next ids
$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 ];
//echo links, if prevoius/next exists
if ( ! empty( $prev_id ) ) :
    echo '<a rel="prev" href="' . get_permalink( $prev_id ) . '">' . __( 'previous', 'your_theme_text_domain' ) . '</a>';
endif;

if ( ! empty( $next_id ) ) :
    echo '<a rel="next" href="' . get_permalink( $next_id ) . '">' . __( 'next', 'your_theme_text_domain' ) . '</a>';
endif;
wp_reset_postdata();
honk31
quelle