web-dev-qa-db-ja.com

Pre_get_postsアクションでクエリを変更するとナビゲーションメニューが乱れる

カスタムアーカイブページのクエリを変更しています。 pre_get_postsアクションを使用しています。クエリを変更するには、GET変数をいくつかキャッチする必要があります。 1つのカスタム投稿タイプのアーカイブページではうまく機能していますが、それ以外はそうではありません。ナビゲーションメニューが壊れています。

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));
    }
  }
}

コンテンツが返された後にクエリ変数をクリアする必要がありますか?

1
jppower175

pre_get_postsはすべてのクエリに対して実行されます。これには、メインクエリ、セカンダリクエリ、およびメニューが含まれます。問題は、is_post_type_archive(array('provider'))メインクエリがポストタイプアーカイブであるかどうかをチェックしていることであり、pre_get_postsを通過する特定のクエリではないことです。

そのため、それを確認してから現在のクエリをpre_get_postsまで変更すると、メインクエリの条件に基づいてすべてのクエリが変更されます。

必要なことを正しく行うには、pre_get_posts内の各クエリをチェックして、アクションコールバックに渡される特定のクエリがポストタイプアーカイブ用であることを確認する必要があります。言い換えれば、$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()は特定のクエリがポストタイプのアーカイブである場合にのみ値を設定します。

3
Jacob Peattie