meta_query imbriqué avec plusieurs clés de relation

17

Je suis curieux de savoir si Wordpress peut exécuter imbriqué meta_query , chacun ayant des clés de relation différentes. À partir de Wordpress 3.0, tax_query est capable d’exécuter cette fonction; Je me demande si cela a un équivalent avec meta_query .

$results = query_posts( array(
    'post_type' => 'event_id',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'relation' => 'OR',
            array(
                'key' => 'primary_user_id',
                'value' => $user_id
            ),
            array(
                'key' => 'secondary_user_id',
                'value' => $user_id
            )
        ),
        array(
            'key' => 'date',
            'value' => array( $start_date, $end_date ),
            'type' => 'DATETIME',
            'compare' => 'BETWEEN'
        )
    )
) );

Références:

posée Andrew Odri 05.12.2012 - 21:31

3 réponses

20

La question était pour Wordpress 3.0, mais juste au cas où quelqu'un aurait la même question pour une version plus récente, de Wordpress Codex:

  

"À partir de la version 4.1, les clauses meta_query peuvent être imbriquées afin de construire des requêtes complexes."

enlace

Cette requête devrait donc fonctionner avec la version actuelle de Wordpress.

    
réponse donnée Gustavo 19.03.2015 - 19:01
9

Cela semble être impossible. S'il vous plaît, corrigez-moi si je me trompe.

Le paramètre meta_query sera en réalité transformé en un objet WP_Meta_Query , et la vérification relation n'ira pas plus loin dans wp-includes/meta.php , et n'apparaît qu'une fois dans le niveau supérieur:

if ( isset( $meta_query['relation'] ) && strtoupper( $meta_query['relation'] ) == 'OR' ) {
    $this->relation = 'OR';
} else {
    $this->relation = 'AND';
}

Une solution possible consiste à créer votre propre JOIN pour cette requête.

$query = new WP_Query( array(
    ...
    'my_meta_query' => true,
    'suppress_filters' => false
) );

add_filter( 'posts_join', 'my_meta_query_posts_join', 10, 2 );
function my_meta_query_posts_join( $join, $query ) {

    if ( empty( $query->query_vars['my_meta_query'] ) )
        return $join;

    global $wpdb;

    $new_join = "
        INNER JOIN {$wpdb->postmeta} pm1 ON 1=1
            AND pm1.post_id = {$wpdb->posts}.ID
            AND pm1.meta_key = '_some_meta_key'
            AND pm1.meta_value = 'some_value'
    ";

    return $join . ' ' . $new_join;
}

Et si vous avez besoin de vérifications et de règles supplémentaires, vous pouvez également utiliser le filtre posts_where .

    
réponse donnée vmassuchetto 18.01.2013 - 13:54
1

En attendant, cela est possible, voir la documentation avec l'exemple et l'explication:

enlace

et un autre exemple enlace

'meta_query'  => array(
    'relation' => 'OR',
    array(
        'relation' => 'AND',
        array(
            'key'     => '_price',
            'value'   => 1,
            'compare' => '>=',
            'type' => 'DECIMAL',
        ),
        array(
            'key'     => '_price',
            'value' <= 3000,
            'compare' => '<=',
            'type' => 'DECIMAL',
        ),
    ),
    array(
        'relation' => 'AND',
        array(
            'key'     => '_price',
            'value'   => 3001,
            'compare' => '>=',
            'type' => 'DECIMAL',
        ),
        array(
            'key'     => '_price',
            'value' <= 6000,
            'compare' => '<=',
            'type' => 'DECIMAL',
        ),
    )
),
    
réponse donnée Ramon Fincken 07.08.2018 - 11:34

Lire d'autres questions sur les étiquettes