本ページはプロモーションが含まれています

【WordPress】メインループとサブループの違いを徹底解説!自作テーマでハマらないための基礎知識

2025年12月21日

wordpress-main-loop-vs-sub-loop

「なぜか動かない」の原因は、ループの理解不足かも?

自作テーマを作っていて、こんな経験はありませんか?

  • サイドバーに新着記事を出したかったのに、メイン記事と同じものが表示される
  • トップページでWP_Queryを使ったら、ページ送りが動かない
  • カスタム投稿タイプの一覧が表示されない

これらのトラブルの9割は、WordPressの心臓部である「ループ(The Loop)」の仕組み、特に「メインループ」と「サブループ」の違いを理解していないことが原因です。

この記事でわかること:
WordPressがどうやって記事を表示しているのか、その根本的な仕組みを理解します。これが分かると、自作テーマのカスタマイズが劇的に楽になります。

あわせて読みたい:【相対パスと絶対パス】画像が表示されないトラブルを解決する方法

WordPressの「ループ」とは何か?

WordPressは、データベースから記事のデータを持ってきて、それを順番に表示します。この「記事がある限り繰り返す」という処理のことを「ループ」と呼びます。

PHPのコードでよく見る、アレです。

while ( have_posts() ) : the_post();
    // ここにタイトルや本文を表示するタグを書く
endwhile;

そして、このループには大きく分けて2種類あります。それが「メインループ」と「サブループ」です。

1. メインループ(Main Loop):WordPressが自動で用意する「定食」

メインループとは、「そのページのURLを見て、WordPressが自動的に用意してくれる記事データ」のことです。

例えば、あなたが「カテゴリーA」のページ(/category/a/)にアクセスしたとします。するとWordPressは、テンプレートファイルを読み込む前に、裏側で勝手に気を利かせてくれます。

WordPress(脳内):
「おっ、カテゴリーAのページへのアクセスだな。じゃあ、データベースからカテゴリーAの記事を最新順で10件持ってきたぞ。いつでも表示できるように準備完了だ!」

このように、何も言わなくても自動で用意される「日替わり定食」のようなものがメインループです。

自作テーマでメインループを使う主な場所

基本的に、そのページの「メインコンテンツ」を表示するテンプレートファイルでは、このメインループを使います。以下のファイルではメインループを使うのが基本です。

  • 投稿ページsingle.php で記事のタイトルや本文を表示する場合)
  • カテゴリーアーカイブcategory.php でそのカテゴリーの記事一覧を表示する場合)
  • その他のアーカイブarchive.php, search.php など)
メインループの書き方:
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        the_title( '

', '

' ); the_content(); endwhile; endif;

2. サブループ(Sub Loop):あなたが注文する「サイドメニュー」

対してサブループとは、「あなたが条件を指定して、意図的に持ってくる記事データ」のことです。主にnew WP_Query()を使って実装します。

例えば、記事の本文の下に「関連記事」を表示したいとします。メインループ(本文)とは全く別のデータが必要になりますね。

あなた(PHPコード):
「WordPressさん、すいません。メインの定食とは別に、追加で『同じタグが付いた記事をランダムで3つ』持ってきてもらえますか?」

自作テーマでサブループを使う主な場所

「メインの定食」だけでは足りない、以下のようなカスタマイズをしたい時にサブループの出番となります。

  • こだわりのトップページ(front-page.phpなど)
    最新のお知らせを3件だけ出したり、特定のカテゴリを並べたりする場合。
  • 固定ページ(page.php)の中に記事一覧を出したい時
    サービス案内ページの下に、実績記事を並べる場合など。
  • サイドバーやフッター
    「人気記事」や「最新のブログ5件」などを表示する場合。
サブループの書き方:
$args = array( 'post_type' => 'post', 'posts_per_page' => 3 );
$the_query = new WP_Query( $args );

if ( $the_query->have_posts() ) :
    while ( $the_query->have_posts() ) : $the_query->the_post();
        the_title();
    endwhile;
    wp_reset_postdata(); // 【重要】後片付け
endif;

【最重要】サブループの後は必ず「リセット」しよう!

サブループでデータを呼び出すと、WordPressは一時的にそのデータを「主役」だと勘違いしてしまいます。そのままにしておくと、その後に続く表示が崩れてしまいます。

サブループの endwhile; の直後には、
必ず wp_reset_postdata(); を書く!

まとめ:違いがわかれば自作テーマは怖くない

項目 メインループ サブループ (WP_Query)
データの決め手 URL(アクセスしたページ) 自分で書いたコード(引数)
主な用途 シングル・アーカイブのメイン記事 トップページ・固定ページ・サイドバー
ページネーション そのまま動く 一工夫必要(解決策はこちら)
リセット処理 不要 必須 (wp_reset_postdata)
次のステップへ
ループの違いがわかったら、次は「サブループでのページネーション」に挑戦してみましょう。ここが自作テーマ制作最大の難所です!
▶︎ 【解決】サブループでWP-PageNaviを動かすPHP実装術