WP_Query çağrısında wp_reset_query () kullanmak gerekli midir?


26

Gönderileri almak için aşağıdaki kodu kullanıyorum:

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

Kullanmam gerekir wp_reset_query()mi? Yaparsam, nereye yerleştirmeliyim?



2
Ana sorgu nesnesine sayfadaki başka bir yere güveniyorsanız, Evet! Ana sorgu nesnesinin verileri içerdiğinden emin olmak için onu çağırmalısınız, özel sorgunuzu yinelemeden önce. the_post()Yöntemi çağırdığınızda (örn. $my_custom_query->the_post()) Ana sorgunun baktığı post değişkenlerini doldurursanız, sıfırlama işlemi, bunları çağırdığınızda önceki verilerle yeniden doldurur. Özel sorgulardan sonra sıfırlamaları kullanmak iyi bir uygulamadır.
t31os

Yanıtlar:


10

Merhaba @janoChen:

Basit cevap: hayır.

Aşağıda fonksiyon için PHP kodu nedir wp_reset_query()dan /wp-includes/query.phpWordpress v3.0.4 yanı sıra fonksiyonları sonradan denir. Bunun genel değişkenleri değiştirmenin öncelikli olduğunu görebilirsiniz.

Kullandığınızda new WP_Query($args), dönüş değerini değerlerden yerel bir değişkene atayacaksınız, bu yüzden o kadar karmaşık bir şey yapmazsanız, o zaman için bu sorunun cevabını zaten bildiğinizden hayır, aramanız gerekmez 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. Kesinlikle son zamanlarda beni zorluyor, bu kesin! Sanırım dedikleri gibi rekabet, cinsi iyileştiriyor (ama kesinlikle beni üretken bir şey
yapmamdan alıkoyuyor

1
Sadece bunu okuyanlar için, bu hala kabul edilen bir cevap olduğundan (@ Rarst'ın cevabı kabul edilmelidir). OP the_post()kodunda kullandığından , en iyi uygulamalar kullanması gerektiğini belirtir wp_reset_postdata(). wp_reset_query()çağrılar wp_reset_postdata(), böylece işe yarayacak, başka bir şey olsa da wp_reset_query()- $wp_querygenel değişkeni sıfırlamak - gerekli değil, bu durumda zararlı değil. Yani cevap aslında EVET
Tom Auger

21

Kendi WP_Querybaşına gerekli değildir , ancak global değişkenleri verilerinizle doldurmak için ilgili işlevler / yöntemler ( the_post()veya gibi setup_postdata()) kullanırsanız gereklidir (veya yapılması en iyi şeydir) .

Temel olarak yeni bir WP_Querynesne oluşturmak sadece veri alımıdır, ancak aktif döngüyü çalıştırmak ve verileri şablon etiketlerine erişilebilir kılmak çevreyi değiştirir ve daha sonra her şeyi sıfırlamak iyidir.

Genel olarak - onu aramak anlamlı bir performans cezası değildir, bu yüzden her zaman aramak, onu unutmak ya da unutmak ve gizemli bir şekilde kırılmış bir şeye sahip olup olmamaya karar vermekten daha kolaydır.

Güncelleştirme

wp_reset_postdata()işlev daha uygun bir seçim gibi görünüyor. wp_reset_query()global $wp_query(hangi özel WP_Querynesnenin etkilemeyeceği) ve $post (yukarıdaki gibi olabilir) değişkenlerini sıfırlar . wp_reset_postdata()sadece restorasyonlar $post, ki bu yeterli olmalı.


2

Hayır. Kendi WP_Query nesnesini başlatırsanız, ne yapacağınızla ilgili olarak sizindir. Bununla birlikte, global $wp_querydeğişkeni tahrif ederseniz , o zaman, aynı anda bu değişkeni kullanan herkesin komut dosyasını etkileyen global ad alanındasınız. Ve içindeki verileri değiştirmek için bir şey yaparsanız, kullandıktan sonra onu da sıfırlamanız gerekir.


0

Eğer böyle bir özel sorgu kullanıyorsanız

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

O zaman sorunla karşılaşmazsın. Aksi takdirde, aynı sayfada beklenmedik sonuçlar elde etmek için bağladığınız başka bir döngü varsa. Yukarıdaki kodda wp_reset_query () kullanmadım (hangi header.php dosyama yerleştirildi. Sonra single.php'ye girdiğimde çoğunlukla diğer kategorilerin ayrıntı sayfalarını sinir bozucu hale getirdim. sorguyu en başa sıfırlamayı unuttum Yakında bir çekicilik gibi çalışmaya başladı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.