修改PRE_GET_POSTS中的查询操作打乱了我的导航菜单

时间:2018-05-01 作者:jppower175

我正在修改自定义存档页的查询。我正在使用pre\\u get\\u posts操作。我需要捕获一些GET变量来修改我的查询。对于一种自定义的帖子类型,它在归档页面上工作得很好,但对于其他类型的帖子,它却不起作用。它正在破坏我的导航菜单。

add_action( \'pre_get_posts\', \'search_provider\');
function search_provider($query){
if(is_post_type_archive(array(\'provider\'))){
   $query->set( \'posts_per_page\', -1 );
   $query->set( \'orderby\', \'title\' );
    $query->set( \'order\', \'ASC\' );
    if(isset($_GET[\'providersearch\']) && $_GET[\'providersearch\'] == \'Y\'){
        if(!empty($_GET[\'s\']))
        $query->set( \'s\', $_GET[\'s\'] );
    } else {
        $query->set (\'exclude\', array(10054, 10068));
    }
  }
}
返回内容后是否需要清除查询变量?

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

pre_get_posts 为每个查询运行。其中包括主查询、辅助查询和菜单。问题是is_post_type_archive(array(\'provider\')) 正在检查主查询是否是post类型存档,而不是正在进行的特定查询pre_get_posts.

因此,当您检查并修改当前查询时pre_get_posts 您将根据主查询的条件修改所有查询。

要正确执行所需操作,需要签入每个查询pre_get_posts 检查传递给操作回调的特定查询是否针对post类型存档。换言之,您正在使用相同的查询设置参数$query->set().

您可以使用$query->is_post_type_archive() 方法

add_action( \'pre_get_posts\', \'search_provider\'); 
function search_provider( $query ) {
    if ( $query->is_post_type_archive( array( \'provider\' ) ) ) {
        $query->set( \'posts_per_page\', -1 );
        $query->set( \'orderby\', \'title\' );
        $query->set( \'order\', \'ASC\' );

        if ( isset( $_GET[\'providersearch\'] ) && $_GET[\'providersearch\'] == \'Y\' ) {
            if ( ! empty( $_GET[\'s\'] ) ) {
                $query->set( \'s\', $_GET[\'s\'] );
            }
        } else {
            $query->set( \'exclude\', array( 10054, 10068 ) );
        }
    }
}
现在$query->set() 仅当特定查询是post类型存档时,才会设置值。

SO网友:Hossin Asaadi

应首先检查:

  if ($query->get(\'post_type\') == \'nav_menu_item\')
    return $query;
就像这里:

    function wp32151_search_filter($query)
{
    if ($query->get(\'post_type\') == \'nav_menu_item\')
        return $query;

    if ($query->is_search) {
        $query->set(\'post_type\', \'shows\');
    } 
     return $query;
}

add_filter(\'pre_get_posts\', \'wp32151_search_filter\');

结束

相关推荐

Row actions not showing? Why?

我建造了一个WP_List_Table 显示在我构建的自定义主题页面上。尽管我查看了Internet上关于WP\\U List\\U表格的所有可能信息,但在显示行操作时遇到了一些问题。任何帮助都会很好!class Testimonials_List_Table extends WP_List_Table { function __construct() { parent::__construct( array( \'singular\'=> \'te