Apakah perlu menggunakan wp_reset_query () dalam panggilan WP_Query?


26

Saya menggunakan kode berikut untuk mengambil posting:

<?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; ?>

Apakah saya perlu menggunakan wp_reset_query()? Jika saya melakukannya, di mana saya harus meletakkannya?



2
Jika Anda mengandalkan objek kueri utama di tempat lain di halaman, maka Ya! Anda harus memanggilnya, untuk memastikan objek kueri utama berisi data dilakukan sebelum Anda mengulangi permintaan kueri Anda. Ketika Anda memanggil the_post()metode (mis. $my_custom_query->the_post()) Anda mengisi ulang variabel pos yang dilihat oleh kueri utama, reset mengisi ulang vars ini dengan data sebelumnya saat Anda menyebutnya. Merupakan praktik yang baik untuk menggunakan pengaturan ulang setelah permintaan khusus.
t31os

Jawaban:


10

Hai @janoChen:

Jawaban sederhana: tidak.

Apa yang mengikuti adalah apa kode PHP untuk fungsi wp_reset_query()dari /wp-includes/query.phpdi WordPRess v3.0.4 serta fungsi yang selanjutnya disebut. Anda dapat melihat bahwa ini terutama tentang memodifikasi variabel global.

Saat Anda menggunakan, new WP_Query($args)Anda akan menetapkan nilai kembalinya dari nilai ke variabel lokal, kecuali Anda melakukan sesuatu yang sangat rumit sehingga Anda sudah tahu jawaban untuk pertanyaan ini, maka tidak, Anda tidak perlu menelepon 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 - heh. Dia pasti mendorongku belakangan ini, itu sudah pasti! Saya kira seperti yang mereka katakan, kompetisi meningkatkan trah (tapi tentu saja membuat saya tidak produktif lagi! '-)
MikeSchinkel

1
Hanya untuk orang lain yang membaca ini, karena ini masih merupakan jawaban yang diterima (jawaban @ Rarst harus diterima). Karena OP menggunakan the_post()dalam kodenya, praktik terbaik menentukan bahwa ia harus menggunakannya wp_reset_postdata(). wp_reset_query()panggilan wp_reset_postdata(), sehingga akan bekerja, meskipun hal lain wp_reset_query()tidak - mengatur ulang $wp_queryvariabel global - tidak perlu, tetapi tidak berbahaya dalam kasus ini. Jadi jawabannya sebenarnya YA
Tom Auger

21

Itu tidak perlu untuk WP_Querydirinya sendiri, tetapi perlu (atau setidaknya hal yang baik untuk dilakukan) jika Anda menggunakan fungsi / metode terkait (seperti the_post()atau setup_postdata()) untuk mengisi variabel global dengan data Anda.

Pada dasarnya menciptakan WP_Queryobjek baru hanyalah pengambilan data, tetapi menggunakannya untuk menjalankan loop aktif dan membuat data dapat diakses ke tag templat tidak mengubah lingkungan dan itu baik untuk mengatur ulang semuanya setelah itu.

Secara keseluruhan - itu bukan penalti kinerja yang berarti untuk menyebutnya, jadi lebih mudah untuk selalu menyebutnya daripada memutuskan apakah Anda harus atau melupakannya dan memiliki sesuatu yang rusak secara misterius.

Memperbarui

wp_reset_postdata()fungsi sepertinya menjadi pilihan yang lebih pas. wp_reset_query()me-reset variabel global $wp_query(yang WP_Queryobjek kustom tidak mempengaruhi) dan $post (yang mungkin seperti di atas). wp_reset_postdata()hanya mengembalikan $post, yang seharusnya cukup.


2

Tidak. Jika Anda instantiate objek WP_Query Anda sendiri, itu milik Anda untuk melakukan apa yang Anda inginkan. Namun, jika Anda mengutak-atik global $wp_queryvariabel, maka Anda di namespace global memengaruhi skrip siapa pun yang secara bersamaan menggunakan variabel itu. Dan jika Anda melakukan sesuatu untuk mengubah data di dalamnya, Anda juga harus mengatur ulang setelah selesai menggunakannya.


0

Jika Anda menggunakan permintaan khusus seperti ini

$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(); 

Maka Anda tidak akan mengalami masalah. Kalau tidak, jika pada halaman yang sama ada loop lain Anda terikat untuk mendapatkan beberapa hasil yang tidak terduga. Saya tidak menggunakan wp_reset_query () dalam kode di atas (yang ditempatkan di file header.php saya. Kemudian ketika saya masuk ke single.php sebagian besar saya mendapatkan halaman detail dari kategori lain yang membuat frustrasi. Kemudian, saya menyadari bahwa saya lupa untuk mereset kueri di atas. Segera, itu mulai berfungsi seperti mantra.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.