Wie werden verwandte Beiträge aus derselben Kategorie angezeigt?


9

Ist es möglich, verwandte Beiträge aus derselben Kategorie wie der aktuelle Beitrag anzuzeigen?

Antworten:


21

Eine Möglichkeit:

$related = get_posts( 
    array( 
        'category__in' => wp_get_post_categories( $post->ID ), 
        'numberposts'  => 5, 
        'post__not_in' => array( $post->ID ) 
    ) 
);

if( $related ) { 
    foreach( $related as $post ) {
        setup_postdata($post);
        /*whatever you want to output*/
    }
    wp_reset_postdata();
}

Referenz:

Antwort neu geschrieben basierend auf WP_Query():

$related = new WP_Query(
    array(
        'category__in'   => wp_get_post_categories( $post->ID ),
        'posts_per_page' => 5,
        'post__not_in'   => array( $post->ID )
    )
);

if( $related->have_posts() ) { 
    while( $related->have_posts() ) { 
        $related->the_post(); 
        /*whatever you want to output*/
    }
    wp_reset_postdata();
}

Seien Sie sehr vorsichtig mit Ihren Variablennamen! Sie verwenden ein globales $postElement, um Ihre Abfrage auszuführen, und definieren es dann $postim selben Kontext innerhalb Ihrer foreachSchleife neu.
EAMann

@EAMann - Sie haben im Allgemeinen Recht - aber meiner Erfahrung nach liefert die Verwendung setup_postdata()mit etwas anderem als beispielsweise $postnicht die richtige Ausgabe the_title(). wp_reset_postdata()sollte theoretisch dafür sorgen, dass $ post zurückgesetzt wird.
Michael

1
Das liegt daran, dass sich setup_postdata()selbst $postals global verweist . Anstatt zu verwenden get_posts(), sollten Sie eine benutzerdefinierte Instanz von definierenWP_Query und diese verwenden, um Ihre Beiträge abzurufen. Es wird die Post-Daten für Sie einrichten und the_title()et al. So arbeiten lassen, wie sie es sollen.
EAMann

@ EAMann Dies ist ein ziemlich alter Beitrag, aber es wäre dankbar, wenn Sie eine Antwort schreiben könnten, wie man das mit der benutzerdefinierten Abfrage und allem richtig macht
GiantCowFilms

0

Diese Antwort stellt sicher, dass verwandte Beiträge nach der Anzahl der übereinstimmenden Tags sortiert sind.

Wenn ein Artikel beispielsweise 3 Tags enthält und es einen anderen Artikel mit genau denselben 3 Tags gibt, sollte er oben in der Liste angezeigt werden. Die sekundäre Sortierung sollte nach dem Post-Datum erfolgen, damit neuere Inhalte bevorzugt werden.

/**
 * Select content with common tags.
 * Sort so content with multiple matching tags are at the top.
 * Secondary sort on most recent content first.
 *
 * @param $post_id
 * @param int $limit
 * @return array
 */
function related_posts($post_id, $limit = 5) {

    global $wpdb;

    $query  = "SELECT TOP %d x.object_id as ID
FROM (
SELECT TOP 10 tr1.object_id, COUNT(tr1.term_taxonomy_id) AS common_tag_count
FROM {$wpdb->term_relationships} AS tr1
INNER JOIN {$wpdb->term_relationships} AS tr2 ON tr1.term_taxonomy_id = tr2.term_taxonomy_id
WHERE tr2.object_id = %d
GROUP BY tr1.object_id
HAVING tr1.object_id != %d
ORDER BY COUNT(tr1.term_taxonomy_id) DESC
) x
INNER JOIN {$wpdb->posts} p ON p.ID = x.object_id
ORDER BY common_tag_count DESC, p.post_date DESC;";

    $query = $wpdb->prepare($query, $limit, $post_id, $post_id);
    $ids = $wpdb->get_col($query);
    $posts = [];
    foreach($ids as $id)  {
        $posts[] = get_post($id);
    }

    return $posts;

}

Die innere Abfrage besteht hier darin, den Inhalt mit den am besten passenden Tags auszuwählen, und die äußere Abfrage wird nur verwendet, um die sekundäre Sortierung nach dem Veröffentlichungsdatum anzuwenden.

Beachten Sie, dass diese Abfrage für SQL Server geschrieben wurde, sodass einige Syntax möglicherweise aktualisiert werden muss (z. B. TOP vs LIMIT).


0

Hier noch eine saubere und sehr flexible Option:

Fügen Sie diesen Code in Ihre Datei functions.php ein

function example_cats_related_post() {

    $post_id = get_the_ID();
    $cat_ids = array();
    $categories = get_the_category( $post_id );

    if(!empty($categories) && is_wp_error($categories)):
        foreach ($categories as $category):
            array_push($cat_ids, $category->term_id);
        endforeach;
    endif;

    $current_post_type = get_post_type($post_id);
    $query_args = array( 

        'category__in'   => $cat_ids,
        'post_type'      => $current_post_type,
        'post__not_in'    => array($post_id),
        'posts_per_page'  => '3'


     );

    $related_cats_post = new WP_Query( $query_args );

    if($related_cats_post->have_posts()):
         while($related_cats_post->have_posts()): $related_cats_post->the_post(); ?>
            <ul>
                <li>
                    <a href="<?php the_permalink(); ?>">
                        <?php the_title(); ?>
                    </a>
                    <?php the_content(); ?>
                </li>
            </ul>
        <?php endwhile;

        // Restore original Post Data
        wp_reset_postdata();
     endif;

}

Jetzt können Sie die Funktion einfach überall auf Ihrer Site aufrufen, indem Sie:

<?php example_cats_related_post() ?>

Möglicherweise möchten Sie die Listenelemente entfernen oder nach Bedarf formatieren.

* Bearbeiten - Sie können dies ändern: post_not_in zu diesem post__not_in in Ihrer Abfrage


Es wird nur ein Beitrag angezeigt. Ist es möglich, alle Beiträge derselben Kategorie auf einer Kategorieseite anzuzeigen?
Rahul

0

Mit diesem Code können Sie verwandte Beiträge aus derselben Kategorie abrufen

$args = array(
                'category__in' => wp_get_post_categories( get_queried_object_id() ),
                'posts_per_page' => 5,
                'orderby'       => 'rand',
                'post__not_in' => array( get_queried_object_id() )
                );
    $the_query = new WP_Query( $args );

    if ( $the_query->have_posts() ) : ?>

        <ul class="">
        <!-- the loop -->
        <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

            <li>
                <h6>
                    <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                    </a>
                </h6>
            </li>

        <?php endwhile; ?>
        <!-- end of the loop -->
        </ul>

        <?php wp_reset_postdata(); ?>

     <?php endif; ?>

und verwenden Sie diesen Code, um verwandte Beiträge von denselben Tags abzurufen

$tags = wp_get_post_terms( get_queried_object_id(), 'post_tag', ['fields' => 'ids'] );
    $args = [
        'post__not_in'        => array( get_queried_object_id() ),
        'posts_per_page'      => 5,
        'orderby'             => 'rand',
        'tax_query' => [
            [
                'taxonomy' => 'post_tag',
                'terms'    => $tags
            ]
        ]
    ];
    $the_query = new WP_Query( $args );
    if ( $the_query->have_posts() ) : ?>

        <ul class="">
        <!-- the loop -->
        <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

            <li>
                <h6>
                    <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                    </a>
                </h6>
            </li>

        <?php endwhile; ?>
        <!-- end of the loop -->
        </ul>

        <?php wp_reset_postdata(); ?>

    <?php endif; ?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.