是否可以修改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\'
)
);
});
对首页的全局查询没有影响。
最合适的回答,由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 );
}
);