我的pre_get_posts
滤器所以,问题是当我设置meta_query
, all the menus disappear from the page.
function propersearchfilter($query) {
$taxarray = array();
$metaarray = array();
array_push($metaarray , array(
\'key\' => \'wpcf-market\',
\'value\' => \'forsell\',
\'compare\' => \'LIKE\'
));
$query->set(\'meta_query\', $metaarray);
return $query;
}
add_action(\'pre_get_posts\', \'propersearchfilter\', 1);
SO网友:Stephen Harris
pre_get_posts
每个查询的触发器(前端和管理端)。当查询导航菜单项时,它也会触发(这里就是这样)。
大多数情况下,您只想过滤特定的查询,因此需要检查该查询是否是您希望修改的查询。
通常,我认为您的示例可能就是这样,您只想修改“主查询”。
function wpse72969_pre_get_posts( $query) {
//If its not the \'main query\' don\'t do antying.
if( !$query->is_main_query() )
return;
return $query;
}
add_action(\'pre_get_posts\', \'wpse72969_pre_get_posts\');
更一般地说
all the conditionals 对您可用(
Note: 您希望使用方法,而不是函数:例如。
$query->is_search()
而不是
is_search()
.
您甚至可以设置自定义变量来标识查询。
SO网友:chrisguitarguy
这是因为pre_get_posts
在的每个实例上激发WP_Query
. 贴子在WordPress中有很多用途,包括导航菜单。
如果只想修改主查询(“循环”),可以测试is_main_query
.
<?php
add_action(\'pre_get_posts\', \'wpse72969_modify_q\');
function wpse72969_modify_q($q)
{
if(!$q->is_main_query())
return;
// any calls to `set` here will modify ONLY the main query
}
您还可以使用
conditional tags 以及:
<?php
add_action(\'pre_get_posts\', \'wpse72969_modify_q2\');
function wpse72969_modify_q2($q)
{
if(!$q->is_main_query() || !$q->is_search())
return;
// any calls to `set` here will modify ONLY
// the main query on search pages.
}