it-swarm.com.de

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

Ich verwende diesen Code, aber sobald ich auf den Link zum nächsten/vorherigen Beitrag klicke, werde ich zum nächsten/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 mit diesem Artikel zu beheben.

Hier ist der Code, den ich für Posts und Kategorien verwende, und ich verwende keine benutzerdefinierten Posttypen 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.

7
user54318

Hier ist der Code, um kategoriebasierte vorherige und nächste Links zu Beiträgen 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
}
16
user54318

Die Funktionen previous_post_link und next_post_link haben beide fünf Parameter: $format: Formatzeichenfolge für den Link, mit der gesteuert wird, was vor und nach dem Link kommt
$link: Anzuzeigender Link-Text
$in_same_term: Gibt an, ob der nächste/vorherige Beitrag denselben Taxonomiebegriff haben muss wie der aktuelle Beitrag
$excluded_terms: Begriffe zum Ausschließen von Beiträgen. $taxonomy: Die Taxonomie, die verwendet werden soll, wenn $in_same_term wahr ist. Wie Sie sehen, entspricht der Parameter $in_same_term genau Ihren Anforderungen. Sie verwenden es jedoch nicht korrekt in Ihrem Beispielcode. Sie übergeben das Ergebnis der Zuweisung von true zu 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 );

Bearbeiten: (bearbeitet, nachdem OP seine Frage aktualisiert hat) Das Problem ist, dass previous_post_link und next_post_link das globale Post-Objekt verwenden, das Sie überschreiben. Um dies zu verhindern, verwenden Sie einen anderen Variablennamen in Ihrer $posts- Schleife, z. B. $singlepost:

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

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

3
engelen

Ihr Code macht für mich keinen Sinn, abgesehen von einem Syntaxfehler. Wenn Sie in Ihrem Code auf einen Beitrag von einer Beitrags-/Blogseite aus klicken, werden Sie wie vorgesehen zur Einzelansicht des Beitrags weitergeleitet. Nur dieser Beitrag wird auf single.php angezeigt.

Das Problem beginnt, wenn Sie auf die Post-Links klicken. Dabei spielt es keine Rolle, 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. So hast du deine single.php codiert und warum deine Post-Links nicht so funktionieren, wie du es erwartet hast.

Ich würde get_posts() nicht verwenden, um meine Schleife auf der single.php-Seite einzurichten. Ich würde einfach 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 den next_post_link und den previous_post_link verwenden.

1
Pieter Goosen

Ich hatte das gleiche Problem und benötigte all das für den benutzerdefinierten Beitragstyp und die benutzerdefinierte Taxonomie. user54318 wies mich in die richtige Richtung, die nicht in der Lage ist, cpt's auszuführen, also teile ich meine Ergebnisse auch hier:

//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();
0
honk31