サポート » 使い方全般 » 「メインループ」の定義は何ですか?

  • 解決済 iicoiico

    (@iicoiico)


    こんにちは。
    自分で本を片手にテンプレートを作成中です。
    トップページには固定ページを持ってきており、カテゴリー別にデザインを作成中です。
    それぞれのカテゴリーのページに、ループ( <?php if(have_posts()): while(have_posts()): the_post(); ?> <?php endif; ?> )を二つ使用し、それぞれの前にquery_postsを使って、表示数とカテゴリーを指定していました。wordpressのカスタマイズ方法を書いた本に書かれているものを応用したので、大丈夫だと思ってました。

    ところが、このやり方ではきちんと機能してないことが分かり(表示数が指定したようにならなかった)、調べていたら、codexのquery_postsのところに、以下のように書いてありました。

    “query_posts() 関数はメインの WordPress ループだけを変更するためのものです。新たなループを作るためのものではありません。メインループの他にループが必要な場合は、get_posts() を使ってください。メインループの他で query_posts() を使用すると、メインループが不正な状態になり期待する結果が得られません。
    query_posts() 関数はページのメインクエリを上書きし、置き換えます。他の目的で使用しないでください。”

    codexを読んでいって、ひとつめのループ手前のquery_postsを、wp_reset_queryでリセットし、ふたつめのループのカテゴリと表示数の指定を、query_postsではなくget_postsに変えたところ、思うように表示されるようになったのですが、いまだ上記の説明文が自分で理解できません。なので、なぜ問題が解決したのか、本当に解決したのか、分からないです。

    メインループというのは、どのループをさすのでしょうか?
    ひとつのサイトにつきメインループはひとつしか存在しないということですか?それとも、category.phpや single.phpなど、各テンプレートにつき、ひとつずつということですか?メインループと、そうでないループの違いは何ですか?query_postsはひとつのテンプレートにつき一度しか使えないのでしょうか?

    どうぞ宜しくお願いします。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トップページに最新記事を表示するループ、単一投稿ページにカレントIDの投稿を一つ表示するループ、固定ページにカレントIDの固定記事を表示するループ、検索結果のページに結果を表示するループなど、一つのページに一つの主目的のメインループがあるはずです。

    ———————–
    query_posts()を複数回使用しても大丈夫ですが、トラブルを避ける為にもget_posts()を使用した方がいいと思います。
    ———————–
    すみません。上記は訂正します。
    書き換えるだけで新たにループを作成するのではないとありますので、動作しないかもしれませんね。
     
    query_posts()、get_posts()の違いや使い方は、次の記事を参考にしてください。
    メインループの変更には pre_get_posts が便利なようです。
    WordPress ループ&クエリーのモヤモヤを解消しよう! – wpxtreme

    モデレーター Takuro Hishikawa

    (@hissy)

    メインループは、各テンプレートにつき1つではなく、正確に言えば各URLにつき1つです。

    URLが /?p=123 ならIDが123の投稿を1件表示するループがメインループ
    URLが /?cat=4 ならIDが4のカテゴリーの投稿を管理画面で指定した件数表示するループがメインループ
    URLが /?m=201206 なら2012年6月の投稿を管理画面で指定した件数表示するループがメインループ

    どのURLでどのテンプレートが使われるかは、テンプレート階層のルールに従って決定されます

    query_posts | pre_get_posts の用途の例としては

    URLが /?cat=xx のようなカテゴリーの一覧のとき、IDが4のときだけ20件表示固定にしたい
    URLが /?m=201206 の様な日付の一覧のとき、特定のIDが一覧に出ないようにしたい

    など、メインループの動きに変更を加えたい時です。

    get_posts の用途の例としては

    メインループでは新着記事を10件表示しているが、それとは別に特定のカテゴリーの新着記事5件をサイドバーに表示したい
    メインループでは特定の投稿を1件表示しているが、それとは別に表示している投稿と同じカテゴリーの新着記事を5件その下に表示したい

    など、メインループ「とは別に」何かのデータをWordPressのデータベースから取得して表示したい時です。

    query_posts を1ページで複数回使うことは可能ですが、イメージとしてはquery_postsを発動した瞬間に、URLから想定されるページの内容をキャンセルして、別のURLの内容を読み込んでくる…というような形でしょうか。これは理解して使わないと動作がイメージしにくく、意図したコンテンツが表示されない、というトラブルがよく起こります。そのため、あまり推奨されない方法というわけです。

    トピック投稿者 iicoiico

    (@iicoiico)

    こんにちは、おそくなりましたが、popup様、Takuro Hishikawa様、ともに分かりやすい説明をどうもありがとうございました。理解できました。感謝です!

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「「メインループ」の定義は何ですか?」には新たに返信することはできません。