我正在尝试筛选archive\\u research。php仅显示status=current的研究。
在函数中。php:
add_action( \'pre_get_posts\', \'only_current\' );
function only_current( $query ) {
if ( $query->is_main_query() ) {
$args = array(
\'post_type\' => \'research\',
\'tax_query\' => array(
array(
\'taxonomy\' => \'status\',
\'field\' => \'slug\',
\'terms\' => \'current\',
),
),
);
$query = new WP_Query( $args );
}
}
在档案研究中。php:
// theloop
if ( have_posts() ) : while ( have_posts() ) : the_post();
// print title etc
结果:研究档案显示所有研究。
我试过对这个做许多细微的改动。为了便于阅读,我将尝试在这里总结它们,而不粘贴一堆冗余代码:
删除tax\\u查询。。相同的结果(预期)
将tax\\u查询更改为不存在的分类术语。。相同的结果更换$query = new WP_Query( $args )
具有$query->set(\'meta_query\', $args)
或$query->set($args)
.. 相同的结果更换have_posts()
和the_post()
在存档研究中$wp_query->have_posts()
和$wp_query->the_post()
.. 相同的结果将调用添加到do_action(\'only_current\')
之前// theloop
.. 同样的结果,所以这里的共同主题是,无论我做什么,我都会得到同样的结果。一定有一个非常明显的解决方案,我没有找到,如果有人能指出这一点,我将不胜感激。可能有用的最后一点调试信息:
字符串(222)“从wp\\U posts中选择SQL\\U CALC\\U FOUND\\U ROWS wp\\U posts.ID,其中1=1,wp\\U posts.post\\U type=\'研究\'和(wp\\U posts.post\\U status=\'发布\'或wp\\U posts.post\\U status=\'专用\')按wp\\U posts.post\\U date DESC LIMIT 0,10排序”
这是调用的结果echo var_dump($wp_query->request)
之前// theloop
SO网友:Andrew
您正在创建一个新查询,而不是更改现有查询。
这个pre_get_posts codex page 有一个注释说明$query参数是通过引用传递的,您应该直接修改它。不需要声明全局变量或返回值。将您的函数更新为:
add_action( \'pre_get_posts\', \'only_current\' );
function only_current( $query ) {
if ( is_admin() ) {
return;
}
if ( ! $query->is_main_query() ) {
return;
}
if ( ! is_post_type_archive( \'research\' ) ) {
return;
}
$tax_query = array(
array(
\'taxonomy\' => \'status\',
\'field\' => \'slug\',
\'terms\' => \'current\',
),
);
$query->set( \'tax_query\', $tax_query );
}
The
pre_get_posts
过滤器也适用于管理员内部的查询,所以我添加了另一条if语句来检查我们是否位于站点的前端。
我还添加了一份声明,以检查我们是否在research
存档页。
上述功能需要放入functions.php
文件或特定于站点的插件。将其放置在archive-research.php
文件将不工作,因为查询将在archive-research.php
已加载模板。