WP_Query में कई कर_ के लिए कई संबंध


10

मैं WP_Query()अपने कुछ पोस्ट को फ़िल्टर करने के लिए कक्षा का उपयोग करना चाहता हूं। अब मैं जिस समस्या का सामना कर रहा हूं वह टैक्सोनॉमी क्वेरी को संभाल रही है। आम तौर पर, WP_Query()केवल tax_query()(या और) के लिए एक रिश्ते को संभालता है , लेकिन मुझे इन रिश्तों के मिश्रित उपयोग की आवश्यकता है tax_query(), इसे कैसे प्राप्त कर सकते हैं?
जैसे

'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( $term)
        ),
        array(
            'taxonomy' => 'taxonomy3',
            'field' => 'slug',
            'terms' => 'terms' => array( $term3),
            'operator' => 'IN',
        )
       // below i want to use OR relationship
       'relation' => 'OR',
      array(
            'taxonomy' => 'taxonomy4',
            'field' => 'slug',
            'terms' => array( $term4)
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => 'terms' => array( $term2),
            'operator' => 'IN',
        )
    )  

मुझे पता है कि उपरोक्त कोड काम नहीं कर रहा है, क्या मुझे WP_Query()इसे करने के लिए फ़िल्टर का उपयोग करने की आवश्यकता है? कोई उपाय?

जवाबों:


10

यह स्लग के बजाय term_taxonomy_id का उपयोग करके किया जा सकता है, जो प्रभावी रूप से जो भी वर्गीकरण को निर्दिष्ट करेगा उसे अनदेखा करेगा और केवल अनूठे टर्म_टैक्सोनॉमी_आईडी क्षेत्र को देखेगा। यह आपको प्रभावी रूप से मिश्रित संबंध बनाने में सक्षम होगा। आप AND के समग्र संबंध का उपयोग करना चाहते हैं और उन सभी शर्तों को रखना चाहते हैं जो IN ऑपरेटर का उपयोग करके संबंधित या एक आइटम में होनी चाहिए। आपको पहले उनके term_taxonomy_ids में वांछित शर्तों को मैप करना होगा।

$taxes = array( 'taxonomy1', 'taxonomy2', 'taxonomy3', 'taxonomy4' );

foreach ( $taxes as $tax ) {
    $terms = get_terms( $tax );

    foreach ( $terms as $term )
        $tax_map[$tax][$term->slug] = $term->term_taxonomy_id;
}


$args['tax_query'] => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'taxonomy1',
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy1'][$slug] )
        'operator' => 'IN',
    ),
    array(
        'taxonomy' => 'taxonomy3',
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy3'][$slug] ),
        'operator' => 'IN',
    ),
    array(
        'taxonomy' => 'taxonomy4', // gets ignored
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy4'][$slug], $tax_map['taxonomy2'][$slug] ),
        'operator' => 'IN',
    ),
);

ध्यान दें कि पूर्व 3.5, आपको भी निर्दिष्ट करना होगा 'include_children' => false। इस Trac टिकट को और देखें: https://core.trac.wordpress.org/ticket/21228


6
वैसे, कृपया क्षमा करें और मुझे किसी भी गलती / अशुद्धियों के प्रति सचेत करें :) यह सब एक बच्चे के साथ दूसरे हाथ में टाइप करना।
हेलनहसंडी

1
कहाँ $slugसे आता है ...?
vancoder

1
कोड में सिर्फ एक प्लेसहोल्डर। मुझे लगता है कि यह मूल प्रश्न में $ टर्म 1 आदि था।
हेलनहसंडी

तुम सही हो! यह विधि काम करने लगती है। मैं इसे परीक्षण दूंगा, और यदि यह काम कर रहा है तो इस उत्तर के लिए मतदान करने के लिए वापस आऊंगा। धन्यवाद
ron_dev

ऐसा लगता है कि 'taxonomy' => 'taxonomy4', // gets ignoredइसे नजरअंदाज नहीं किया जा सकता है। यदि मैं इस क्षेत्र में यादृच्छिक पाठ डालता हूं, तो कोई परिणाम नहीं मिला। केवल जब मैंने वास्तविक टैक्सोनॉमी नाम सौंपा, तो यह मुझे परिणाम देता है। कोई विचार क्यों?
रोन_देव

1

मैं इस तरह कई या / और ऑपरेटरों tax_queryके meta_queryलिए के रूप में उपयोग कर sugest


बहुत बेहतर सुझाव। जैसा कि उपरोक्त उत्तर के कुछ समय बाद जारी किया गया था।
फूबार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.