web-dev-qa-db-fra.com

Afficher les articles liés par catégorie mais ignorer une catégorie

Je voudrais afficher 4 articles liés (sans plugin) au bas de mon blog. Cependant, je veux exclure une certaine catégorie.

Par exemple, si mon article de blog appartient aux catégories 2 et 3, je souhaite ignorer la catégorie 2 et rechercher uniquement les articles de blog de la catégorie 3. Voici la partie pertinente de single.php:

Remarque: mon code ci-dessous ne fonctionne pas.

$related = get_posts( array(
    'category__in'  => wp_get_post_categories( $post->ID ),
    'numberposts'   => 4,
    'orderby'       => 'date',
    'post__not_in'  => array( $post->ID ),
    'cat'           => '-2'
) );

if( $related ) { 
    foreach( $related as $post ) {
        setup_postdata($post);
         /** .. **/
    }
}

Mise à jour: La catégorie 2 est tellement répandue que je veux l'ignorer dans la recherche, mais ne pas masquer ces résultats.

Par exemple, cet article est dans les catégories 2 et 3. Je veux trouver d'autres articles avec la catégorie 3, et peut-être qu'ils ont la catégorie 2, mais je veux seulement faire une recherche par catégorie 3.

Update 2: J'ai ce code ci-dessous et je crois qu'il fonctionne maintenant correctement:

$cat_ids = get_the_category();
if( ! empty( $cat_ids ) ) {
    $post_cat_ids = array();
    foreach( $cat_ids as $cat_id ) {
        if( $cat_id->cat_ID != 2 ) {
            $post_cat_ids[] = $cat_id->cat_ID;
        }
    }
}

$related = get_posts( array(
    'category__in' => wp_get_post_categories( $post->ID ),
    'numberposts' => 4,
    'orderby' => 'date',
    'exclude' => array( $post->ID ),
    'category' => $post_cat_ids
    ) );
4
Austin

Ce que je pourrais comprendre de votre question est:

  1. Vous voulez ignorer une catégorie (peut-être plus) dans la requête de publication associée.

  2. Toutefois, vous ne souhaitez pas exclure les publications de cette catégorie (au cas où une publication appartiendrait à cette catégorie, mais appartiendrait également à une autre catégorie que vous souhaitez rechercher).

Sur la base de l'hypothèse ci-dessus, vous pouvez utiliser le code suivant (des explications sont fournies dans le commentaire dans le code):

    // set the category ID (or multiple category IDs)
    // you want to ignore in the following array
    $cats_to_ignore = array( 2 );
    $categories = wp_get_post_categories( get_the_ID() );
    $category_in = array_diff( $categories, $cats_to_ignore );
    // ignore only if we have any category left after ignoring
    if( count( $category_in ) == 0 ) {
        $category_in = $categories;
    }
    $cat_args = array(
        'category__in'   => $category_in,
        'posts_per_page' => 4,
        'orderby'        => 'date',
        'post__not_in'   => array( get_the_ID() )
        );
    $cat_query = new WP_Query( $cat_args );
    while ( $cat_query->have_posts() ) : $cat_query->the_post();
        /* just example markup for related posts */
        echo '<h2><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></h2>';
    endwhile;
    // reset $post after custom loop ends (if you need the main loop after this point)
    wp_reset_postdata();

Vous ne pouvez pas utiliser 'cat' => '-2' ou 'category__not_in' => array(2) car cela exclura tous les messages de la catégorie 2, même si ces messages comportent également d'autres catégories. Donc, au lieu d’exclure, j’ai ignoré la catégorie 2 dans la requête avec ce CODE: array_diff( $categories, $cats_to_ignore );.

Remarque: J'ai utilisé WP_Query au lieu de get_posts() car l'itération avec WP_Query ressemble davantage à la boucle d'origine. Mais bien sûr, vous pouvez également utiliser la fonction get_posts(), qui appelle de toute façon WP_Query en interne.

2
Fayaz

Donnez-lui un paramètre go to category__not_in:

$related = get_posts( array(
    'numberposts'   => 4,
    'orderby'       => 'date',
    'category__in'  => wp_get_post_categories( $post->ID ),
    'category__not_in' => array(2);
) );

Ça devrait marcher.

Référence: https://codex.wordpress.org/Class_Reference/WP_Query#Category_Parameters

1
Rahul Arora
$cat_ids = get_the_category();

if( ! empty( $cat_ids ) ) {
    $post_cat_ids = array();

    foreach( $cat_ids as $cat_id ) {
        if( 2 != $cat_id->cat_ID ) {
            $post_cat_ids[] = $cat_id->cat_ID;
        }
    }
}

$related = get_posts( array(
    'category__in'  => wp_get_post_categories( $post->ID ),
    'numberposts'   => 4,
    'orderby'       => 'date',
    'exclude'       => array( $post->ID ),
    'category'      => $post_cat_ids
) );
0
Austin