the_content और is_main_query


15

मैं फ़िल्टर के साथ सामग्री को फ़िल्टर कर रहा हूं the_content। सब कुछ सही काम करता है, अंश है कि मेरे बदलाव कस्टम प्रश्नों पर भी लागू होते हैं। यदि साइडबार किसी कस्टम क्वेरी का उपयोग करता है तो मेरे परिवर्तन साइडबार में भी दिखाई देते हैं

इसका मुकाबला करने के लिए, मैं is_main_query()केवल मुख्य क्वेरी को लक्षित करने के लिए उपयोग कर रहा हूं , लेकिन यह काम नहीं कर रहा है। परिवर्तन अभी भी बाहर के माध्यम से सभी प्रश्नों पर लागू होते हैं। हालाँकि, यह अन्य सभी सशर्त जाँचों की तरह मज़ेदार है is_single()और is_category()अगर मैं विशिष्ट पृष्ठों को लक्षित करता हूं तो यह काम कर रहा है, सिवाय इसके कि सभी परिवर्तन उस पृष्ठ पर किसी अन्य कस्टम क्वेरी को प्रभावित करते हैं, चाहे मैं उपयोग करूं is_main_query()या नहीं।

क्या मुझसे कोई चूक हो रही है। मैं केवल the_contentफ़िल्टर का उपयोग करके मुख्य क्वेरी में अपने परिवर्तन कैसे लागू करूं

add_filter('the_content', 'custom_content');

function custom_content($content){

    if(is_main_query()){ // << THIS IS NOT WORKING
        // My custom content that I add to the_content()    
    }
    return $content;
}

जवाबों:


11

ईमानदार होने के लिए, फ़ंक्शन in_the_loop()वह है जिसे आप ढूंढ रहे हैं:

add_filter( 'the_content', 'custom_content' );

function custom_content( $content ) {
    if ( in_the_loop() ) {
        // My custom content that I add to the_content()    
    }
    return $content;
}

in_the_loopयदि $wp_queryवर्तमान पोस्ट के लिए वैश्विक (यह मुख्य क्वेरी ऑब्जेक्ट है) तो यह जांचने के लिए क्या है -1 < $current_post < $post_count

ऐसा तब होता है जब मुख्य क्वेरी लूपिंग होती है, क्योंकि लूप शुरू होने से पहले, वर्तमान पोस्ट -1 है, और लूप समाप्त होने के बाद, वर्तमान पोस्ट फिर से -1 पर रीसेट हो जाती है।

तो, अगर in_the_loop()यह सच है, तो इसका मतलब है कि मुख्य क्वेरी ऑब्जेक्ट लूपिंग है, जो आपको इस मामले में चाहिए (और कार्रवाई को जोड़ने का एक ही परिणाम हैloop_start और हटानेloop_end , जैसे @ialocin ने उत्तर लिखा है; वास्तव में यह काम करता है; उसी कारण से, और मेरा +1 मिला)।

@ Ialocin के दृष्टिकोण का लाभ तब है जब आप मुख्य क्वेरी की तुलना में किसी भिन्न क्वेरी ऑब्जेक्ट को लक्षित करना चाहते हैं, क्योंकि in_the_loop()केवल मुख्य क्वेरी के लिए काम करता है।


मेरी कोई भी साइट खोज या ऑनलाइन खोज में नहीं आई। एक छिपा हुआ रत्न जो काम करता है। हर समाधान का उपयोग करता है is_main_query, वास्तव में लगता है कि किसी ने भी पूरी तरह से इसका परीक्षण नहीं किया है। आपके इनपुट के लिए धन्यवाद, वास्तव में सराहना की गई
Pieter Goosen

1
@PieterGoosen Glad यह काम करता है। यह एक बहुत पुराना कार्य है, ऐसे समय से सीधे जब is_main_queryकोई चीज नहीं थी।
gmazzap

तुम देखो, यह वह जगह है जहाँ मैं इसे याद किया, मैं एक पुराने टाइमर नहीं हूँ :-), 3.3 में Wordpress में शामिल हो गया।
पीटर गोपन ने

2
@GM क्या आप इसे अपने उत्तर में जोड़ना चाहेंगे। यह इस उत्तर पर ठोकर खा सकता है कि दूसरों के लिए उपयोगी जानकारी है। अधिकांश लोग, मेरे जैसे, टिप्पणी नहीं पढ़ते हैं :-)
पीटर गोएप ने

