कई संबंध कुंजी के साथ नेस्टेड मेटा_क्वेरी


18

मैं उत्सुक हूं कि क्या Wordpress नेस्टेड को चलाने में सक्षम है meta_query, प्रत्येक के संबंध अलग-अलग हैं? वर्डप्रेस 3.0 के रूप में, tax_queryइस फ़ंक्शन को करने में सक्षम है; मैं सोच रहा हूँ कि क्या यह एक समकक्ष है 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'
        )
    )
) );

संदर्भ:

जवाबों:


21

यह सवाल वर्डप्रेस 3.0 के लिए था, लेकिन अभी किसी के पास वर्डप्रेस कोडेक्स से अधिक हाल के संस्करण के लिए एक ही सवाल है:

"संस्करण 4.1 के साथ, जटिल प्रश्नों के निर्माण के लिए मेटा_क्वरी क्लॉज़ को नेस्ट किया जा सकता है।"

http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

तो, उस क्वेरी को वर्तमान वर्डप्रेस संस्करण पर काम करना चाहिए।


9

यह असंभव प्रतीत होता है। अगर कोई गलत है तो कृपया मुझे सही करें।

meta_queryपैरामीटर वास्तव में एक के रूप में तब्दील किया जाएगा WP_Meta_Queryवस्तु, और relationसत्यापन में गहरी नहीं जाना होगा wp-includes/meta.php, और सिर्फ शीर्ष स्तर में एक बार होता है:

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

इसके लिए एक संभावित समाधान इस क्वेरी के लिए अपना स्वयं का JOIN बनाना है।

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

और यदि आपको आगे सत्यापन और नियमों की आवश्यकता है, तो आप posts_whereफ़िल्टर का उपयोग भी कर सकते हैं ।


3
ऐसा ही लगता है @scribu कोर Trac पर सिफारिश करता है: core.trac.wordpress.org/ticket/20312
एंड्रयू

@AndrewOdri यह वही है लेकिन यह नहीं है =)
vmassuchetto

1

इस बीच यह संभव है, उदाहरण और स्पष्टीकरण के साथ प्रलेखन देखें:

https://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

और एक अन्य उदाहरण 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,
            'compare' => '<=',
            'type' => 'DECIMAL',
        ),
    )
),
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.