web-dev-qa-db-fra.com

Comment afficher les articles liés de la même catégorie?

Est-il possible d'afficher les publications liées de la même catégorie que la publication actuelle?

7
BBee

Une possibilité:

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

Référence:

Réponse réécrite sur la base de 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

Voici une autre option propre et très flexible:

Mettez ce code dans votre fichier functions.php

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;

}

Maintenant, vous pouvez simplement appeler la fonction n’importe où sur votre site en utilisant:

<?php example_cats_related_post() ?>

Vous voudrez peut-être supprimer les éléments de la liste ou les styler selon vos besoins.

* Modifier - vous devez changer ceci: post_not_in à ce post__not_in dans votre requête

0
Lawrence Oputa

Cette réponse garantit que les publications associées sont classées par le nombre de balises correspondantes.

Par exemple, si un article a 3 balises et qu'il y a un autre article qui a exactement les 3 mêmes balises, il devrait apparaître en haut de la liste. Le tri secondaire doit se faire par date d'envoi afin que le contenu plus récent soit privilégié.

/**
 * 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;

}

La requête interne consiste ici à sélectionner le contenu avec les balises les plus correspondantes, puis la requête externe est simplement utilisée pour appliquer un tri secondaire par date de publication.

Notez que cette requête est écrite pour SQL Server; par conséquent, certaines syntaxes peuvent nécessiter une mise à jour (par exemple, TOP vs LIMIT).

0
Felix Eve