デフォルトの検索はすべての投稿タイプを返します。しかし、ある特定のカスタム投稿タイプでは、結果を特定のメタキー値(今日よりも大きくなければならないカスタム日付)に制限したいと思います。
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');
これは以前には機能しなかったかもしれませんが、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日編集:カスタム投稿タイプのフィルタを追加し、条件文を簡略化しました。
あなたはさらにあなたのクエリを制限することができます...
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つの質問です。私は別のスレッドで他の可能性に言及します: カテゴリ除外とポストメタ "ホワイトリスト"を使用したカスタムクエリ