web-dev-qa-db-fra.com

Éviter les doublons après la même taxonomie

J'ai ceci pour récupérer une liste de messages dactylographiés nommés " fonctionne " en fonction d'une taxonomie appelée " works_year ".

Si je sélectionne plus d'une valeur de cette taxonomie (works_year), cette publication est dupliquée sur ma page d'accueil.

Puis-je éviter cela?

$years_loop = get_terms(
    array(
        'taxonomy'  => 'works_year',
        'orderby'   => 'slug',
        'order'     => 'DESC',
    )
);
foreach($years_loop as $year_loop_slug) :

$args = array(
    'post_type'       => 'works',
    'posts_per_page'  => -1,
    'tax_query'       => array(
        array(
            'taxonomy'  => 'works_year',
            'field'     => 'slug',
            'terms'     => array( $year_loop_slug->slug ),
            'operator'  => 'IN'
        )
    ),
);

$loop = new WP_Query($args);
while ($loop->have_posts()) : $loop->the_post();

//Show the Post
1
cbtr

Je vois deux façons de s'y prendre, les deux très similaires.

A) Vous pouvez collecter les identifiants des publications affichées dans un tableau, puis exclure ceux avec le paramètre de requête post__not_in comme suit:

$years_loop = get_terms(
    array(
        'taxonomy'  => 'works_year',
        'orderby'   => 'slug',
        'order'     => 'DESC',
        )
);

// array for displayed posts, we will update it with every loop
$displayed = [];

foreach($years_loop as $year_loop_slug) :
    $args = array(
        'post_type'       => 'works',
        'posts_per_page'  => -1,
        'post__not_in'    => array_unique( $displayed ),
        'tax_query'       => array(
            array(
                'taxonomy'  => 'works_year',
                'field'     => 'slug',
                'terms'     => array( $year_loop_slug->slug ),
                'operator'  => 'IN',
            )
        ),
    );
    $loop = new WP_Query($args);
    while ($loop->have_posts()) : $loop->the_post();

        // update array with currently displayed post ID
        $displayed[] = get_the_ID();

        //your output

    endwhile;
endforeach;

B) Si vous souhaitez éviter d'utiliser le paramètre post__not_in, qui peut avoir un impact négatif sur les performances de votre site, vous pouvez rechercher les doublons dans vos boucles:

$years_loop = get_terms(
    array(
        'taxonomy'  => 'works_year',
        'orderby'   => 'slug',
        'order'     => 'DESC',
        )
);

// array for displayed posts, we will update it with every loop
$displayed = [];

foreach($years_loop as $year_loop_slug) :
    $args = array(
        'post_type'       => 'works',
        'posts_per_page'  => -1,
        'tax_query'       => array(
            array(
                'taxonomy'  => 'works_year',
                'field'     => 'slug',
                'terms'     => array( $year_loop_slug->slug ),
                'operator'  => 'IN',
            )
        ),
    );

    $loop = new WP_Query($args);
    while ($loop->have_posts()) : $loop->the_post();
        // if the current post was already displayed, move on to the next iteration of this loop
        if ( in_array( get_the_ID(), $displayed ) ){
            continue;
        }
        // update array with currently displayed post ID
        $displayed[] = get_the_ID();

        //your output

    endwhile;
endforeach;

Code non testé, mais vous avez l'idée.

1
Levi Dulstein