क्या WP_Query कॉल में wp_reset_query () का उपयोग करना आवश्यक है?


26

पोस्ट पुनर्प्राप्त करने के लिए मैं निम्नलिखित कोड का उपयोग कर रहा हूं:

<?php
$featuredPosts = new WP_Query();
$featuredPosts->query('showposts=5&cat=3');

while ($featuredPosts->have_posts()) : $featuredPosts->the_post(); ?>

    <h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
    <div class="meta">
        By <?php the_author() ?>
    </div>
    <div class="storycontent">
        <?php the_excerpt(); ?>
    </div>

<?php endwhile; ?>

क्या मुझे उपयोग करने की आवश्यकता है wp_reset_query()? अगर मैं करता हूं, तो मुझे कहां रखना चाहिए?



2
यदि आप पृष्ठ में कहीं और मुख्य क्वेरी ऑब्जेक्ट पर भरोसा कर रहे हैं, तो हाँ! आपको यह कहना चाहिए कि यह सुनिश्चित करने के लिए कि आपके कस्टम क्वेरी पर पुनरावृत्त होने से पहले मुख्य क्वेरी ऑब्जेक्ट में डेटा शामिल है। जब आप कॉल the_post()विधि (यानी। $my_custom_query->the_post()) आप पोस्ट चर को फिर से भरते हैं, तो मुख्य क्वेरी जिस पर दिखाई देती है, रीसेट आपको कॉल करते समय पिछले डेटा के साथ इन संस्करणों को फिर से भरता है। कस्टम प्रश्नों के बाद रीसेट का उपयोग करना अच्छा है।
t31os

जवाबों:


10

हाय @janoChen:

सरल उत्तर: नहीं।

WordPRess v3.0.4 wp_reset_query()से फ़ंक्शन के लिए PHP कोड क्या है और /wp-includes/query.phpसाथ ही बाद में कहे जाने वाले फ़ंक्शन क्या हैं। आप देख सकते हैं कि यह मुख्य रूप से वैश्विक चर को संशोधित करने के बारे में है।

जब आप उपयोग करते हैं new WP_Query($args)तो आप मानों को स्थानीय चर से रिटर्न मान प्रदान करेंगे, जब तक कि आप कुछ ऐसा जटिल नहीं कर रहे हैं कि आप पहले से ही इस प्रश्न का उत्तर जान लेंगे, तो आपको कॉल करने की आवश्यकता नहीं है wp_reset_query():

function wp_reset_query() {
  unset($GLOBALS['wp_query']);
  $GLOBALS['wp_query'] =& $GLOBALS['wp_the_query'];
  wp_reset_postdata();
}

function wp_reset_postdata() {
  global $wp_query;
  if ( !empty($wp_query->post) ) {
    $GLOBALS['post'] = $wp_query->post;
    setup_postdata($wp_query->post);
  }
}

function setup_postdata($post) {
  global $id, $authordata, $day, $currentmonth, $page, $pages, $multipage, $more, $numpages;

  $id = (int) $post->ID;

  $authordata = get_userdata($post->post_author);

  $day = mysql2date('d.m.y', $post->post_date, false);
  $currentmonth = mysql2date('m', $post->post_date, false);
  $numpages = 1;
  $page = get_query_var('page');
  if ( !$page )
    $page = 1;
  if ( is_single() || is_page() || is_feed() )
    $more = 1;
  $content = $post->post_content;
  if ( strpos( $content, '<!--nextpage-->' ) ) {
    if ( $page > 1 )
      $more = 1;
    $multipage = 1;
    $content = str_replace("\n<!--nextpage-->\n", '<!--nextpage-->', $content);
    $content = str_replace("\n<!--nextpage-->", '<!--nextpage-->', $content);
    $content = str_replace("<!--nextpage-->\n", '<!--nextpage-->', $content);
    $pages = explode('<!--nextpage-->', $content);
    $numpages = count($pages);
  } else {
    $pages = array( $post->post_content );
    $multipage = 0;
  }

  do_action_ref_array('the_post', array(&$post));

  return true;
}

-माइक


