有属于多个类别的帖子,从主页中排除一些类别

时间:2014-08-10 作者:Megan Taylor

所以我有A、B、C和D类,还有1、2、3和4类。我的帖子可以属于这四个类别中的任何一个。但是我想从主页中排除B、4和D类中的任何内容(并且只从主页中排除),即使它们也在其他类别中。

我已经尝试了几个小时的插件、自定义代码和谷歌搜索,但我就是不能让它工作。最后一批尝试是对以下内容的修改:

 <?php $query = new WP_Query( \'cat=-32,-99\' ); ?>
 <?php if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?>
 <?php if (! in_category (\'-32\')); ?>
 <?php x_get_view( \'ethos\', \'content\', get_post_format() ); ?>
 <?php endif; ?>
 <?php endwhile; 
 wp_reset_postdata();
 else : ?>
 <p><?php _e( \'Sorry, no posts matched your criteria.\' ); ?></p>
 <?php endif; ?>
欢迎提出任何建议。

1 个回复
SO网友:Tom J Nowell

你的问题是你的疑问,但在我讨论这个问题之前,有一些担忧阻碍了你看到这个问题。

首先,每条线都有。这就像在电话交谈中,在每句话的末尾挂断电话,再拨一次号码,打字和阅读要费劲得多。因此,让我们来解决这个问题:

<?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查询循环,从而进一步简化了原始代码

进一步阅读:

结束

相关推荐

wordpress nested loop

我正在构建嵌套循环查询。我有一个元框,可以捕获邮件id(分类器和转发器)。到目前为止,我的代码while ( have_posts() ) : the_post(); ?> <div id=\"<?php echo $post->post_name; ?>\"> <h1><?php the_title(); ?></h1> <?php the_content