你的问题是你的疑问,但在我讨论这个问题之前,有一些担忧阻碍了你看到这个问题。
首先,每条线都有。这就像在电话交谈中,在每句话的末尾挂断电话,再拨一次号码,打字和阅读要费劲得多。因此,让我们来解决这个问题:
<?php
$query = new WP_Query( \'cat=-32,-99\' );
if ( $query->have_posts() ) :
while ( $query->have_posts() ) :
$query->the_post();
if (! in_category (\'-32\')) ;
x_get_view( \'ethos\', \'content\', get_post_format() );
endif;
endwhile;
wp_reset_postdata();
else :
?> <p><?php _e( \'Sorry, no posts matched your criteria.\' ); ?></p><?php
endif;
这更容易阅读,并揭示了一个您不知道的新bug。您一直在这里使用速记语法:
if (! in_category (\'-32\')) ;
x_get_view( \'ethos\', \'content\', get_post_format() );
endif;
但是请注意if语句有一个
;
不是一个
:
? 其计算结果为:
if ( ! in_category( \'-32\' ) ) {
// do nothing
}
x_get_view( \'ethos\', \'content\', get_post_format() );// this always happens
你也可以通过
-32
而不是
\'-32\'
进入
in_category
. 我强烈建议使用
if () {}
语法,因为它更广泛,在工具和编辑器中得到更好的支持,并且更容易键入。不要为自己做额外的工作。
你还要检查帖子是否在类别内-32
, 你的意思是对照32
?
继续讨论您的原始问题:
$query = new WP_Query( \'cat=-32,-99\' );
在这里
cat
正在使用,但这不是定义它的最佳方式,而且从技术上讲
cat
应采用单个参数。而是这样定义:
$query = new WP_Query( array(
\'category__not_in\' => array( 32, 99 )
) );
我最后关心的是,您已经对类别术语的ID进行了硬编码。如果您尝试过导入/导出,那么这段代码将非常失败。这是一个糟糕的幻数案例
相反,可以使用Slug类别:
$example_term = get_term_by( \'name\', \'example1\', \'category\' );
$example_term_2 = get_term_by( \'name\', \'example2\', \'category\' );
$query = new WP_Query( array(
\'category__not_in\' => array( $example_term->term_id, $example_term_2->term_id )
) );
虽然类别段塞/名称仍然很糟糕,但它们比类别术语ID更具可移植性和健壮性。理想情况下,您可以从选项值或后元值中提取这些值。
最后一个也是最重要的问题是,所有这些都与这样做完全相同:
query_posts( array(
\'category__not_in\' => array( 32, 99 )
) );
你已经放弃了WordPress所做的所有工作,然后你自己又做了一次。相反,您应该使用
pre_get_posts
过滤,告诉WordPress您真正想要什么,将其全部整合在一起,为我们提供:
add_filter( \'pre_get_posts\', function ( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$example_term = get_term_by( \'name\', \'example1\', \'category\' );
$example_term_2 = get_term_by( \'name\', \'example2\', \'category\' );
$query->set( \'category__not_in\', $example_term->term_id, $example_term_2->term_id );
}
});
这允许您使用主循环而不是自定义WP\\U查询循环,从而进一步简化了原始代码
进一步阅读: