क्या हमें पोस्ट ग्लोबल्स पर भरोसा करना चाहिए?


21

@toscho ने इस उत्तर के लिए एक टिप्पणी छोड़ दी, जो मुझे फिर से सोचनी थी। विशेष रूप से पोस्ट ग्लोबल्स जैसे वैश्विक दायरे में हमें कितना भरोसा करना चाहिए $post?

तो क्या? वैश्विक चर को आपके चेक रन से पहले सभी से अधिलेखित किया जा सकता है। यह वैश्विक चर का बिंदु है: वैश्विक पहुंच।

$postउदाहरण के लिए, निश्चित रूप से ग्लोबल्स में से एक है जिसे ज्यादातर या तो थीम के भीतर या प्लगइन्स द्वारा संशोधित किया गया है। फिर भी यह किसी दिए गए टेम्पलेट के भीतर अन्य अनुप्रयोगों में वैश्विक रूप से सबसे अधिक उपयोग किया जाता है, उदाहरण के लिए, संबंधित पोस्ट सेटअप करने के लिए।

कस्टम प्रश्नों के उपयोग के कारण होने वाली विशिष्ट समस्याओं के साथ कई पोस्टों पर (और टिप्पणी करने से) , यह वास्तव में पता चलता है कि ज्यादातर समस्याएँ कस्टम प्रश्नों को रीसेट नहीं किए जाने के कारण होती हैं (कस्टम क्वेरी मुख्य क्वेरी द्वारा सेट ग्लोबल्स को बदल देती हैं)।

इससे, यह स्पष्ट है कि $postविश्वसनीय नहीं है। कोई भी खराब लिखित कोड जो कस्टम क्वेरी का उपयोग करता है $post, वैश्विक को बदल सकता है , जो बदले में कुछ (जैसे संबंधित पोस्ट) को तोड़ देगा।

केवल मुट्ठी भर वर्डप्रेस डेवलपर्स वास्तव में कोर के आंतरिक कामकाज में पर्याप्त रूप से जानकार हैं और जानते हैं कि क्या से बचने के लिए और क्या नहीं। उपयोगकर्ताओं की अधिक आबादी को पता नहीं है कि वर्डप्रेस कोर कैसे संचालित होता है।

वे बस एक विषय डाउनलोड करते हैं और प्लगइन्स इंस्टॉल करते हैं जो कि आवश्यक है या यहां तक ​​कि सिर्फ एक ट्यूटोरियल से कोड कॉपी करते हैं। कहते हैं कि वे एक खराब लिखित प्लगइन स्थापित करते हैं जो उनके संबंधित पोस्ट को उनके एकल पोस्ट पर तोड़ देता है, उन्हें कैसे पता चलेगा कि इसका कारण क्या है? क्या वे यह छांट पाएंगे कि क्या वे इस समस्या के बारे में विषय लेखक को एक ईमेल लिखने वाले या इस साइट पर एक प्रश्न पोस्ट करने वाले सौवें व्यक्ति होंगे?

मेरा प्रश्न: जब एक वैश्विक जैसा $postइतना अविश्वसनीय हो तो आप अन्य आयातित कोड के कारण होने वाली ऐसी समस्याओं से कैसे सुरक्षित रह सकते हैं ? क्या हमें एक वैश्विक उपयोग की तरह होना चाहिए $post? विकल्प क्या हैं?

इससे पहले कि मैं निष्कर्ष निकालूं, अपने दिमाग को यहां साझा करने के लिए: मैंने (या कुछ विषयों और प्लगइन्स में देखा है, भी) या तो उपयोग करने wp_reset_postdata()से wp_reset_query()पहले या उपयोग करने से पहले $post, यह सुनिश्चित करने के लिए कि वैश्विक को मुख्य क्वेरी के लिए रीसेट किया जा रहा है $post। लेकिन मैं अपनी थीम में अपना कोड क्यों बढ़ाऊं क्योंकि किसी और ने उसका प्लगइन ठीक से कोड नहीं किया है? और अगर किसी ने अपने कस्टम क्वेरी को ठीक से रीसेट किया है, तो यह ऑपरेशन एक अनावश्यक दूसरी बार चलाया जाता है, जो अच्छा नहीं है।

दूसरी विधि जिसके बारे में मैंने सोचा था कि उसका उपयोग कर रही है $wp_queryऔर फिर उसके तरीकों का उपयोग कर रही है, जैसे कुछ $wp_query->post

इस पर किसी भी विचार की सराहना की जाएगी।


रीसेटिंग पोस्ट बस एक संस्करण को दूसरे में कॉपी करता है, आप कह सकते हैं कि आपके कोड में एक लाख बार और कोई प्रदर्शन हिट नहीं है, इसलिए मुझे नहीं पता कि इसके बारे में क्या अच्छा नहीं है।
हेलो

जवाबों:


16

एक दुखद सच्चाई है: आप कभी भी यह सुनिश्चित नहीं कर सकते हैं कि कुछ कोड आपके कोड को नहीं तोड़ेंगे , और ऐसा कुछ भी नहीं है जिसे आप रोक सकते हैं। खासकर वर्डप्रेस में, जहां सब कुछ ग्लोबल है।

उस ने कहा, हां, वैश्विक $postसबसे अधिक इस्तेमाल किया जाने वाला वैश्विक संस्करण है, इसलिए इसके लिए विशेष देखभाल का उपयोग करना एक अच्छा विचार हो सकता है।

अपने कोड में मैं शायद ही कभी सीधे वैश्विक पहुंच पाता हूं $post

जब एकवचन प्रतियोगिता में, मैं उपयोग करता हूं get_queried_object()और आमतौर पर जांचता हूं कि $postक्या वैध WP_Postउदाहरण है:

$post = get_queried_object();

if ( ! $post instanceof \WP_Post ) {
   die( 'What the f**k?!' );
}

मैं उस जांच को दुर्लभ मामलों में भी करता हूं जो मैं $postसीधे एक्सेस करता हूं ।

विचार करें कि get_queried_object()यदि कुछ कोड का उपयोग करता है तो एक अप्रत्याशित मूल्य देता है query_posts, लेकिन हे, अगर कोई कोड का उपयोग करता है जो कि निर्भर करता है query_posts, तो वे इसके लायक हैं यदि उनकी साइट का उपयोग किया जाता है

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

अगर मुझे अधिक जाँच और अधिक स्थानों की आवश्यकता है, तो मैं उन्हें करने के लिए एक फ़ंक्शन बनाता हूं:

function get_global_post() {
    global $post;
    if ( 
        ! $post instanceof \WP_Post
        || ! $post->post_type === 'mycpt'
        || ! in_array( $post->post_status, array( 'publish', 'private' ), true ) 
    ) {
        return false;
    }
    return $post;
}

$mypost = get_global_post();

if ( ! $mypost ) {
      die( 'What the f**k?!' );
}

कस्टम क्वेरी के अंदर, लूप करते समय, कॉलिंग the_post()पोस्ट ऑब्जेक्ट को रीसेट करता है, इसलिए यह ठीक होना चाहिए। फिर wp_reset_postdata()एक कस्टम क्वेरी के बाद कॉल करना मेरी ज़िम्मेदारी है , और मैं निश्चित रूप से ऐसा करता हूं :)

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