web-dev-qa-db-ja.com

カスタム投稿タイプのメタキーで検索結果を絞り込む

デフォルトの検索はすべての投稿タイプを返します。しかし、ある特定のカスタム投稿タイプでは、結果を特定のメタキー値(今日よりも大きくなければならないカスタム日付)に制限したいと思います。

Pre_get_postsフックを使用してmeta_queryを設定すると、その投稿タイプに対して正しい結果が得られますが、そのキーが設定されていないすべての投稿タイプも除外されます。

Meta_queryを1つの特定のcptに対してのみ使用することは可能ですか?

それは十分に明確なはずですが、それでもなおここにいくつかのコードがあります。

function searchExcludeOldMatches($query) {
    if (!is_admin()&&$query->is_search) {
        $query->set('meta_query', array(
            array(
                'key' => 'cpt-match-date'
                ,'value' => date('Y/m/d',time())
                ,'type' => 'DATE'
                ,'compare' => '>'
            )
        ));
    };
    return $query;
};
add_filter('pre_get_posts','searchExcludeOldMatches');
2
Sjeiti

これは以前には機能しなかったかもしれませんが、WordPressのメタクエリは現在relationパラメータをサポートしています。 @s_ha_dumが実行しようとしていたことを完了するには、単純にrelationパラメータを(ORとして)追加し、NOT EXISTSの2番目のメタクエリを追加します。例:

function searchExcludeOldMatches( $query ) {
    //if we're on the admin panel, or it's a search, or it's not the post type we want to filter, return the original query
    if( is_admin() || !$query->is_search() || $query->get( 'post_type' ) != 'yourposttype' )
        return $query;

    //this is the query we want to update
    $query->set('meta_query', array(
        'relation' => 'OR',
        array(
            'key' => 'cpt-match-date'
            ,'value' => date('Y/m/d',time())
            ,'type' => 'DATE'
            ,'compare' => '>'
        ),
        array(
            'key' => 'cpt-match-date'
            ,'value' => date('Y/m/d',time())
            ,'type' => 'DATE'
            'compare' => 'NOT EXISTS'
        ),
    ));
    return $query;
}
add_filter('pre_get_posts','searchExcludeOldMatches');

さらに読むためには、WP Meta Query Codexページをチェックしてください: https://codex.wordpress.org/Class_Reference/WP_Meta_Query

2015年11月17日編集:カスタム投稿タイプのフィルタを追加し、条件文を簡略化しました。

1
Elliott Post

あなたはさらにあなたのクエリを制限することができます...

if (
  !is_admin() 
  && $query->is_search() 
  && ($query->get('post_type') == 'yourposttype')
) { 
  // ...

しかし、すべての投稿タイプをクエリしたいが、それらの結果を1つの投稿タイプ同じクエリ内に限定する場合は、それはできません。おそらくUNIONステートメントが必要になるでしょう、そしてWP_Queryはそれをサポートしていません。複数のクエリを使用するか、独自のSQLを記述する必要があります。

これを行う最も簡単な方法は、次のようなものです。

$post_ids = new WP_Query(array(
  // query for one post type
  'fields' => 'ids',
  // other parameters
));

$post_ids_2 = new WP_Query(array(
  // query for the others
  'fields' => 'ids',
  // other parameters
));
// join them
$post_ids = $post_ids->posts + $post_ids_2->posts;
$posts_qry = new WP_Query(array('post__in'=> $posts_ids));

しかし最も効率的ではありません。それは3つの質問です。私は別のスレッドで他の可能性に言及します: カテゴリ除外とポストメタ "ホワイトリスト"を使用したカスタムクエリ

関連する

https://wordpress.stackexchange.com/a/79977/21376

1
s_ha_dum