web-dev-qa-db-ja.com

特定の投稿タイプに対するpre_get_postsフィルタを禁止する

pre_get_post filterの問題が1つ発生しています。

実際には4種類の投稿があります。投稿、ページ、イベント、および開催地。イベントと会場の投稿タイプ用にcityというカスタムフィールドを1つ作成しました。

カスタムフィールドを作成するときに、そのカスタムフィールドを表示する投稿タイプを選択するためのオプションが1つあります。

さて、フロントエンド部分で私はpre_get_postsに一つのフィルタを追加し、特定の都市からの全ての投稿を取得するためにメインクエリを修正しました。

すべてのことが、イベントや開催地の一覧表示、および単一ページただし、このフィルターは投稿やページにも適用されますで完全に機能しています。

私が欲しいのは、**私はそのカスタムフィールドに含まれていない投稿タイプからthisフィルタを削除したいです。

私は$ wp_query-> query_vars ['page_id'] _このコードを試しましたが、もう機能しません。

誰かがこれを私たちのソートに役立てることができますか?

FYI:私のコードはこんな感じです、

add_action( 'pre_get_posts', 'citywise_post_filter' );
function citywise_post_filter($query) {
    global $wp_query;
    if( isset( $_REQUEST['city_filter'] ) ){
        $city = $_REQUEST['city_filter'];
    }else{
        $city = $_SESSION['CURR_CITY'];
    }
    if ( !is_admin() ){
        $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
        $query->set( 'meta_value', $city );
        return;
    }
}

ありがとう、Aezaz

4
Shaikh Aezaz

照会される投稿タイプのチェックを含めるように条件を改善してください。 WP_Query::get methodで実行できます。

だから、あなたがいるところ

if ( !is_admin() ){
    $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
    $query->set( 'meta_value', $city );
    return;
} 

と置換する

if ( ! is_admin() && in_array ( $query->get('post_type'), array('event','venue') ) ) {
    $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
    $query->set( 'meta_value', $city );
    return;
}

@offroff が彼の答えで述べたように、このコードを使うことは、new WP_Query ($args)を使って、あなたがページを訪問したことを引き起こしたもの(メインクエリ)とコードを通して引き起こされたものに適用されます。 (二次問い合わせ)。

コードフィルタが二次クエリに影響を与えないようにするには、$query->is_main_query()のチェックを追加します。そうすればコードは次のようになります。

if ( is_admin() || ! $query->is_main_query() ) return;

if ( in_array ( $query->get('post_type'), array('event','venue') ) ) {
    $query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
    $query->set( 'meta_value', $city );
    return;
}
12
gmazzap

Wordpressには コンディショナルタグ についての素晴らしいページがあります。

!is_admin()と一緒に&& $query->is_main_query()をしたいと思うかもしれません

これらのページにフィルタを適用したくない場合は、関数の上部でif(is_single() || is_page()) {return;}を実行できます。

あなたが使うことができるかもしれない他の条件はis_post_type_archive('event') && is_post_type_archive('venue')です

編集:私はあなたの問題を理解しているかわからないが、今私はこれがあなたを助けるかもしれないと考えました:

$query->set('post_type',array('event','venue'));
3
offroff