$ GLOBALS ['wp_the_query'] बनाम वैश्विक $ wp_query


16

बीच क्या अंतर है $GLOBALS['wp_the_query']और global $wp_query?

क्यों एक दूसरे पर पसंद करते हैं?


2
मैं global $wp_queryसिर्फ एक लाइन में आपके सवाल का जवाब देने के लिए कहूंगा !
सुमित

अंतर क्या है?
नाथन पॉवेल

जवाबों:


27

तुम्हें पता है, एक चूक गए $GLOBALS['wp_query']। सभी प्रयोजनों के लिए, $GLOBALS['wp_query'] === $wp_query$GLOBALS['wp_query']हालाँकि पठनीयता के लिए बेहतर है और इसके बजाय $wp_query, BUT का उपयोग किया जाना चाहिए , जो व्यक्तिगत प्राथमिकता बनी हुई है

अब, एक आदर्श दुनिया में जहां इकसिंगों ने दुनिया पर राज किया है $GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query। डिफ़ॉल्ट रूप से, यह सही होना चाहिए। यदि हम देखते हैं कि ये ग्लोबल्स कहाँ सेट किए गए हैं ( wp-settings.php), तो आप देखेंगे कि मुख्य क्वेरी ऑब्जेक्ट में संग्रहीत है $GLOBALS['wp_the_query']और $GLOBALS['wp_query']सिर्फ एक डुप्लिकेट कॉपी है$GLOBALS['wp_the_query']

/**
 * WordPress Query object
 * @global WP_Query $wp_the_query
 * @since 2.0.0
 */
$GLOBALS['wp_the_query'] = new WP_Query();
/**
 * Holds the reference to @see $wp_the_query
 * Use this global for WordPress queries
 * @global WP_Query $wp_query
 * @since 1.5.0
 */
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

इस तरह से करने का कारण यह है, क्योंकि वर्डप्रेस ने query_postsसंस्करण 1.5 में आगमन को देखा ।

function query_posts($query) {
    $GLOBALS['wp_query'] = new WP_Query();
    return $GLOBALS['wp_query']->query($query);
}

जैसा कि आप देख सकते हैं, query_postsमुख्य क्वेरी ऑब्जेक्ट को वर्तमान कस्टम क्वेरी beign रन पर सेट करता है। यह मुख्य क्वेरी ऑब्जेक्ट की अखंडता को तोड़ता है, जो आपको गलत डेटा देता है, इसलिए मुख्य क्वेरी ऑब्जेक्ट पर निर्भर होने वाली कोई भी चीज़ गलत डेटा के कारण टूट जाती है।

इसका मुकाबला करने का एक तरीका मुख्य क्वेरी ऑब्जेक्ट को संग्रहीत करने के लिए एक और वैश्विक बनाना $GLOBALS['wp_the_query']था , जिसे संस्करण 2.0.0 में पेश किया गया था। यह नया वैश्विक मुख्य क्वेरी ऑब्जेक्ट और $GLOBALS['wp_query']सिर्फ एक कॉपी है। इसके माध्यम से wp_reset_query(), हम अब $GLOBALS['wp_query']इसकी अखंडता को बहाल करने के लिए मूल मुख्य क्वेरी ऑब्जेक्ट पर वापस रीसेट कर सकते हैं ।

लेकिन यह एक आदर्श दुनिया नहीं है, और query_postsखुद शैतान हैं। हालाँकि हजारों चेतावनियाँ, लोग अभी भी इस्तेमाल करते हैं query_posts। मुख्य क्वेरी को तोड़ने के अलावा, यह मुख्य क्वेरी को फिर से जोड़ देता है, जिससे यह सामान्य कस्टम क्वेरी के साथ बहुत धीमी हो जाती है WP_Query। बहुत से लोग ऐसा करने पर query_postsक्वेरी को रीसेट नहीं करते हैं wp_reset_query(), जो query_postsऔर भी अधिक बुराई करता है।

क्योंकि हम उस बारे में कुछ नहीं कर सकते हैं, और प्लगइन्स और थीम को उपयोग करने से नहीं रोक सकते हैं query_postsऔर हम कभी भी यह नहीं जान सकते हैं कि क्या किसी query_postsक्वेरी के साथ रीसेट किया गया था wp_reset_query(), हमें मुख्य क्वेरी ऑब्जेक्ट की अधिक विश्वसनीय प्रतिलिपि की आवश्यकता है, जिसे हम जानते हैं कि हमें 99.99999% विश्वसनीय, सही डेटा। जहां यही कारण है $GLOBALS['wp_the_query']उपयोगी है के रूप में कोई वर्डप्रेस संबंधित कोड यह मूल्य (बदल सकते हैं फिल्टर और अंदर कार्यों के माध्यम से छोड़कर WP_Queryही )।

त्वरित प्रमाण, निम्नलिखित चलाएँ

var_dump( $GLOBALS['wp_the_query'] );
var_dump( $GLOBALS['wp_query'] );

query_posts( 's=crap' );


