web-dev-qa-db-ja.com

ループにカテゴリがあるかどうかを確認しますか?

私のループでは、私は以下のカテゴリー(スラッグ)を持つ10の投稿を持っています:グループ-a、グループ-a-firstおよびグループ-b。ループ/クエリは次のようになります。

  • 投稿(グループa)
  • 投稿(グループb)
  • 投稿(グループファースト)

それらの投稿に特定のカテゴリがあるかどうかを確認するための最良の方法は何ですか?

私は<?php if(in_category('group-a')) ;?>を試しました、それは動作しますが、それは私が3つの結果を出すようにすべての投稿をチェックします:はい、いいえ、いいえなど。

ループ内の投稿に特定のカテゴリがある場合に探しているのは、yesまたはnoのいずれかです。

私のクエリは複数のループを持っているので、これは私が使っているコードです:

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

ありがとう、

1
Gregory Schultz

ループを実行してフラグを設定するだけです。

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

条件付きチェックを追加しました。これはすべてPHPであるため、コメント内の開始タグと終了タグは不要です。それは入れ子になった条件文のすべてのケースに適合し、読むことが本当に明確であるので、私は中括弧記法を好む。最後に、等価性をテストするには二重等号が必要です。 =は代入演算子なので、if ( $any_in_cat = true )と言うと$any_in_cattrueに設定していることになり、条件も常にtrueになります。あなたが代入の成功をテストしているので、if ( $any_in_cat = false )でさえtrueです。 if( true == $any_in_cat )として条件を書く習慣があるなら、それは私たち全員が行うスリップであり、デバッグするのがより簡単です。そして、あなたがスリップして=を使うとtrueに代入できないのでエラーメッセージが出ます。

ループを数回再実行しているので、コードをいくらか単純化することも可能かもしれませんが、それは別の問題であり、直接WPに関連するものではありません。

1

投稿の配列にそのカテゴリの投稿が含まれているかどうかを確認するための別の関数を作成できます。それは基本的にあなたが今いることをするでしょうが、それはあなたがループを通して毎回ではなく一度関数を呼ぶことを可能にするでしょう。このコードをfunctions.phpファイルに入れます。

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

こうすれば、ループ内でこの関数を呼び出すことができます。

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