web-dev-qa-db-ja.com

2週間前に投稿を検索するWP_Query OR 特定のメタ値を持つ

私は基本的にdate_querymeta_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の要件を満たす場合は、選択されます。

2
Pete

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
2
Pieter Goosen