वर्डप्रेस टेम्प्लेट लोडर में कई संदर्भों में उपयुक्त प्रासंगिक टेम्प्लेट फ़ाइल शामिल होगी, भले ही उस संदर्भ के लिए क्वेरी कोई पोस्ट न लौटाए। उदाहरण के लिए:
- मुख्य ब्लॉग पोस्ट इंडेक्स
- श्रेणी पुरालेख सूचकांक (श्रेणी मौजूद है, लेकिन कोई पोस्ट नहीं है)
- टैग पुरालेख सूचकांक (टैग मौजूद है, लेकिन कोई पोस्ट नहीं है)
- लेखक पुरालेख सूचकांक (लेखक मौजूद है, लेकिन कोई पोस्ट नहीं है)
- खोज परिणाम सूचकांक
इस प्रकार, इन मामलों में, उपयुक्त टेम्प्लेट फ़ाइल लोड की जाएगी, लेकिन कोई भी पोस्ट आउटपुट नहीं होगी, क्योंकि क्वेरी कोई पोस्ट नहीं लौटाती है।
अवधारणा के सबूत:
तो, इन संदर्भों में, यह if ( have_posts() )
सशर्त शामिल करने के लिए टेम्पलेट फ़ाइल के लिए उपयोगी है ।
अन्य संदर्भों में, यदि क्वेरी वापस नहीं आती है तो टेम्पलेट फ़ाइल लोड नहीं होगी। उदाहरण के लिए:
- एकल ब्लॉग पोस्ट
- स्टेटिक पेज
इन संदर्भों में, if ( have_posts() )
शायद अनावश्यक है।
संपादित करें
मुझे समझ में आया कि क्वेरी the_post (), सही है? और अगर (has_posts ()) मौजूद हैं, तो कोई पोस्ट नहीं होने पर क्वेरी कभी नहीं होती है।
यह समझने के लिए कि आपको क्या करना है, आपको वर्डप्रेस कार्यों के क्रम को देखना होगा । शुरुआत wp_loaded
(और स्पष्टता के लिए कुछ छोड़ना):
wp_loaded
parse_request
send_headers
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
wp_footer
तो, क्या हो रहा है, और किस क्रम में है?
- क्वेरी आमंत्रित है:
parse_query
pre_get_posts
wp
- टेम्प्लेट चयनित है:
- टेम्पलेट लोड / आउटपुट है। निम्नलिखित क्रियाएं टेम्पलेट द्वारा निकाल दी जाती हैं :
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
तो, the_post
, द्वारा चलाई the_post()
, होता है लंबे समय के बाद क्वेरी पार्स किया गया है, पदों लाई जाती हैं, और टेम्पलेट भरी हुई है।
मैं बहुत आभारी हूं कि आप बहुत सी जानकारी देते हैं जो मुझे नहीं पता था, लेकिन यह वह नहीं है जो मैंने पूछा था।
ओह, लेकिन मेरा मानना है कि यह वही है जो आपने पूछा था।
असली सवाल यह है: एक वैध क्वेरी रिटर्न क्या है ? श्रेणी संग्रह सूचकांक जैसे संदर्भों के लिए, क्वेरी मान्य है, और श्रेणी टेम्प्लेट लोड किया गया है, यदि queried श्रेणी ID मौजूद है, भले ही उस श्रेणी में कोई पद असाइन न किए गए हों ।
क्यूं कर? क्योंकि क्वेरी को पार्स किया जा रहा है (IIRC) &cat={ID}
- जो एक मान्य क्वेरी है, भले ही उस श्रेणी में कोई पद सौंपा न गया हो , और इस प्रकार पार्स करने पर 404 परिणाम नहीं होता है।
उस स्थिति में, आपको एक मान्य क्वेरी और एक टेम्पलेट फ़ाइल भरी हुई है, लेकिन कोई पोस्ट नहीं । इस प्रकार, if ( have_posts() )
, , वास्तव में है प्रासंगिक। फिर, यहाँ एक उदाहरण है: श्रेणी मौजूद है, लेकिन कोई भी पद नहीं दिया गया है। श्रेणी टेम्पलेट फ़ाइल लोड हो रही है, if ( have_posts() )
वापस आने के साथfalse
।
यह उन प्रश्नों के लिए सही नहीं होगा जिनमें एक पोस्ट वेरिएबल ( &p={ID}
जैसे कि सिंगल ब्लॉग पोस्ट और स्टैटिक पेज शामिल हैं, क्योंकि पोस्ट वास्तव में मौजूद नहीं होगा, और जब पार्स किया जाता है, तो क्वेरी एक मान्य ऑब्जेक्ट वापस नहीं करेगी।
संपादित करें 2
अगर मैं सही तरीके से समझता हूं कि यदि श्रेणी टेम्पलेट में कोई if (has_posts ()) नहीं है और श्रेणी में कोई पोस्ट नहीं है, तो वह 404.php पर वापस आ जाता है, भले ही वह पोस्ट-नमूना-नमूना होना चाहिए। पोस्ट के बिना। क्या वह सही है?
नहीं। याद रखें: टेम्पलेट का चयन किया जाता है template_redirect
। इसलिए यदि क्वेरी यदि मान्य है, तो उपयुक्त टेम्पलेट फ़ाइल भरी हुई है। यदि क्वेरी मान्य नहीं है, तो 404 टेम्पलेट लोड किया गया है।
इसलिए, एक बार एक टेम्प्लेट लोड होने के बाद - जैसे श्रेणी टेम्प्लेट - एक बार लूप आउटपुट होने के बाद, टेम्प्लेट नहीं बदलता है ।
कार्रवाई के क्रम पर फिर से देखें:
parse_query
pre_get_posts
wp
template_redirect
- टेम्प्लेट को यहां चुना और लोड किया गया है। यह नो रिटर्न का टेम्प्लेट प्वाइंट है । इस बिंदु के बाद टेम्पलेट नहीं बदल सकता है।
- ...
the_post
- लूप कॉल के हिस्से के रूप में पोस्टडेटा यहां सेटअप है। इसे टेम्पलेट के अंदर कहा जाता है , और क्वेरी ऑब्जेक्ट में उपलब्ध डेटा के आधार पर टेम्पलेट नहीं बदलता है
अंतिम संपादन
और मैं यह दावा कर रहा हूं कि पदों के अस्तित्व की जांच करते समय, मुझे एक ही परीक्षा को दो बार क्यों चलाना चाहिए। यह मेरा सवाल है, पहले बिंदु से मैं केवल उसी के बारे में पूछ रहा हूं।
और इसके साथ, मैं अंत में समझता हूं: सभी के साथ, आपके प्रश्न का वर्डप्रेस , या वर्डप्रेस लूप से कोई लेना-देना नहीं था । आप किसी सशर्त के while
अंदर किसी भी मनमाने ढंग से PHP लूप को लपेटने के बारे में पूछ रहे हैं if
जो समान स्थिति की जांच करता है।
यह सवाल डब्ल्यूपीएसई के दायरे से बाहर है, लेकिन मैं संक्षेप में समझाऊंगा:
एक if
सशर्त एक द्विआधारी मूल्यांकन है: यह true
या तो है false
, और उस सशर्त के अंदर क्या होता है एक बार निष्पादित किया जाता है ।
एक while
सशर्त एक लूप है : यह कुछ असतत अवधि के लिए सही रहता है, जो किसी प्रकार के काउंटर पर आधारित होता है; और उस स्थिति के अंदर क्या होता है , इसे कई बार निष्पादित किया जाता है - एक बार काउंटर के प्रत्येक पुनरावृत्ति के लिए।
तो, मान लें कि आप चीजों की सूची को अनियंत्रित करना चाहते हैं, अगर चीजों की सूची आबाद है। यदि आप एक while
लूप का उपयोग करते हैं , और if
आवरण को छोड़ देते हैं , तो आपका मार्कअप इस तरह दिखाई देगा:
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
और यदि list_of_things()
खाली था, तो प्रदान किया गया आउटपुट होगा:
<ul>
</ul>
जो अनावश्यक (और अमान्य) मार्कअप को छोड़ देता है।
लेकिन अगर आप if
सशर्त आवरण में जोड़ते हैं , तो आप ऐसा कर सकते हैं:
<?php if ( list_of_things() ) : ?>
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
और अगर list_of_things()
खाली था, तो कोई भी मार्कअप आउटपुट नहीं होगा।
वह सिर्फ एक उदाहरण है। उस if
सशर्त आवरण के लिए बहुत सारे उपयोग हैं , और if
सशर्त आवरण लूप की तुलना में पूरी तरह से अलग उद्देश्य प्रदान करता है while
।