pre_get_posts and set

时间:2012-11-17 作者:solinter

我的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);

2 个回复
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.
}

结束

相关推荐