1
@PieterGoosen किया :)
gmazzap

7

यह केवल @ ओटो के उत्तर के अतिरिक्त है। बस इसे थोड़ा बेहतर समझ में आता है। मूल रूप से @Otto क्या कह रहा है, आपको तर्क को उल्टा करना होगा, इसका मतलब है: यदि आप मज़बूती से मुख्य क्वेरी निर्धारित कर सकते हैं, तो आप जोड़ सकते हैं - और हटा सकते हैं - अपने हुकिंगthe_content फ़िल्टर ।

उदाहरण के लिए मुख्य क्वेरी को विश्वसनीय रूप से pre_get_postsकार्रवाई में पहचाना जा सकता है, इसलिए यह काम करेगा:

function wpse162747_the_content_filter_callback( $content ) {
    return $content . 'with something appended';
}

add_action( 'pre_get_posts', 'wpse162747_pre_get_posts_callback' );
function wpse162747_pre_get_posts_callback( $query ) {
    if ( $query->is_main_query() ) {
        add_filter( 'the_content', 'wpse162747_the_content_filter_callback' );
    }
}

जैसा कि आप फिल्टर को हटाने के लिए माना जाता है जब इसकी आवश्यकता नहीं होती है, मैं सोच रहा हूं कि loop_endकार्रवाई उसके लिए एक अच्छी जगह होनी चाहिए और इसके समकक्ष के रूप में हम इसका उपयोग कर सकते हैं loop_start। जो इस तरह दिखेगा:

add_action( 'loop_start', 'wpse162747_loop_start_callback' );
function wpse162747_loop_start_callback( $query ) {
    if ( $query->is_main_query() ) {
        add_filter( 'the_content', 'wpse162747_the_content_filter_callback' );
    }
}

add_action( 'loop_end', 'wpse162747_loop_end_callback' );
function wpse162747_loop_end_callback( $query ) {
    if ( $query->is_main_query() ) {
        remove_filter( 'the_content', 'wpse162747_the_content_filter_callback' );
    }
}

इस टोमोरो का परीक्षण करेंगे। आपके विस्तृत विवरण के लिए धन्यवाद।
पीटर गोसन ने

मेरी ख़ुशी हमेशा की तरह @PieterGoosen कोई जल्दी नहीं है, लेकिन यह करो, क्योंकि मैंने नहीं - कम से कम पर्याप्त रूप से पर्याप्त नहीं है।
निकोलई

1
क्या होगा यदि शॉर्टकोड the_content () के भीतर उपयोग में है और शोर्ट एक और क्वेरी शुरू करता है जो the_content () को कॉल करता है, वर्तमान पोस्ट ऑब्जेक्ट को रीसेट करता है और लूप जारी रहता है? सभी फ़िल्टर लागू होंगे। यहाँ काफी मुश्किल, घंटी द्वारा बचाया नहीं in_the_loop () ... यही कारण है कि मैं सुझाव देता हूं, हमेशा अद्वितीय फिल्टर को हटाने के लिए जैसे ही उन्होंने किया, जैसा कि @ नीकोलाई
जोनास लुंडमैन ने

5

आप is_main_query()गलत उपयोग कर रहे हैं । वैश्विक is_main_query () फ़ंक्शन सही है जब तक कि वैश्विक $ wp_query चर को फिर से परिभाषित नहीं किया गया है।

यह बताने का कोई 100% विश्वसनीय तरीका नहीं है कि a_content फ़िल्टर के अंदर से, आप जिस वर्तमान लूप में हैं, वह मुख्य क्वेरी है या नहीं। सामग्री फ़िल्टर केवल सामग्री फ़िल्टर करता है। इसमें यह जानने की क्षमता नहीं है कि यह किस लूप के लिए इस्तेमाल किया जा रहा है।

इसके बजाय, आपको अपना फ़िल्टर तब जोड़ना चाहिए जब आपको इसकी आवश्यकता हो, तब इसे हटा दें जब आप इसे न करें।


यह वास्तव में एक लेट-डाउन है कि the_contentफ़िल्टर के साथ मुख्य क्वेरी को लक्षित करने के लिए कोई स्ट्रेफ़्फ़वर्डवर्ड साधन नहीं है
पीटर गोएप

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