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:

簡単な答え:いいえ。

以下は、何を関数のPHPコードであるwp_reset_query()から、/wp-includes/query.phpWordPressの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;
}

-マイク


@janoChen-へえ。彼は間違いなく最近私をプッシュしている、それは確かです!彼らが言うように、競争は品種を改善するものと思います(しかし、他の生産性を
上げる

1
これを読んでいる他の人のためだけに、これはまだ受け入れられた答えなので(@Rarstの答えは受け入れられるべきです)。OPは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()を使用しませんでした(header.phpファイルに配置されました。single.phpになったときに、他のカテゴリの詳細ページが表示され、イライラしていました。上部のクエリをリセットするのを忘れてすぐに、それは魅力のように機能し始めました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.