カスタムアーカイブページのクエリを変更しています。 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));
}
}
}
コンテンツが返された後にクエリ変数をクリアする必要がありますか?
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()
は特定のクエリがポストタイプのアーカイブである場合にのみ値を設定します。