Interogări meta_query imbricate cu mai multe chei de relație

5 dec. 2012, 22:31:45
Vizualizări: 91.9K
Voturi: 32

Sunt curios dacă WordPress poate rula interogări meta_query imbricate, fiecare având chei de relație diferite? Începând cu WordPress 3.0, tax_query poate efectua această funcție; mă întreb dacă există un echivalent pentru meta_query.

$results = query_posts( array(
    'post_type' => 'event_id',
    'meta_query' => array(
        'relation' => 'AND', // Relația principală - ȘI
        array(
            'relation' => 'OR', // Sub-relație - SAU
            array(
                'key' => 'primary_user_id', // Cheia meta pentru ID-ul utilizatorului primar
                'value' => $user_id
            ),
            array(
                'key' => 'secondary_user_id', // Cheia meta pentru ID-ul utilizatorului secundar
                'value' => $user_id
            )
        ),
        array(
            'key' => 'date', // Cheia meta pentru dată
            'value' => array( $start_date, $end_date ),
            'type' => 'DATETIME', // Tipul valorii - DATETIME
            'compare' => 'BETWEEN' // Comparație între două date
        )
    )
) );

Referințe:

0
Toate răspunsurile la întrebare 3
0
33

Întrebarea era pentru WordPress 3.0, dar pentru orice eventualitate, dacă cineva are aceeași întrebare pentru o versiune mai recentă, din WordPress Codex:

"Începând cu versiunea 4.1, clauzele meta_query pot fi imbricate pentru a construi interogări complexe."

https://developer.wordpress.org/reference/classes/wp_query/#custom-field-post-meta-parameters Așadar, acea interogare ar trebui să funcționeze în versiunea actuală de WordPress.

19 mar. 2015 20:01:46
4
18

Între timp, acest lucru este posibil, consultați documentația cu exemplu și explicație:

Legătură veche: https://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters Actualizare 2021, legătură nouă: https://developer.wordpress.org/reference/classes/wp_query/#custom-field-post-meta-parameters

și un alt exemplu https://wordpress.org/support/topic/wp_query-with-multiple-meta_query/#post-9410992

'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, //fixat <= la =>
            'compare' => '<=',
            'type' => 'DECIMAL',
        ),
    )
),
7 aug. 2018 12:34:58
Comentarii

Acesta este de asemenea un bun referențial, dar apreciez și descrierea completă de aici https://developer.wordpress.org/reference/classes/wp_query/#custom-field-post-meta-parameters

shaneonabike shaneonabike
11 iun. 2021 16:59:25

Codex.wp este mutat pe developer.wp, așa că da, am adăugat referința corectă la momentul respectiv. În acest moment este într-adevăr https://developer.wordpress.org/reference/classes/wp_query/#custom-field-post-meta-parameters i

Ramon Fincken Ramon Fincken
15 iun. 2021 15:11:52

Cum pot adăuga trei condiții cu un "AND"?

Si8 Si8
21 dec. 2021 02:21:41

@Si8 un singur AND ar fi suficient pentru a adăuga A AND B AND C. AND-ul este la un nivel mai înalt decât celelalte

Ramon Fincken Ramon Fincken
10 nov. 2023 16:26:57
2
10

Se pare că acest lucru este imposibil. Te rog să mă corectezi dacă greșesc.

Parametrul meta_query va fi de fapt transformat într-un obiect WP_Meta_Query, iar verificarea relation nu va merge mai departe în wp-includes/meta.php și are loc doar o singură dată la nivelul superior:

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

O posibilă soluție pentru aceasta este să construiești propriul tău JOIN pentru această interogare.

$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;
}

Și dacă ai nevoie de verificări și reguli suplimentare, poți folosi și filtrul posts_where.

18 ian. 2013 14:54:36
Comentarii

Pare a fi aceeași abordare recomandată de @scribu pe Core Trac: https://core.trac.wordpress.org/ticket/20312

Andrew Odri Andrew Odri
29 mai 2014 22:49:42

@AndrewOdri este la fel dar nu este =)

vmassuchetto vmassuchetto
6 oct. 2015 20:14:16