web-dev-qa-db-ja.com

カスタム検索フィルタによりmenuおよびquery_postsの問題が発生する

私は(私のカスタムクエリvar 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()がないと、メニュービルダーも混乱します(Pagesセクションのすべての私のページの代わりにいくつかの投稿を示しました)。条件を追加することはそれで助けになりました、しかし私は私のメニューを元に戻す方法を理解することができません。

適切に登録されて呼び出され、適切なテーマの場所にビルドされて保存され、そのフィルタを追加する前に機能しました。今はカスタムメニューの代わりにfallback_cb(私の場合はデフォルトのwp_page_menu)を使うだけです。

pre_get_postsからそのアクションを削除するとすぐに、すべての設定は通常に戻ります。

pre_get_postsフックがカスタムメニューとどのように関連しているのかわかりません。なぜそれがそのような奇妙な動作を引き起こすのか知っているのですか?

更新:

query_postsで設定されたカスタム投稿タイプの代わりに、ページ上のすべてのカスタムクエリ(query_posts('post_type=organization')のような単純なもの)が機能しなくなり、通常の投稿が表示されるという問題がありました。

5
Justine

is_main_query() を使用してメインクエリのみを変更し、メニューが影響を受けないようにします。

これを試してください:

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;
    }
12
Sisir

私はパーティーに少し遅れるかもしれませんが、これは私がカテゴリー別にカスタム投稿を見ていたときにメニューが消えるという私の問題を解決するために私がしたことです。カスタム分類法ではなく、デフォルトの投稿カテゴリを使用しています。

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' );
0
Andrew Schultz