WP_Query, который будет искать сообщения после 2 недель назад или с определенным метазначением

Я ищу способ иметь отношения OR между date_query и meta_query . В основном я хочу объединить два WP_Query .

Получать сообщения за последние две недели

 $args = array( 'post_type' => 'post', 'orderby' => 'date', 'posts_per_page' => -1, 'date_query' => array( array( 'after' => '2 weeks ago' ) ) ); 

Получить сообщения с определенным meta_value, такие как sticky = 'true'

 $args = array( 'post_type' => 'post', 'orderby' => 'date', 'posts_per_page' => -1, 'meta_query' => array( array( 'key' => 'sticky', 'value' => true, 'type' => 'BOOLEAN', ), ), ); 

Как объединить эти два запроса в один, но так, чтобы, если сообщение соответствует либо дате, либо требованию meta_query, оно выбрано.

Этого можно добиться, используя фильтры post clauses и переписывая сгенерированный SQL-запрос.

Вы также можете запустить 3 запроса,

  • Один очень тощий запрос для получения желаемых сообщений из date_query

  • Один очень тощий запрос, чтобы получить все сообщения из meta_query

  • Один окончательный запрос для получения полного объекта запроса. Эта помощь особенно подходит для разбивки на страницы, если вы когда-либо захотите разбивать запрос. Это также сортирует сообщения правильно в порядке.

Вы можете попробовать следующее

 $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