2017-02-03 7 views
1

WordPressコーデックスやさまざまなテーマで読んだことがあります。ブログループのendif;の後に<?php wp_reset_postdata(); ?>を挿入している開発者もいれば、ブログループのendwhile;endif;の間にコードを挿入する開発者もいます。私は両方の場所を試しましたが、違いはまだ見えていません。正しい場所はありますか?wp_reset_postdata()を配置する必要があります。終わった後。またはendif; ?

答えて

0

wp_reset_postdata()は、セカンダリループ(ページで追加のクエリを実行している場合)のみ必要です。この関数の目的は、グローバルポスト変数をメインクエリの現在のポストに戻すことです。

例:私は単に記事を表示するメインループを使用している上記のコードで

<?php if (have_posts()) : while (have_posts()) : the_post(); ?> 

    OUTPUT MAIN POSTS HERE 

<?php endwhile; endif; ?> 

wp_reset_postdata()を含める理由はありません。グローバルポスト変数はまさにそれが想定していたものです。

ページのどこかで2次ループを追加する場合は、wp_reset_postdata()が必要です。それは通常endwhile後とendifの前に来る:あなたの元の質問に答えるために

// This query is just an example. It works but isn't particularly useful. 
$secondary_query = new WP_Query(array(
    'post_type' => 'page' 
)); 

if ($secondary_query->have_posts()) : 

    // Separating if and while to make answer clearer. 
    while ($secondary_query->have_posts()) : $secondary_query->the_post(); 

     // OUTPUT MORE STUFF HERE. 

    endwhile; 

    wp_reset_postdata(); 

endif; 

。実際にグローバルポスト変数を変更するのはthe_post()への呼び出しです。投稿がない場合、投稿変数は同じままであり、リセット機能を使用する理由はありません。

+0

Nathan Dawsonありがとうございます。とても有難い。 – Craig

1

あなたが実行seconderyクエリをリセットすることになって、この関数は..機能the_postは、あなたがそうでthe_title()the_contentなどのループ内で実行することができ、すべての機能を利用することができせます。..

だから、リセットthe_post機能を使用し、endwhile;の後には、既にリセットすることができます。あなたが好きであれば、ifの文の中にあなたの主な質問を使用してください。

<?php 
// this is the main query check if there is posts 
if (have_posts()) : 
    // loop the main query post and run the_post() function on each post that you can use the function the_title() and so on.. 
    while (have_posts()) : the_post(); 
     the_title(); // title of the main query 

     // the is second query 
     $args = array('posts_per_page' => 3); 
     $the_query = new WP_Query($args); 
     // check if there is a posts in the second query 
     if ($the_query->have_posts()) : 
      // run the_post on the second query now you can use the functions.. 
      while ($the_query->have_posts()) : $the_query->the_post(); 
       the_title(); 
       the_excerpt(); 
      endwhile; 

      // reset the second query 
      wp_reset_postdata(); 

      /* here we can use the main query function already if we want.. 
      its in case that you want to do something only if the second query have posts. 
      You can run here third query too and so on... 
      */ 

      the_title(); // title of the main query for example 

     endif; 

    endwhile; 
endif; 
?> 
+0

ご回答ありがとうございます。 'have_posts'がプライマリクエリで、' the_post'がセカンダリクエリです。これを念頭に置いて、私は '<?php wp_reset_postdata(); ?> 'endwhile;の後に(あなたの例のように)、私は' <?php the_title();を防ぐでしょう。 ?> 'と' <?php the_excerpt(); ?> '私の次のBlog Loopに持ちこたえたら、私は1つ入れるべきですか? – Craig

+0

私はあなたがそれをよりよく理解するのを助けるためにいくつかのコメントを付けてコードを編集しました。 – Shibi

+0

Shibiありがとうございます。完全に100%は確かではありませんが、確かに正しい方向に私を指摘しました。上記のコメントを使用してコーディングを手伝ってください。うまくいけば、これで私の理解が完了します。 – Craig

関連する問題