अगर (has_posts ()) है, तो ऐसा क्यों करना चाहिए (has_posts ()) पर्याप्त नहीं है?


22

मेरे पास "लूप" के बारे में एक सवाल है।

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>

कोड लूप वर्डप्रेस कोडेक्स पेज से लिया गया है ।

मुझे क्यों ifभाग देना चाहिए ? ऐसा लगता है जैसे whileलूप है, ठीक काम करता है।

ifबयान नहीं होने पर किस स्थिति में समस्या होती है ?

संपादित करें

मैंने @ चिप का जवाब स्वीकार कर लिया। लेकिन ईमानदारी से कहूं तो मुझे केवल पिछले भाग की जरूरत है।

मुझे पता है कि अब मैं अपने सवाल से क्या जानना चाहता था।

ifबयान केवल तभी आवश्यक है, जब आप एक हेडर या फुटर डालना चाहते हैं जिसे केवल एक बार लिखा जाना चाहिए। यदि आप "आवरण" का उपयोग नहीं करते हैं, तो ifकथन आवश्यक नहीं है।


2
मैंने the_content पढ़ने से पहले मतदान किया, the_title निर्णायक है!
ब्रासोफिलो

उत्कृष्ट (अंतिम) संपादित करें। ज्यादातर लोग एक दूसरे का उपयोग किए बिना यदि एक-दूसरे के बाद सीधे और बाद में उपयोग करते हैं। संभवतः कॉपी और पेस्ट के कारण।
हरबर्ट वान-वैलेट

जवाबों:


29

वर्डप्रेस टेम्प्लेट लोडर में कई संदर्भों में उपयुक्त प्रासंगिक टेम्प्लेट फ़ाइल शामिल होगी, भले ही उस संदर्भ के लिए क्वेरी कोई पोस्ट न लौटाए। उदाहरण के लिए:

  • मुख्य ब्लॉग पोस्ट इंडेक्स
  • श्रेणी पुरालेख सूचकांक (श्रेणी मौजूद है, लेकिन कोई पोस्ट नहीं है)
  • टैग पुरालेख सूचकांक (टैग मौजूद है, लेकिन कोई पोस्ट नहीं है)
  • लेखक पुरालेख सूचकांक (लेखक मौजूद है, लेकिन कोई पोस्ट नहीं है)
  • खोज परिणाम सूचकांक

इस प्रकार, इन मामलों में, उपयुक्त टेम्प्लेट फ़ाइल लोड की जाएगी, लेकिन कोई भी पोस्ट आउटपुट नहीं होगी, क्योंकि क्वेरी कोई पोस्ट नहीं लौटाती है।

अवधारणा के सबूत:

तो, इन संदर्भों में, यह 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
  • टेम्प्लेट चयनित है:
    • template_redirect
  • टेम्पलेट लोड / आउटपुट है। निम्नलिखित क्रियाएं टेम्पलेट द्वारा निकाल दी जाती हैं :
    • 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


2
मेरी विलक्षण पोस्ट / पेज टेम्प्लेट में, एक लंबे समय के बाद से, मैं केवल the_post();इसलिए उपयोग करता हूं क्योंकि यह भी whileअनावश्यक है। Informations की पूर्णता के लिए +1।
gmazzap

@GM संभवतः if( have_posts() )कथन को हटाने से समझ में आता है (कि मैं क्या जानने की कोशिश कर रहा हूँ), लेकिन सिर्फ the_post()एकवचन पृष्ठों में उपयोग न करें !
सूर्यास्तत्त्व

@ChipBennett सभी माना जाता है, आपको लगता है इसे हटाने के लिए सुरक्षित है if( have_post() )के संदर्भ में पूर्ण पाश से पहले हालत single-*.phpऔर page-*.phpटेम्पलेट फ़ाइलों?
सूर्यास्तत्त्व

1
"सुरक्षित" का वास्तव में इस संदर्भ में कोई निश्चित अर्थ नहीं है।
चिप बेनेट

