WordPressには、「メインクエリ」と「メインループ」という似たような概念があります。

その2つの違いを明確にし、それらを条件分岐させる関数、is_main_queryin_the_loopについて解説します。

メインクエリとメインループ

WordPressでは、ページを表示する最初に、そのページで表示する記事を整理して$wp_queryというオブジェクトを作成します。
このオブジェクトを元にループを組み立てて記事を表示させるのが、おなじみのWordPressのループの仕組みです。

このように、have_posts関数やthe_post関数を使用するループを「メインループ」と言います。

メインループで表示される記事は、query_posts関数を使用してカスタマイズできます。
query_posts関数は$wp_queryオブジェクトが書き換えられます。
書き換えられた$wp_queryオブジェクトは、wp_reset_query関数を使用することで、query_posts関数を使用する前の状態に戻す事ができます。

※このquery_posts関数を用いたカスタマイズは、公式のWordPress Codexでは推奨されていません。別の方法については、記事: 記事の絞り込みや並び替えを行うをご覧ください。

このようにしてカスタマイズされた$wp_queryオブジェクトに対して、初期状態の(query_posts関数を使用する前の)$wp_queryオブジェクトを「メインクエリ」と言います。

いっぽう、query_posts関数を使用せずに、get_posts関数を使用してループをカスタマイズする方法があります。
この場合は、$wp_queryオブジェクトは書き換えられず、あくまでも「メインループ」とは別のループとして動作します。

get_posts関数を使用したループは、「サブループ」や「派生的なループ」(英語ではsecondary loop)というように呼んで区別されます。

条件分岐関数のis_main_queryとin_the_loop

is_main_query関数

条件分岐関数のis_main_queryは、$wp_queryオブジェクトが「メインクエリ」かどうかを判別します。

コード上で、is_main_query() === trueになる部分を黄色で色分けしてみました。

query_posts関数を使用すると返り値はfalseになり、wp_reset_query関数でリセットするとtrueに戻ります。
get_posts関数を使用したループは$wp_queryオブジェクトに影響しないので、trueのままになります。

in_the_loop関数

条件分岐関数のin_the_loopは、「メインループ」内かどうかを判別します。

今度はコード上で、in_the_loop() === trueになる部分を黄色で色分けしてみました。

メインループで、最初のthe_post関数が呼ばれてから、while文が終了するまで、trueになります。
また、get_posts関数を使用したループではtrueになりません。

まとめ

メインクエリとは、テンプレートが呼び出された時に準備されるクエリです。
query_posts関数で新たなクエリを作成するとメインクエリから外れ、wp_reset_query関数を使用する事でメインクエリに戻ります。

メインループとは、while文やthe_post関数を使ってループさせる、通常のWordPressループです。
get_posts関数を使用したループはメインループでなく、サブループなどと呼ばれます。