it-swarm.com.de

Wie zeige ich ähnliche Beiträge aus unterschiedlichen Kategorien an?

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

7
BBee

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();
}
18
Michael

Hier noch eine saubere und sehr flexible Möglichkeit:

Fügen Sie diesen Code in Ihre functions.php-Datei 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:

<?php example_cats_related_post() ?>

Möglicherweise möchten Sie die Listenelemente entfernen oder entsprechend Ihren Anforderungen formatieren.

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

0
Lawrence Oputa

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

Wenn zum Beispiel ein Artikel 3 Tags hat und es einen anderen Artikel gibt, der genau die gleichen 3 Tags hat, sollte er oben in der Liste stehen. Die sekundäre Sortierung sollte nach dem Postdatum 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;

}

Bei der inneren Abfrage wird der Inhalt mit den am besten übereinstimmenden Tags ausgewählt, und bei der äußeren Abfrage wird nur die sekundäre Sortierung nach dem Postdatum angewendet.

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

0
Felix Eve