检查循环是否有任何类别?

时间:2016-07-25 作者:Gregory Schultz

在我的循环中,我有十篇帖子,它们分别属于以下类别(slug):group-a、group-a-first和group-b。循环/查询如下所示:

查看这些帖子是否有特定类别的最佳方法是什么?

我试过了<?php if(in_category(\'group-a\')) ;?>, 它确实有效,但它检查了每个帖子,所以我得到了三个结果:是、否、否等。

我要寻找的是,如果循环中的任何帖子都有特定的类别,它会输出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>
谢谢你,

3 个回复
最合适的回答,由SO网友:Andy Macaulay-Brook 整理而成

您只需运行循环并设置一个标志:

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没有直接关系。

SO网友:Fencer04

您可以创建一个单独的函数来检查您的帖子数组是否包含具有该类别的帖子。它将基本上完成您现在的工作,但它允许您调用函数一次,而不是每次通过循环。您可以将此代码放入函数中。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(); ?>

SO网友:Muhammad Junaid Bhatti

is_category() 测试以查看是否显示类别存档,但显示的是单个帖子,因此这将始终返回false

in_category() 测试以查看给定帖子是否在该特定类别中具有类别,并且必须在中使用The Loop, 但在进入循环之前,您正试图弄清楚类别是什么。

<小时>

if ( is_single() ) {
    $cats = wp_get_post_categories($posts[0]->ID);
    $first_cat = \'\';
    if ($cats) {
        $first_cat = $cats[0];
    }
    if ($first_cat == 7 ) {
        include \'wp-loop2.php\';
    } else {
        include \'wp-loop.php\';
    }
}

相关推荐

将wp_Query替换为wp_User_Query

我在插件中制作了一些订阅者档案和单曲(个人资料页),其中我还包括了一个“用户单曲”模板,通过template_include. 不过,我正在尝试从插件中删除一些模板,以使其使用主题模板。我用了locate_template( \'single.php\' ) 从活动主题中选择单个模板。我没有使用全局wp_query 在本例中显示我的内容,但页面显示了基于查询默认值的循环(十篇帖子)。我想知道的是,我是否可以完全放弃默认查询,用wp_user_query 我可以将查询到的用户ID输入其中。然后我想筛选the