จำเป็นต้องใช้ wp_reset_query () ในการโทร WP_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()) คุณเติมตัวแปรโพสต์ที่แบบสอบถามหลักดูการรีเซ็ตจะเติมข้อมูล vars เหล่านี้ด้วยข้อมูลก่อนหน้านี้เมื่อคุณเรียกใช้ เป็นวิธีปฏิบัติที่ดีในการใช้การรีเซ็ตหลังจากการสืบค้นที่กำหนดเอง
t31os

คำตอบ:


10

สวัสดี@janoChen:

คำตอบง่ายๆ: ไม่

สิ่งที่ตามมาคือโค้ด PHP สำหรับฟังก์ชั่นwp_reset_query()จาก/wp-includes/query.phpใน WordPRess v3.0.4 รวมถึงฟังก์ชั่นที่เรียกในภายหลัง คุณสามารถเห็นได้ว่ามันเกี่ยวกับการปรับเปลี่ยนตัวแปรส่วนกลาง

เมื่อคุณใช้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;
}

-Mike


@janoChen - เฮ้ เมื่อเร็ว ๆ นี้เขาผลักดันฉันอย่างแน่นอนนั่นแน่นอน! ฉันเดาตามที่พวกเขาบอกว่าการแข่งขันช่วยปรับปรุงสายพันธุ์(แต่แน่ใจว่าทำให้ฉันไม่สามารถทำสิ่งอื่นได้สำเร็จ! '-)
MikeSchinkel

1
สำหรับคนอื่นที่อ่านข้อความนี้เนื่องจากนี่ยังเป็นคำตอบที่ยอมรับได้ (ควรเป็นคำตอบของ @ Rarst) ตั้งแต่การใช้ OP ในรหัสของเขาปฏิบัติที่ดีที่สุดบอกว่าเขาจะต้องใช้the_post() การเรียกดังนั้นสิ่งนี้จะใช้ได้แม้ว่าสิ่งอื่นจะทำเช่นนั้น - การรีเซ็ตตัวแปรโกลบอล - ไม่จำเป็น แต่ไม่เป็นอันตรายในกรณีนี้ ดังนั้นคำตอบคือใช่แน่นอนwp_reset_postdata()wp_reset_query()wp_reset_postdata()wp_reset_query()$wp_query
Tom Auger

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 () ในโค้ดด้านบน (ซึ่งวางไว้ในไฟล์ header.php ของฉันจากนั้นเมื่อฉันเข้าสู่ single.php ส่วนใหญ่ฉันจะได้รับหน้ารายละเอียดของหมวดหมู่อื่นที่น่าผิดหวังต่อมาฉันรู้ว่าฉัน ลืมรีเซ็ตข้อความค้นหาที่ด้านบนในไม่ช้ามันก็เริ่มทำงานเหมือนมีเสน่ห์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.