10

चिप के जवाब में सुधार करना वास्तव में असंभव है, लेकिन सिर्फ पीछा करने के लिए कटौती करने के लिए:

ifअगर आप कोई पोस्ट नहीं चाहते हैं तो कुछ अलग दिखाना चाहते हैं, तो उस हिस्से का उपयोग करें । यह विशेष रूप से उपयोगी है, उदाहरण के लिए, दिनांक या श्रेणी संग्रह पृष्ठ पर। यदि कोई ऐसे पृष्ठ पर नेविगेट करता है जिसमें कोई पोस्ट नहीं है, तो ऐसा संदेश देना अच्छा है जो ऐसा कहता है, बजाय इसके कि कुछ भी दिखाई न दे, क्योंकि लूप कभी भी निष्पादित नहीं होता है।

if ( have_posts() ):
  // Yep, we have posts, so let's loop through them.
  while ( have_posts() ) : the_post();
  // do your loop
  endwhile;
else :
  // No, we don't have any posts, so maybe we display a nice message
  echo "<p class='no-posts'>" . __( "Sorry, there are no posts at this time." ) . "</p>";
endif;

और यह सब जानने की जरूरत है।
हर्बर्ट वान-व्लिएट

0

कुछ विचार हो सकते हैं जो अब तक के उत्तरों में शामिल नहीं हैं। यदि यह कथन को छोड़ना अनुशंसित नहीं है।

यदि आमतौर पर इस कथन का उपयोग किया जाता है:

  • आउटपुट कुछ इस तरह no posts foundइंगित करता है कि प्रश्न में श्रेणी के पास कोई लेख नहीं है।
  • यह तय करने के लिए कि लेखों के पहले और बाद में आसपास के html (जैसे ul) का आउटपुट होना चाहिए।

यदि एक नया हुक जोड़ा जाता है तो क्या होगा?

यदि इस कथन का उपयोग न करने का एक अन्य संभावित मुद्दा यह है कि यदि वर्डप्रेस टीम ने कभी भी एक नया हुक जोड़ने का फैसला किया है जो पहली $wp_query->have_posts()कॉल पर ट्रिगर होता है, तो यह गलत समय पर ट्रिगर होगा। और अगर यह अप्रत्याशित व्यवहार का कारण बनता है तो यह ठीक से कल्पना का पालन नहीं करने के लिए आपकी गलती होगी।

अन्य देवता वर्डप्रेस लूप के लिए एक विशिष्ट संरचना देखने की उम्मीद करते हैं

मुझे लगता है कि अन्य डेवलपर्स पूरे वर्डप्रेस लूप को देखने की उम्मीद करते हैं। तो शायद यह एक बुरा विचार है कि अगर वे नहीं हैं तो एक बयान की खोज करें।


-1

मैं इसे नियंत्रण संरचना सिद्धांत के मूल प्रश्न के रूप में देखता हूं। जबकि लूप के भीतर संलग्न ब्लॉक एक बार भी निष्पादित नहीं करता है यदि स्थिति (has_posts ()) पहली बार झूठी के रूप में मूल्यांकन करती है।

इसलिए, if ( have_posts() )वर्डप्रेस लूप का उद्देश्य केवल फ़ंक्शन has_posts () को निष्पादित करना है, जबकि एक बार स्थिति का मूल्यांकन करने से पहले। यदि have_posts()कोई साइड-इफेक्ट नहीं है, तो if ( have_posts() )पूरी तरह से व्यर्थ है। यदि have_posts()साइड-इफेक्ट्स हैं, तो आप निम्नानुसार सरल कर सकते हैं:

<?php have_posts(); ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>

3
यह सरलीकरण अमान्य PHP है, आपके पास एक और कथन है, यदि कथन में कोई संलग्न नहीं है। सबसे अच्छे रूप में इसे पढ़ने के लिए मुश्किल है
टॉम जम्मू नॉवेल

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