var_dump( $GLOBALS['wp_the_query'] );
var_dump( $GLOBALS['wp_query'] );

और परिणामों की जाँच करें। $GLOBALS['wp_the_query']नहीं बदला, और $GLOBALS['wp_query']है। तो कौन सा अधिक विश्वसनीय है?

अंतिम नोट, के $GLOBALS['wp_the_query']लिए एक प्रतिस्थापन नहीं है wp_reset_query()wp_reset_query()चाहिए हमेशा साथ प्रयोग किया जा query_posts, और query_postsचाहिए कभी नहीं इस्तेमाल किया जा।

समाप्त करने के लिए

यदि आपको विश्वसनीय कोड की आवश्यकता है जो लगभग हमेशा विफल नहीं होगा $GLOBALS['wp_the_query'], तो उपयोग करें , यदि आप प्लगइन्स और थीम कोड पर विश्वास करते हैं और विश्वास करते हैं कि कोई भी उपयोग नहीं करता है query_postsया इसे सही तरीके से उपयोग कर रहा है, $GLOBALS['wp_query']या$wp_query

महत्वपूर्ण संस्करण

कुछ वर्षों से इस साइट पर सवालों के जवाब देने के कारण, मैंने कई उपयोगकर्ताओं $wp_queryको स्थानीय चर के रूप में उपयोग करते हुए देखा , जो बदले में मुख्य क्वेरी ऑब्जेक्ट को भी तोड़ता है। यह आगे की भेद्यता को बढ़ाता है $wp_query

उदाहरण के लिए, कुछ लोगों को यह

$wp_query = new WP_Query( $args );

जो सार रूप में वही है जो query_postsकर रहे हैं


1
query_posts () परिवर्तन global $wp_queryमुख्य प्रश्नglobal $wp_the_query का संदर्भ रखती है
इवान मैटसन

मेरी टिप्पणी एक सुधार के रूप में अभिप्रेत नहीं थी, इसलिए यदि यह किया तो मेरी क्षमा याचना। मैं केवल संक्षेप में बता रहा था (टीएल; डीआर अगर आप), तो यह बताते हुए कि मेरा मानना ​​है कि यह सबसे महत्वपूर्ण पहलुओं में से एक है $wp_the_queryक्योंकि यह WP_Query::is_main_query()विधि से संबंधित है , जिसका उल्लेख नहीं किया गया था: डी
इवान मैटसन

@ इवानमैट्सन माफी, मैंने आपकी पहली टिप्पणी को गलत समझा; ;-) हां, is_main_query()जो कि एक आवरण है WP_Query::is_main_query()जिसके लिए वर्तमान क्वेरी ऑब्जेक्ट को सहेजे गए मुख्य क्वेरी ऑब्जेक्ट के खिलाफ जांचता है $GLOBALS['wp_the_query']। यह काफी महत्वपूर्ण है जब आप pre_get_postsकार्रवाई चलाते हैं और सिर्फ मुख्य क्वेरी को लक्षित करना चाहते हैं; ;-)
पीटर गोअर्स

बहुत अच्छा किया जवाब! @ EvanMattson एक संपादन होना चाहिए था ।
केसर

क्या आप is_main_query* महत्वपूर्ण EDIT अनुभाग में फ़ंक्शन का उल्लेख शामिल कर सकते हैं ? मैं pre_get_postsआज का उपयोग कर रहा था और जब से मैं देख रहा था उस समारोह का उपयोग करने के लिए यह पूरी तरह से उपयोगी पाया गया $wp_query
नाथन पॉवेल

2

मूल रूप से एक दूसरे की नकल है। बाहर की जाँच करें wp-settings.php, लाइनों 292-305:

$GLOBALS['wp_the_query'] = new WP_Query();

$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

2

वैश्विक कीवर्ड चर को स्थानीय दायरे में आयात करता है, जबकि $ GLOBALS आपको केवल चर तक पहुंच देता है।

विस्तृत करने के लिए, यदि आप उपयोग global $wp_the_query; करते हैं तो आप $wp_the_queryफिर से वैश्विक शब्द का उपयोग किए बिना स्थानीय दायरे के अंदर उपयोग कर सकते हैं । तो मूल रूप global $wp_the_queryसे तुलना की जा सकती है$wp_the_query = $GLOBALS['wp_the_query']

संपादित करें

मैंने wp_the_query के लिए wp_query को गलत बताया है, इसलिए मेरा उत्तर प्रश्न का पूर्ण उत्तर नहीं है, लेकिन फिर भी अंतर के बारे में सामान्य जानकारी प्रदान करता है global $variableऔर$GLOBALS['variable']


कृपया, संपादन संपादित करें क्योंकि यह वास्तव में मूल प्रश्न का उत्तर नहीं है। बस FYI चर को ओवरराइड करने या परेशान करने की $GLOBALS['foo']अनुमति देता है । तो यह आपके द्वारा यहाँ वर्णित की तुलना में थोड़ा अधिक है।
कासर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.