在我的循环中,我有十篇帖子,它们分别属于以下类别(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>
谢谢你,
最合适的回答,由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_cat
到
true
而且情况总是
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\';
}
}