WordPressには、「メインクエリ」と「メインループ」という似たような概念があります。
その2つの違いを明確にし、それらを条件分岐させる関数、is_main_query
とin_the_loop
について解説します。
メインクエリとメインループ
WordPressでは、ページを表示する最初に、そのページで表示する記事を整理して$wp_query
というオブジェクトを作成します。
このオブジェクトを元にループを組み立てて記事を表示させるのが、おなじみのWordPressのループの仕組みです。
1 2 3 4 5 6 7 |
<?php if (have_posts()): ?> <?php while (have_posts()): the_post(); ?> ... <?php endwhile; ?> <?php endif; ?> |
このように、have_posts
関数やthe_post
関数を使用するループを「メインループ」と言います。
メインループで表示される記事は、query_posts
関数を使用してカスタマイズできます。
query_posts
関数は$wp_query
オブジェクトが書き換えられます。
書き換えられた$wp_query
オブジェクトは、wp_reset_query
関数を使用することで、query_posts
関数を使用する前の状態に戻す事ができます。
1 2 3 4 5 6 7 8 9 10 11 |
<?php query_posts('year=2013'); // 2013年の記事だけを表示 ?> <?php if (have_posts()): ?> <?php while (have_posts()): the_post(); ?> ... <?php endwhile; ?> <?php endif; ?> <?php wp_reset_query(); // $wp_queryをリセット ?> |
※このquery_posts
関数を用いたカスタマイズは、公式のWordPress Codexでは推奨されていません。別の方法については、記事: 記事の絞り込みや並び替えを行うをご覧ください。
このようにしてカスタマイズされた$wp_query
オブジェクトに対して、初期状態の(query_posts
関数を使用する前の)$wp_query
オブジェクトを「メインクエリ」と言います。
いっぽう、query_posts
関数を使用せずに、get_posts
関数を使用してループをカスタマイズする方法があります。
この場合は、$wp_query
オブジェクトは書き換えられず、あくまでも「メインループ」とは別のループとして動作します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $myposts = get_posts('year=2013') // 2013年の記事だけを表示; foreach ( $myposts as $post ) : setup_postdata($post); ?> ... <?php endforeach; wp_reset_postdata(); ?> |
get_posts
関数を使用したループは、「サブループ」や「派生的なループ」(英語ではsecondary loop)というように呼んで区別されます。
条件分岐関数のis_main_queryとin_the_loop
is_main_query関数
条件分岐関数のis_main_query
は、$wp_query
オブジェクトが「メインクエリ」かどうかを判別します。
1 |
<?php is_main_query(); // true か false を返す ?> |
コード上で、is_main_query() === true
になる部分を黄色で色分けしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php if (have_posts()): ?> <?php while (have_posts()): the_post(); ?> ... <?php endwhile; ?> <?php endif; ?> <?php query_posts('year=2013'); ?> <?php if (have_posts()): ?> <?php while (have_posts()): the_post(); ?> ... <?php endwhile; ?> <?php endif; ?> <?php wp_reset_query(); ?> <?php $myposts = get_posts('year=2013'); foreach ( $myposts as $post ) : setup_postdata($post); ?> ... <?php endforeach; wp_reset_postdata(); ?> |
query_posts
関数を使用すると返り値はfalse
になり、wp_reset_query
関数でリセットするとtrue
に戻ります。
get_posts
関数を使用したループは$wp_query
オブジェクトに影響しないので、true
のままになります。
in_the_loop関数
条件分岐関数のin_the_loop
は、「メインループ」内かどうかを判別します。
1 |
<?php in_the_loop(); // true か false を返す ?> |
今度はコード上で、in_the_loop() === true
になる部分を黄色で色分けしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php if (have_posts()): ?> <?php while (have_posts()): the_post(); ?> ... <?php endwhile; ?> <?php endif; ?> <?php query_posts('year=2013'); ?> <?php if (have_posts()): ?> <?php while (have_posts()): the_post(); ?> ... <?php endwhile; ?> <?php endif; ?> <?php wp_reset_query(); ?> <?php $myposts = get_posts('year=2013'); foreach ( $myposts as $post ) : setup_postdata($post); ?> ... <?php endforeach; wp_reset_postdata(); ?> |
メインループで、最初のthe_post
関数が呼ばれてから、while
文が終了するまで、true
になります。
また、get_posts
関数を使用したループではtrue
になりません。
まとめ
メインクエリとは、テンプレートが呼び出された時に準備されるクエリです。
query_posts
関数で新たなクエリを作成するとメインクエリから外れ、wp_reset_query
関数を使用する事でメインクエリに戻ります。
メインループとは、while
文やthe_post
関数を使ってループさせる、通常のWordPressループです。
get_posts
関数を使用したループはメインループでなく、サブループなどと呼ばれます。