@ जोंकोचेन - हेह। वह निश्चित रूप से मुझे हाल ही में धक्का दे रहा है, यह सुनिश्चित करने के लिए है! मुझे लगता है जैसे वे कहते हैं, प्रतियोगिता नस्ल में सुधार करती है (लेकिन निश्चित रूप से मुझे कुछ और उत्पादक
बनने से रोकती

1
बस इसे पढ़ने वाले अन्य लोगों के लिए, क्योंकि यह अभी भी स्वीकृत उत्तर है (@ Rarst का उत्तर स्वीकार किया जाना चाहिए)। चूंकि ओपी the_post()अपने कोड में उपयोग करता है, इसलिए सर्वोत्तम अभ्यास निर्धारित करते हैं कि उसे उपयोग करना चाहिए wp_reset_postdata()wp_reset_query()कॉल wp_reset_postdata(), ताकि काम करेगा, हालांकि दूसरी चीज wp_reset_query()- $wp_queryवैश्विक चर को रीसेट करना - आवश्यक नहीं है, लेकिन इस मामले में हानिकारक नहीं है। तो इसका उत्तर वास्तव में YES है
टॉम ऑगर

21

यह के लिए आवश्यक नहीं है WP_Queryअपने आप में, लेकिन यह आवश्यक है (या कम से कम अच्छी बात करने के लिए) यदि आप किसी भी संबंधित कार्य / तरीकों (जैसे के रूप में उपयोग the_post()या setup_postdata()) अपने डेटा के साथ वैश्विक चर भरने के लिए।

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

कुल मिलाकर - इसे कॉल करने के लिए सार्थक प्रदर्शन जुर्माना नहीं है, इसलिए यह निर्णय लेने की तुलना में इसे हमेशा कॉल करना आसान है कि क्या आपको इसके बारे में भूलना चाहिए या रहस्यमय तरीके से कुछ टूट गया है।

अद्यतन करें

wp_reset_postdata()फ़ंक्शन अधिक उपयुक्त विकल्प लगता है। wp_reset_query()वैश्विक रीसेट करता है $wp_query(जो कस्टम WP_Queryऑब्जेक्ट प्रभावित नहीं करता है) और $post (जो ऊपर के रूप में हो सकता है) चर। wp_reset_postdata()केवल पुनर्स्थापित करता है $post, जो पर्याप्त होना चाहिए।


2

नहीं। यदि आप अपनी खुद की WP_Query वस्तु को पलटाते हैं, तो आपका अपना वह है जो आप करेंगे। हालाँकि, यदि आप global $wp_queryचर के साथ छेड़छाड़ करते हैं, ठीक है, तो आपका वैश्विक नामस्थान किसी की स्क्रिप्ट को प्रभावित करता है, जो समवर्ती रूप से उस चर का उपयोग कर रहा है। और यदि आप इसमें डेटा को बदलने के लिए कुछ करते हैं, तो आपको इसका उपयोग करने के बाद इसे रीसेट भी करना होगा।


0

यदि आप इस तरह से कस्टम क्वेरी का उपयोग कर रहे हैं

$cat = new WP_query(); 
$cat->query("cat=19,20,-23&showposts=5&orderby=rand"); 
while ($cat->have_posts()) : $cat->the_post(); 
  $data = get_post_meta( $post->ID, 'key', true );
$img_arrays []= $data['productimage']; 
$lnk_arrays[] =get_permalink($post_ID); 
endwhile; 
wp_reset_query(); 

तब आप समस्याओं में नहीं भागेंगे। अन्यथा, यदि एक ही पृष्ठ पर एक और लूप है तो आप कुछ अप्रत्याशित परिणाम प्राप्त करने के लिए बाध्य हैं। मैंने उपरोक्त कोड में wp_reset_query () का उपयोग नहीं किया था (जो कि मेरे शीर्ष लेख। Php फ़ाइल में रखा गया था। तब जब मैं एकल में मिला। तो अधिकतर मुझे अन्य श्रेणियों के विवरण पृष्ठ मिलते हैं, जो निराशाजनक थे। बाद में, मैंने महसूस किया कि मैं। शीर्ष पर क्वेरी को रीसेट करना भूल गया। जल्द ही, यह एक आकर्षण की तरह काम करना शुरू कर दिया।

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