自定义搜索筛选器导致MENU和QUERY_POST问题

时间:2012-05-24 作者:Justine

我正在使用自定义搜索筛选器(使用我的自定义查询变量type), 像这样:

function fteh_pre_get_posts( $query ){
    if( isset( $query->query_vars[\'type\'] ) )
        $types = explode( \',\', $query->query_vars[\'type\'] );
        $query->set( \'post_type\', $types );

    return $query;
}

if ( ! is_admin() ) {
     add_action( \'pre_get_posts\', \'fteh_pre_get_posts\' );
}
我注意到这会导致注册的自定义菜单消失。

没有!is_admin() 它还混淆了菜单生成器(它在页面部分显示了一些帖子,而不是我的所有页面)。添加条件有助于实现这一点,但我不知道如何恢复菜单。

它被正确注册和调用,构建并保存在适当的主题位置,并在添加过滤器之前工作。现在它只使用fallback_cb (在我的情况下,默认wp_page_menu) 而不是我的自定义菜单。

一旦我从pre_get_posts, 一切都恢复正常了。

我不知道怎么做pre_get_posts 钩子与自定义菜单相关——有人知道为什么它会导致如此奇怪的行为吗?

UPDATE:

我现在发现了另一个问题,这是由上面的代码片段引起的——我在页面上的所有自定义查询(简单的东西,如query_posts(\'post_type=organization\')) 已停止工作并显示普通帖子,而不是在中设置的自定义帖子类型query_posts.

2 个回复
SO网友:Sisir

使用is_main_query() 仅修改主查询,使菜单不受影响。

Try This:

add_action( \'pre_get_posts\', \'fteh_pre_get_posts\' );

    function fteh_pre_get_posts( $query ){
        if( !is_admin() && $query->is_main_query() && isset( $query->query_vars[\'type\'] ) )
            $types = explode( \',\', $query->query_vars[\'type\'] );
            $query->set( \'post_type\', $types );

        return $query;
    }

SO网友:Andrew Schultz

我可能会迟到一点,但这就是我在按类别查看自定义帖子时,为了解决菜单消失的问题所做的。我使用的是默认的帖子类别,而不是自定义分类法。

public function include_custom_post_search( $query ) {
        if( ! is_admin() ) {

            if( is_category() && \'nav_menu_item\' !== $query->get(\'post_type\') )
                $query->set( \'post_type\', \'custom_post_place_slug\' );
        }
    }

    add_action( \'pre_get_posts\', \'include_custom_post_search\' );

结束

相关推荐

Custom menus not showing

作为我上一次关于菜单的未解决查询的后续,这个问题已经进一步扩展。我的菜单没有打印代码中的任何地方。我正在注册菜单功能。php:add_action( \'after_setup_theme\', \'your_newtheme_setup\' ); if ( ! function_exists( \'your_newtheme_setup\' ) ) : function your_newtheme_setup() { if (