web-dev-qa-db-de.com

Überprüfen Sie, ob die Schleife Kategorien hat?

In meiner Schleife habe ich zehn Posts mit den folgenden Kategorien (Slug): Gruppe-a, Gruppe-a-zuerst und Gruppe-b. Die Schleife/Abfrage sieht folgendermaßen aus:

  • Post (Gruppe-A)
  • Post (Gruppe-b)
  • Post (Gruppe-A-First)

Was ist der beste Weg, um zu überprüfen, ob diese Beiträge eine bestimmte Kategorie haben?

Ich habe versucht, <?php if(in_category('group-a')) ;?>, es funktioniert, aber es überprüft jeden Beitrag, so dass ich drei Ergebnisse: ja, nein, nein, etc.

Was ich suche, wenn ein Beitrag in der Schleife eine bestimmte Kategorie hat, gibt es entweder ein Ja oder Nein.

Meine Abfrage hat mehrere Schleifen, daher der verwendete Code:

<?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>

Vielen Dank,

1
Gregory Schultz

Sie können einfach durch die Schleife laufen und ein Flag setzen:

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';
}

Ich habe Ihren Bedingungsscheck hinzugefügt. Beachten Sie, dass alles PHP ist, sodass Sie die öffnenden und schließenden Tags nicht dort verwenden möchten, wo Sie sie in Ihrem Kommentar haben. Ich bevorzuge die Klammernotation selbst, da sie zu jedem Fall von verschachtelten Bedingungen passt und wirklich klar zu lesen ist. Zuletzt benötigen Sie das Doppel-Gleichheitszeichen, um die Gleichheit zu testen. = ist der Zuweisungsoperator. Wenn Sie also if ( $any_in_cat = true ) sagen, setzen Sie $any_in_cat auf true und die Bedingung ist immer true. Sogar if ( $any_in_cat = false ) ist true, weil Sie den Erfolg der Zuweisung testen. Es ist ein Fehler, den wir alle machen und der leichter zu beheben ist, wenn Sie es sich zur Gewohnheit machen, die Bedingung als if( true == $any_in_cat ) zu schreiben. Wenn Sie dann einen einzelnen = verrutschen und verwenden, erhalten Sie eine Fehlermeldung, da Sie keine Zuordnung zu true vornehmen können.

Sie führen Ihre Schleife mehrere Male neu aus, sodass es möglicherweise auch möglich ist, den Code etwas zu vereinfachen, aber das ist eine andere Frage, die nicht direkt mit WP zusammenhängt.

1

Sie können eine separate Funktion erstellen, um zu überprüfen, ob Ihr Post-Array einen Post mit dieser Kategorie enthält. Es wird im Grunde das tun, was Sie jetzt sind, aber es wird Ihnen ermöglichen, die Funktion einmal anstatt jedes Mal durch die Schleife aufzurufen. Sie würden diesen Code in Ihre functions.php-Datei einfügen:

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

Sie können diese Funktion dann in Ihrer Schleife folgendermaßen aufrufen:

<?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