WordPressでサイトを作成する際、避けては通れない最も重要な概念の一つが「ループ」です。
ループはデータベースに保存された投稿データを取得し、画面上に繰り返し表示するための仕組みです。
これさえマスターすれば、ブログの記事一覧、特定カテゴリーの抽出、カスタム投稿タイプの表示など、自由自在にコンテンツを操ることができます。
2026年現在のモダンな開発環境においても、WordPressのコアとなるこの仕組みは依然として重要です。
本記事では、WordPressループの基礎から応用まで、コード例を交えて丁寧に説明します。
WordPressループとは何か
WordPressループとは、特定の条件に一致する投稿が存在するかどうかを確認し、存在する場合にはその投稿データを1件ずつ順番に処理して出力するPHPのコードブロックを指します。
「ループ(繰り返し)」という名前の通り、同じテンプレート構造を使用して、タイトルや本文といったデータを流し込みながら繰り返し表示を行います。
WordPressには大きく分けて2種類のループが存在します。
一つは、アクセスしたURLに基づいてWordPressが自動的に用意する「メインループ」です。
もう一つは、開発者が特定の条件を指定して作成する「サブループ」です。
初心者の方は、まずメインループの構造を理解することから始めましょう。
メインループの基本構文
メインループは、index.phpやcategory.php、archive.phpといったテンプレートファイルで最も一般的に使用されます。
基本となるコードは以下の通りです。
<?php
// 1. 投稿があるかどうかをチェック
if ( have_posts() ) :
// 2. 投稿がある限り、繰り返し処理を実行
while ( have_posts() ) :
// 3. 投稿データをセットし、テンプレートタグを使える状態にする
the_post();
?>
<article>
<h2><?php the_title(); // タイトルの出力 ?></h2>
<div><?php the_excerpt(); // 抜粋の出力 ?></div>
</article>
<?php
endwhile;
else :
// 4. 投稿が1件もなかった場合の処理
echo '<p>記事が見つかりませんでした。</p>';
endif;
?>
コードの役割を理解する
上記のコード内で使用されている主要な関数について詳しく見ていきましょう。
have_posts()
現在のリクエスト(ページ)に関連付けられた投稿が、まだループ内に残っているかどうかを判定します。戻り値は真偽値(true / false)です。the_post()
この関数は非常に重要です。ループの現在のインデックスを次の投稿に進めると同時に、グローバル変数である$postを現在の投稿データで上書きします。これにより、the_title()やthe_content()といったテンプレートタグが、その投稿の情報を正しく取得できるようになります。the_title()/the_excerpt()
これらは「テンプレートタグ」と呼ばれ、ループ内でのみ正しく動作します。現在の投稿のタイトルや抜粋を自動的にHTMLとして出力します。
ループ内でよく使われるテンプレートタグ
ループの中で、どのような情報を出力したいかによって使用するテンプレートタグが異なります。
主要なものを表にまとめました。
| 関数名 | 説明 | 備考 |
|---|---|---|
the_ID() | 投稿のIDを表示する | HTMLのid属性などによく使われる |
the_title() | 投稿のタイトルを表示する | 引数で前後を囲むHTMLを指定可能 |
the_content() | 投稿の本文をすべて表示する | 記事詳細ページなどで使用 |
the_excerpt() | 投稿の抜粋を表示する | 文字数は設定や関数で制御可能 |
the_permalink() | 投稿のURLを表示する | aタグのhref属性に使用 |
the_time('Y.m.d') | 投稿日時を表示する | PHPのdate形式でフォーマット指定 |
the_category() | 所属するカテゴリーをリンク付きで表示 | リスト形式(ul/li)などで出力される |
the_post_thumbnail() | アイキャッチ画像を表示する | functions.phpでの有効化が必要 |
これらのタグをHTMLと組み合わせることで、自由なレイアウトの記事一覧ページを作成できます。
WP_Queryを使ったサブループの作成
メインループだけでは、「サイドバーに最新の5件を表示したい」「特定のカテゴリーの記事だけをトップページに並べたい」といった要望に応えることができません。
そこで登場するのが、「サブループ」です。
サブループを作成するには、WP_Query クラスを使用するのが2026年現在でも最も推奨される標準的な方法です。
サブループのコード例
以下の例では、「news」というスラッグを持つカテゴリーの記事を最新3件取得して表示します。
<?php
// 1. 取得条件(引数)の設定
$args = array(
'category_name' => 'news', // カテゴリースラッグ
'posts_per_page' => 3, // 表示する件数
'orderby' => 'date', // 日付順
'order' => 'DESC', // 降順(新しい順)
);
// 2. クエリの実行
$the_query = new WP_Query( $args );
// 3. ループの開始
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) :
$the_query->the_post(); // 投稿データをセット
?>
<div class="news-item">
<time><?php echo get_the_date(); ?></time>
<h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
</div>
<?php
endwhile;
else :
// 投稿がない場合
echo '<p>現在、お知らせはありません。</p>';
endif;
// 4. ポストデータのセットをリセット(超重要)
wp_reset_postdata();
?>
サブループで最も注意すべき点
サブループを使用する際、最も忘れてはならないのが wp_reset_postdata() の記述です。
サブループ内で $the_query->the_post() を実行すると、WordPress全体の「現在の投稿(グローバルな$post変数)」がサブループのものに書き換えられてしまいます。
これをリセットせずに放置すると、サブループの後に続くメインループや他のテンプレートパーツが正しく動作しなくなる不具合が発生します。
ループが終わったら必ずリセットを行う癖をつけましょう。
get_postsを使用した簡易的なループ
WP_Query は非常に多機能ですが、単純にデータを配列として取得してループさせたい場合は get_posts 関数も便利です。
<?php
$recent_posts = get_posts( array(
'posts_per_page' => 5,
'post_status' => 'publish',
) );
if ( ! empty( $recent_posts ) ) :
foreach ( $recent_posts as $post ) :
// setup_postdata() を使ってテンプレートタグを使えるようにする
setup_postdata( $post );
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php
endforeach;
// やはりリセットが必要
wp_reset_postdata();
endif;
?>
get_posts を使用する場合も、setup_postdata($post) を呼び出すことで、the_title() などのテンプレートタグを利用可能になります。
ただし、複雑なクエリやページネーションが必要な場合は、前述の WP_Query を使用するのが一般的です。
ループを使い分けるためのポイント
メインループとサブループ、どちらを使うべきか迷ったときは、以下の基準で判断してください。
メインループを使用すべき場面
- 記事一覧ページ(index.php, archive.php)
- 検索結果ページ(search.php)
- 投稿個別ページ(single.php)
- 固定ページ(page.php)
- URLによって表示する内容が決まる場合はすべてメインループです。
サブループ(WP_Query)を使用すべき場面
- トップページの一部に「お知らせ一覧」を載せたいとき
- 記事の下に「関連記事」を表示したいとき
- サイドバーに「人気記事ランキング」を表示したいとき
- ページの主目的とは別の条件でデータを取得したい場合に使用します。
ループのカスタマイズと効率化
WordPressのループをさらに高度に扱うためのテクニックをいくつか紹介します。
pre_get_posts によるメインループの書き換え
多くの方が、「メインループの表示件数を変えたい」「特定のカテゴリーを一覧から除外したい」というときにサブループを書いてしまいがちです。
しかし、メインループ自体の条件を変更したい場合は、テンプレートファイルにサブループを書くのではなく、functions.php で pre_get_posts アクションフックを使うのがベストプラクティスです。
これにより、データベースへのクエリ発行が1回で済むため、サイトの表示速度が向上します。
// functions.php に記述
function my_customize_query( $query ) {
// 管理画面ではなく、メインクエリである場合のみ
if ( ! is_admin() && $query->is_main_query() ) {
// アーカイブページのみ表示件数を20件にする
if ( $query->is_archive() ) {
$query->set( 'posts_per_page', 20 );
}
}
}
add_action( 'pre_get_posts', 'my_customize_query' );
複雑な条件指定(タクソノミーとカスタムフィールド)
WP_Query では、単にカテゴリーやタグだけでなく、独自の分類(タクソノミー)や、投稿に紐付いたカスタムフィールドの値で絞り込みを行うことも可能です。
$args = array(
'post_type' => 'event', // カスタム投稿タイプ「イベント」
'tax_query' => array( // タクソノミーでの絞り込み
array(
'taxonomy' => 'event_cat',
'field' => 'slug',
'terms' => 'seminar',
),
),
'meta_query' => array( // カスタムフィールドでの絞り込み
array(
'key' => 'event_date',
'value' => date('Ymd'),
'compare' => '>=', // 今日以降のイベント
'type' => 'DATE',
),
),
);
このように、ループの「入り口」である引数を工夫することで、2026年のWebサイトに求められる動的で複雑なコンテンツ配置が可能になります。
ループ内で発生しやすいトラブルと対処法
WordPressのループを実装していると、意図した通りに表示されない場面に遭遇することがあります。
よくある原因と解決策を整理しました。
1. 記事が全く表示されない
- 原因: 引数のスラッグ名が間違っている、または投稿が「公開済み(publish)」になっていない。
- 対策:
var_dump($args);で引数を確認し、管理画面で投稿ステータスをチェックしてください。
2. 同じ記事が繰り返し表示される / 違う記事が出る
- 原因:
the_post()の呼び忘れ、またはwp_reset_postdata()の欠落。 - 対策: ループの開始直後に必ず
the_post()を記述しているか確認してください。
3. 無限ループに陥る
- 原因:
while文の条件が常に真(true)になっている。 - 対策: メインループなら
have_posts()、サブループなら$query->have_posts()を正しく使い分けているか見直しましょう。
ループのパフォーマンス最適化
大規模なサイトやアクセス数の多いサイトでは、ループの回し方ひとつでサーバー負荷が変わります。
- 必要なデータだけを取得する:
posts_per_pageを適切な数に制限する。 - 不要な計算を避ける: ページネーションが不要な場所では
'no_found_rows' => trueを引数に加えることで、SQLの実行速度が向上します。 - オブジェクトキャッシュの利用: 2026年のWordPress開発では、クエリの結果を一時的にキャッシュする仕組み(Transients APIなど)を活用し、データベースへのアクセス回数を減らす工夫も一般的です。
まとめ
WordPressループは、テンプレート開発における「心臓部」です。
基本のメインループを理解し、WP_Query を使ったサブループを使いこなせるようになれば、制作できるサイトの幅は飛躍的に広がります。
最後におさらいしましょう。
- メインループはURLに基づいて自動で動く。
- サブループは特定の条件で記事を呼び出す時に使う。
- テンプレートタグを使うためには the_post() が必須。
- サブループの終わりには必ず wp_reset_postdata() を記述する。
これらの原則をしっかり守って、メンテナンス性が高く、ユーザーにとって使い勝手の良いWordPressサイトを構築していきましょう。
PHPのバージョンアップやWordPressの進化に伴い、書き方のトレンドは少しずつ変化しますが、この基本的なループの仕組みは今後も長く使われ続ける知識となるはずです。
