web-dev-qa-db-fra.com

Vérifier si la boucle a des catégories?

Dans ma boucle, j'ai dix articles avec les catégories suivantes (slug): groupe-a, groupe-a-premier et groupe-b. La boucle/requête ressemble à ceci:

  • Poste (groupe-a)
  • Poste (groupe-b)
  • Poster (groupe-un-premier)

Quelle est la meilleure façon de vérifier si ces publications ont une catégorie spécifique?

J'ai essayé <?php if(in_category('group-a')) ;?>, ça marche mais il vérifie tous les posts, donc trois résultats: oui, non, non, etc.

Ce que je recherche si une publication de la boucle a une catégorie spécifique, elle affiche un oui ou une non.

Ma requête a plusieurs boucles donc c'est le code que j'utilise:

<?php $args = array('tax_query' => array(array('taxonomy' => 'post-status','field' => 'slug','terms' => array ('post-status-published')))); $query = new WP_Query( $args );?>
    <?php if ( $query->have_posts() ) : $duplicates = []; while ( $query->have_posts() ) : $query->the_post(); ?>

        <?php if ( in_category( 'first-major' ) ) : ?>
            <div class="major"><div class="major-first">
            major and first - <?php the_title();?><br>
            <?php $duplicates[] = get_the_ID(); ?>
</div>
    <?php endif; endwhile; ?>
    <?php $query->rewind_posts(); ?>

        <?php while ( $query->have_posts() ) : $query->the_post(); ?>

        <?php if (( in_category( 'major' ) ) && (!in_category( 'first-major'))) : if ( in_array( get_the_ID(), $duplicates ) ) continue; ?>
            major - <?php the_title(); ?><br>
            <?php $duplicates[] = get_the_ID(); ?>
        <?php endif;?>

    <?php endwhile; ?></div>
    <?php $query->rewind_posts(); ?>  

    <?php while ( $query->have_posts() ) : $query->the_post(); ?>

        <?php if (( in_category( 'major' ) ) && (!in_category( 'first-major'))) : if ( in_array( get_the_ID(), $duplicates ) ) continue; ?>
            major - <?php the_title(); ?><br>
            <?php $duplicates[] = get_the_ID(); ?>
        <?php endif;?>

    <?php endwhile; ?></div>
    <?php $query->rewind_posts(); ?>  

    <?php while ( $query->have_posts() ) : $query->the_post(); ?>

        <?php if ( in_category('group-a')) :?>
            yes
        <?php else :?>
            no
        <?php endif;?>
        <?php if ( in_category( 'group-a-first' ) ) : ?>
            group a and first - <?php the_title(); ?><br>
            <?php $duplicates[] = get_the_ID(); ?>
        <?php endif;?>

    <?php endwhile; ?>
    <?php $query->rewind_posts(); ?>

    <?php while ( $query->have_posts() ) : $query->the_post(); ?>

       <?php if (( in_category( 'group-a' ) ) && (!in_category( 'group-a-first'))) : if ( in_array( get_the_ID(), $duplicates ) ) continue; ?>
            group a - <?php the_title(); ?><br>
            <?php $duplicates[] = get_the_ID(); ?>
        <?php endif;?>

    <?php endwhile; ?>
    <?php $query->rewind_posts(); ?>

    <?php while ( $query->have_posts() ) : $query->the_post(); ?>

        <?php if ( in_category( 'group-b-first' ) ) : ?>
            group b and first - <?php the_title(); ?><br>
            <?php $duplicates[] = get_the_ID(); ?>
        <?php endif;?>

    <?php endwhile; ?>
    <?php $query->rewind_posts(); ?>

    <?php while ( $query->have_posts() ) : $query->the_post(); ?>

        <?php if ( in_array( get_the_ID(), $duplicates ) ) continue; ?>
            <?php the_title();?><br>

    <?php endwhile; wp_reset_postdata(); endif; ?>


</section>

Merci,

1
Gregory Schultz

Vous pouvez simplement parcourir la boucle et définir un drapeau:

if ( $query->have_posts() ) : 

    $any_in_cat = false; 

    while ( $query->have_posts() ) : $query->the_post();

        if ( in_category( 'first-major' ) ) :
            $any_in_cat = true;
        endif; 

    endwhile;

$query->rewind_posts();

/* if $any_in_cat == true at this point then at least one 
   of the posts has the category 'first-major'
*/

if( true == $any_in_cat ) {
    echo 'true';
} else { 
    echo 'false';
}

J'ai ajouté votre chèque conditionnel. Notez que c'est tout PHP, vous ne voulez donc pas les balises d'ouverture et de fermeture où vous les avez dans votre commentaire. Je préfère moi-même la notation d'accolade, car elle convient à tous les cas de conditionnelles imbriquées et est très claire à lire. Enfin, vous avez besoin du signe double égal pour tester l'égalité. = est l'opérateur d'affectation. Ainsi, lorsque vous dites if ( $any_in_cat = true ), vous définissez $any_in_cat sur true et la condition sera toujours true. Même if ( $any_in_cat = false ) est true parce que vous testez le succès de l'affectation. C'est un glissement que nous faisons tous et il est plus facile de déboguer si vous prenez l'habitude d'écrire la condition sous la forme if( true == $any_in_cat ). Si vous glissez et utilisez un seul =, vous obtiendrez un message d'erreur car vous ne pouvez pas affecter true.

Vous ré-exécutez votre boucle plusieurs fois. Il serait donc peut-être possible de simplifier un peu votre code également, mais c’est une autre question qui n’est pas directement liée à WP.

1
Andy Macaulay-Brook

Vous pouvez créer une fonction distincte pour vérifier que votre tableau de publications contient une publication de cette catégorie. Cela fera fondamentalement ce que vous êtes maintenant, mais cela vous permettra d’appeler la fonction une fois au lieu de chaque fois dans la boucle. Vous mettriez ce code dans votre fichier functions.php:

function does_array_contain_category( $categories, $posts ){
    foreach( $posts as $post) {
        if( in_category( $categories, $post ) ){
            return true;
        }
    }
    return false;
}

Vous pouvez ensuite appeler cette fonction dans votre boucle en procédant comme suit:

<?php 
    //$in_group_a will be true or false for use wherever you need it.
    $in_group_a = does_array_contain_category( array( 'group_a' ), $query->get_posts() ); 
    while ( $query->have_posts() ) : $query->the_post(); ?>

    <?php endwhile; ?>
<?php $query->rewind_posts(); ?>
1
Fencer04