बाल वर्गीकरणों में वस्तुओं को बाहर करने के लिए वर्गीकरण पृष्ठों को संशोधित करें


18

मुझे यह प्रश्न मिला:

$ क्वेरी-> सेट ('tax_query' को pre_get_posts फ़िल्टर में उपयोग करने का एक तरीका है?

जो इंगित करता है कि हां, आप वर्गीकरण_ पर कर-संबंधी क्वेरी को pre_get_posts () के माध्यम से बदल सकते हैं। तो मैं साथ आया

add_action('pre_get_posts', 'kia_no_child_terms' );

function kia_no_child_terms( $wp_query ) {  
  if( is_tax() ) {
     $wp_query->tax_query->queries[0]['include_children'] = 0;
  }
}

साथ ही साथ

add_action('pre_get_posts', 'kia_no_child_terms' );

function kia_no_child_terms( $wp_query ) {
   if( is_tax() ) {
        $tax_query = $wp_query->get( 'tax_query' );
        $tax_query->queries[0]['include_children'] = 0;
    $wp_query->set( 'tax_query', $tax_query );  
    }    
}

शामिल करने की कोशिश करने के लिए झूठे ... को शामिल करें ... और सिर्फ दो के हर संयोजन के बारे में सोच सकते हैं। हालाँकि, अभी तक टैक्सोनॉमी आर्काइव चाइल्ड टर्म में आइटम दिखा रहा है

और निम्न परीक्षण उन्हें अधिलेखित करने के बजाय अतिरिक्त कर प्रश्नों को जोड़ने के लिए लगता है ... जो मुझे भ्रमित करता है।

function dummy_test( $wp_query){
$tax_query = array(
             'relation' => 'OR',
             array(
               'taxonomy' => 'tax1',
               'terms' => array( 'term1', 'term2' ),
               'field' => 'slug',
             ),
             array(
               'taxonomy' => 'tax2',
               'terms' => array( 'term-a', 'term-b' ),
               'field' => 'slug',
             ),
           );


$wp_query->set( 'tax_query', $tax_query );

);
add_action('pre_get_posts','dummy_test');

SET वर्तमान मूल्य को अधिलेखित नहीं करना चाहिए?


कृपया इस उत्तर पर एक नज़र डालें । जो आपको आगे लाना चाहिए।
kaiser

धन्यवाद, लेकिन यह बहुत ज्यादा है जो मैंने कोशिश की है। $ wp_query ग्लोबल के var_dumps / print_rs दिखा रहे हैं कि मौजूदा टैक्स क्वेरी के अलावा नई टैक्स क्वेरी ... के स्थान पर ... कम से कम मेरे टैक्सोनॉमी पेज पर।
हेलगेटहाइकिंग 15

हाँ, यह कोड क्वेरी में जोड़ने के लिए है।
kaiser

इसलिए मौजूदा क्वेरी को समायोजित / ओवरराइड करने का कोई तरीका नहीं है? b / c जो मैं चाहता हूं वह शामिल
है_चिल्ड्रेन

जवाबों:


22

मुझे पता है कि यह एक पुराना सवाल है, लेकिन यह थोड़ा भ्रमित करने वाला है और उम्मीद है कि इससे किसी को मदद मिलेगी। इसका कारण यह है कि `$ क्वेरी-> सेट काम नहीं करता है क्योंकि क्वेरी पहले ही पार्स हो चुकी है और अब हमें टैक्स_क्वेरी ऑब्जेक्ट को भी अपडेट करने की आवश्यकता है। यहाँ देखें कि मैंने यह कैसे किया:

function my_tax_query( $query ) {
    $package_id = 12345;
    $tax_query = array(
        'taxonomy' => 'package_id',
        'terms'    => array( $package_id ),
        'field'    => 'slug',
        'operator' => 'IN',
    );
    $query->tax_query->queries[] = $tax_query; 
    $query->query_vars['tax_query'] = $query->tax_query->queries;
}
add_action( 'pre_get_posts', 'my_tax_query' );

मिठाई!! मैंने इसकी जाँच की और सभी टैक्सोनॉमीज़ के लिए आपके कोड को अनुकूलित करने में सक्षम था, जो कि मूल प्रश्न था। +1 (अगर मैं कर सकता था तो मैं आपको और अधिक
अपवित्र देता

मुझे आश्चर्य हुआ और यह देखने के लिए आश्वस्त हुआ कि यह पद्धति डेट क्वेरी के लिए भी काम करती है।
डेविड

14

वर्डप्रेस 3.7 के रूप में parse_tax_queryइस उद्देश्य के लिए एक नई कार्रवाई को वास्तव में जोड़ा गया था।

function kia_no_child_terms($wp_query) {  
  $wp_query->tax_query->queries[0]['include_children'] = 0;
}
add_action('parse_tax_query', 'kia_no_child_terms');

यह हुक query_vars और tax_query दोनों के मूल्यों को संशोधित करता है। pre_get_postsविधि का उपयोग करने से डुप्लिकेट टैक्सोनॉमी प्रश्नों का परिणाम हुआ, कम से कम मेरे लिए।

3.7 से पहले आपको pre_get_postsकार्रवाई का उपयोग करना होगा , जैसा कि अन्य उत्तरों में विस्तृत है।


मेरे मामले में, यह थोड़ा बहुत दूरगामी लगता है और इसके अनजाने दुष्प्रभाव होते हैं ... यह मेरे नेविगेशन के सबमेनस को दिखाने से रोकता है।
मनु

2
@ मनु - तुम पूरी तरह सही हो। प्रदान किया गया उदाहरण बहुत सरल है और केवल प्रासंगिक चर दिखाता है। वास्तविक जीवन के परिदृश्य में, आप यह जांचने $wp_queryके लिए टेम्प्लेट टैग या दोनों या किसी अन्य तर्क का उपयोग करेंगे, यह निर्धारित करने के लिए कि क्वेरी को पहले स्थान पर संशोधित किया जाना चाहिए या नहीं।
लीपावर

5

pre_get_postsया के किसी भी संयोजन के साथ काम करने के लिए मुझे यह नहीं मिला parse_query। मैं इसे बनाने के बाद अपेक्षाकृत आसानी से क्वेरी ऑब्जेक्ट को मिटाकर कर सकता हूं। मुझे यह पसंद नहीं है क्योंकि तब मैं दो बार क्वेरी चला रहा हूं, लेकिन मैं "कुशल" होने की कोशिश कर रहा हूं।

function kia_no_child_taxonomies(){

    if(is_tax()){
        $args = array(
            'tax_query' => array(
                array(
                    'taxonomy' => get_query_var('taxonomy'),
                    'field' => 'slug',
                    'terms' => get_query_var('term'),
                    'include_children' => FALSE
                )
            )
        );
        query_posts($args); 
    }
}

 add_action('wp','kia_no_child_taxonomies');

इसलिए जब तक कोई बेहतर उत्तर नहीं देता है, तब तक यह एकमात्र तरीका है जो मैंने अभी तक पाया है।

संपादित करें:

@Tanner Moushey के उत्तर को अपनाने पर, मैं आखिरकार इस कार्य को pre_get_postsअक्षम दोहरे प्रश्न के बिना हुक पर कर-संग्रह से सभी बच्चे की शर्तों को बाहर करने में सक्षम था ।

function kia_no_child_taxonomies( $query ) {

    if( is_tax() ):

    $tax_obj = $query->get_queried_object();

   $tax_query = array(
                    'taxonomy' => $tax_obj->taxonomy,
                    'field' => 'slug',
                    'terms' => $tax_obj->slug,
                    'include_children' => FALSE
            );
   $query->tax_query->queries[] = $tax_query;
   $query->query_vars['tax_query'] = $query->tax_query->queries;

   endif;

}
add_action( 'pre_get_posts', 'kia_no_child_taxonomies' );

ये गलत है। आपको इसके बजाय query_posts का उपयोग नहीं करना चाहिए, इसके बजाय pre_get_posts या अनुरोध का उपयोग करना चाहिए।
कोवशेनिन

यह मददगार नहीं है। क्यों नहीं एक उत्तर पोस्ट करें यदि आप जानते हैं कि इस उदाहरण में pre_get_posts कैसे काम करते हैं? मैंने स्पष्ट रूप से अपने प्रश्न में पोस्ट किया था कि मैंने इसे आज़माया था, लेकिन इस निष्कर्ष पर पहुंचा कि आप उस फ़िल्टर के माध्यम से कर__देवी वस्तु को संशोधित नहीं कर सकते हैं
हेलगैथवाइकिंग

क्षमा करें, अधिक सहायक होना चाहिए था। तो असली कर क्वेरी को बनाया गया है (parse_tax_query के साथ) pre_get_posts के बाद निकाल दिया जाता है, और वास्तविक WP_Tax_Query में, जिसमें सभी कर क्वेरी क्वेरी चर (कर_क्वायरी क्वेरी संस्करण सहित) शामिल हैं, इसलिए आपके मामले में यह आपके कर_ क्वेरी क्वेरी संस्करण को पार्स कर रहा है, और फिर क्वेरी के माध्यम से जो कुछ भी उपलब्ध है, जैसे श्रेणी, टैग__ और अन्य के माध्यम से उपलब्ध कराना। आप अपने स्वयं को जोड़ने से पहले मौजूदा क्वेरी संस्करण को निकालने के लिए pre_get_posts का उपयोग कर सकते हैं।
कोवशेनिन

बेहतर स्पष्टीकरण के लिए धन्यवाद। जाहिर है कि यह पुराना है, इसलिए मैं उस समाधान के साथ आगे बढ़ा जो मेरे पास था। मैं हुक के include_childrenमाध्यम से पैरामीटर को कभी भी संशोधित करने में सक्षम नहीं था pre_get_posts। ठीक है।
हेलगैथाइकिंग

हाँ, मुझे लगा, लंबे समय से यहाँ नहीं है;)
कोवशेनिन

2

मेरे जैसे जो लोग इस मुद्दे पर अटके हुए थे, उनके लिए मुझे कुछ उपयोगी लगा। मैंने प्राथमिकता प्रणाली का उपयोग किया

    function kia_no_child_taxonomies( $query ) {

if( is_tax() ):

$tax_obj = $query->get_queried_object();
$tax_query = array(
                'taxonomy' => $tax_obj->taxonomy,
                'field' => 'slug',
                'terms' => $tax_obj->slug,
                'include_children' => FALSE);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
return $query;
endif;

}
 add_action( 'pre_get_posts', 'kia_no_child_taxonomies',0 );

परिणाम में मेरी क्वेरी शामिल नहीं थी और मेरे बहिष्करण के साथ खोज टूट गई थी। आशा है कि यह मदद करेगा।

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