web-dev-qa-db-fra.com

Un WP_Query qui recherchera des publications après 2 semaines OR avec une certaine méta valeur

Je cherche un moyen d'avoir fondamentalement une relation OR entre le date_query et le meta_query. En gros, je veux combiner les deux WP_Query.

Obtenez les messages des deux dernières semaines

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

Obtient des publications avec certaines méta_valeurs, telles que sticky = 'true'

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

Comment puis-je combiner ces deux requêtes en une seule, mais de sorte que si une publication respectesoitla date OR l'exigence de méta-requête, elle est sélectionnée.

2
Pete

Il serait peut-être possible d'y parvenir en utilisant les filtres post clauses et en réécrivant la requête SQL générée.

Vous pouvez également exécuter 3 requêtes,

  • Une requête très maigre pour obtenir les publications souhaitées à partir du date_query

  • Une requête très maigre pour obtenir tous les articles du meta_query

  • Une dernière requête pour obtenir l'objet de requête complet. Cette aide spécialement pour la pagination si vous souhaitez jamais paginer la requête. Cela trie également les publications correctement dans l’ordre.

Vous pouvez essayer ce qui suit

$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