बीच क्या अंतर है $GLOBALS['wp_the_query']और global $wp_query?
क्यों एक दूसरे पर पसंद करते हैं?
बीच क्या अंतर है $GLOBALS['wp_the_query']और global $wp_query?
क्यों एक दूसरे पर पसंद करते हैं?
जवाबों:
तुम्हें पता है, एक चूक गए $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कर रहे हैं
$wp_the_queryक्योंकि यह WP_Query::is_main_query()विधि से संबंधित है , जिसका उल्लेख नहीं किया गया था: डी
is_main_query()जो कि एक आवरण है WP_Query::is_main_query()जिसके लिए वर्तमान क्वेरी ऑब्जेक्ट को सहेजे गए मुख्य क्वेरी ऑब्जेक्ट के खिलाफ जांचता है $GLOBALS['wp_the_query']। यह काफी महत्वपूर्ण है जब आप pre_get_postsकार्रवाई चलाते हैं और सिर्फ मुख्य क्वेरी को लक्षित करना चाहते हैं; ;-)
is_main_query* महत्वपूर्ण EDIT अनुभाग में फ़ंक्शन का उल्लेख शामिल कर सकते हैं ? मैं pre_get_postsआज का उपयोग कर रहा था और जब से मैं देख रहा था उस समारोह का उपयोग करने के लिए यह पूरी तरह से उपयोगी पाया गया $wp_query।
मूल रूप से एक दूसरे की नकल है। बाहर की जाँच करें wp-settings.php, लाइनों 292-305:
$GLOBALS['wp_the_query'] = new WP_Query();
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
वैश्विक कीवर्ड चर को स्थानीय दायरे में आयात करता है, जबकि $ 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']
$GLOBALS['foo']अनुमति देता है । तो यह आपके द्वारा यहाँ वर्णित की तुलना में थोड़ा अधिक है।
global $wp_queryसिर्फ एक लाइन में आपके सवाल का जवाब देने के लिए कहूंगा !