将Tax_Query添加到WP_Query对象

时间:2021-09-09 作者:Alan Storm

是否可以修改WP_Query 要添加的对象tax_query?

也就是说,我可以添加一个tax_query 实例化时WP_Query 对象

$q = new WP_Query(array(
    \'post_type\' => \'post\',
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'post_format\',
            \'field\' => \'slug\',
            \'terms\' => array(
                \'post-format-link\',
            ),
            \'operator\' => \'IN\'
        )
    )
));
上述查询仅返回链接格式的帖子。

但是,如果我已经实例化了WP_Query 对象,我无法设置tax_query. 如果我这样尝试

$q = new WP_Query([\'post_type\'=>\'post\']);
$q->set(\'tax_query\', array(
    array(
        \'taxonomy\' => \'post_format\',
        \'field\' => \'slug\',
        \'terms\' => array(
            \'post-format-link\',
        ),
        \'operator\' => \'IN\'
    )
));
我的查询返回所有帖子类型,而不仅仅是链接帖子。

这可能吗?如果是,我是否使用set 错误,或者是否需要以不同方式设置税务查询?

如果有帮助的话,更大的上下文是我正在尝试更改pre_get_posts 行动挂钩。我已经能够使用pre_get_posts 钩子将类别筛选器添加到查询

    add_action(\'pre_get_posts\', function($query) {
        if(!$query->is_main_query() || is_admin() || !is_front_page()) {
            return;
        }
        $term = get_category_by_slug(\'my-slug\');
        if(!$term || !is_numeric($term->term_id)) {
            return;
        }
        $query->set(\'category__not_in\', $term->term_id);
    });
有了以上内容,我的首页省略了带有my-slug 类别

然而,如果我用tax_query, 首页不限于链接帖子。以下内容

    add_action(\'pre_get_posts\', function($query) {
        if(!$query->is_main_query() || is_admin() || !is_front_page()) {
            return;
        }
        // per an answer below, I\'ve tried things both with and without
        // this next line and have not had luck in getting my tax_query 
        // to apply to the WP_Query
        // $tax_query = $query->get( \'tax_query\', [] );        
        
        $query->set(\'tax_query\',
            array(
                \'taxonomy\' => \'post_format\',
                \'field\' => \'slug\',
                \'terms\' => array(
                    \'post-format-link\',
                ),
                \'operator\' => \'IN\'
            )
        );
    });
对首页的全局查询没有影响。

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

如果您实例化WP_Query 对于参数,如第二个示例中所示,然后立即执行查询,设置新参数不会更改结果。

$q = new WP_Query( [ \'post_type\' => \'post\' ] );

$q->set( \'tax_query\', [] ); // Too late.
如果您实例化WP_Query 没有参数,如下所示:

$q = new WP_Query();
然后直到$q->get_posts() 正在运行。这意味着您可以在创建对象后设置查询变量:

$q = new WP_Query();

$q->set( \'post_type\', \'post\' );
$q->set( \'tax_query\', [] );

$q->get_posts();

while ( $q->have_posts() ) {
    // etc..
}
没有什么特别的tax_query 当涉及到设置这样的参数时。

这个pre_get_posts 钩子在里面开火WP_Query::get_posts(), 在执行查询之前,因此在该挂钩中没有理由不能设置tax_query:

add_action(
    \'pre_get_posts\',
    function( $query ) {
        $query->set( \'tax_query\', [] );
    }
);
有一件事可能会让您感到困惑,那就是任何给定的查询都可能已经有了tax_query, 通过自己设置,可以删除原始查询。解决方法是检索原始查询,然后添加您的查询。

add_action(
    \'pre_get_posts\',
    function( $query ) {
        $tax_query = $query->get( \'tax_query\', [] ); // Make sure we have an array as the default.

        $new_tax_query = [
            [
                \'taxonomy\' => \'post_format\',
                \'field\'    => \'slug\',
                \'operator\' => \'IN\',
                \'terms\'    => [ \'post-format-link\' ],
            ],
            $tax_query,
        ];

        $query->set( \'tax_query\', $new_tax_query );
    }
);

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post