私は基本的にdate_query
とmeta_query
の間にOR関係を持つ方法を探しています。基本的に私は2つのWP_Query
を結合したいです。
過去2週間の投稿を取得する
$args = array(
'post_type' => 'post',
'orderby' => 'date',
'posts_per_page' => -1,
'date_query' => array(
array(
'after' => '2 weeks ago'
)
)
);
sticky = 'true'
のような特定のmeta_valueで投稿を取得する
$args = array(
'post_type' => 'post',
'orderby' => 'date',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => 'sticky',
'value' => true,
'type' => 'BOOLEAN',
),
),
);
これら2つのクエリを1つにまとめるにはどうすればよいでしょうか。ただし、投稿がいずれか日付OR meta_queryの要件を満たす場合は、選択されます。
post句のフィルタ を使用し、生成されたSQLクエリを書き換えることでこれを実現できる可能性があります。
3つのクエリを実行することもできます。
date_query
から目的の投稿を取得するための1つの非常に無駄のないクエリ
meta_query
からすべての投稿を取得するための1つの非常に無駄のないクエリ
完全なクエリーオブジェクトを取得するための最後のクエリー。これは、クエリをページ分割したい場合に特にページネーションに役立ちます。これはまた、投稿を正しい順序で並べ替えます。
あなたは以下を試すことができます
$defaults = [
'post_type' => 'post',
'orderby' => 'date',
'posts_per_page' => -1,
'fields' => 'ids' // Only return post ID's for performance
];
// Query 1
$date_query = [
[
'after' => '2 weeks ago'
]
];
$query1 = new WP_Query( array_merge( $date_query, $defaults ) );
// Query 2
$meta_query = [
[
'key' => 'sticky',
'value' => true,
'type' => 'BOOLEAN',
]
];
$query2 = new WP_Query( array_merge( $meta_query, $defaults ) );
// Final query
// Get all the post ID's from the two queries and merge into one array
$ids = array_merge( $query1->posts, $query2->posts )
// Make sure we have an array of id's before continueing to avoid unexpected results
if ( $ids ) {
// Remove possible duplicates
$ids = array_unique( $ids );
// Set fields back to all to get full post objects
$defaults['fields'] = 'all';
// Add extra parametes
$defaults['post__in'] = $ids; // Set the array of ids to post__in
// $defaults['order'] = 'ASC'; // If you want to keep the post order according to post__in
//$defaults['orderby'] = 'post_in'; // If you want to keep the post order in post__in
// Run our query
$q = new WP_Query( $defaults );
// You can now run your loop