まず結論
duplicate loop は、WordPress の一覧や関連記事で同じ投稿が意図せず重複表示される状態です。原因は、main query と custom query の混同、現在投稿の除外漏れ、paged や offset の指定、wp_reset_postdata() の不足などに分けて確認します。
WordPress では、1つのページ内に複数のループが存在することがあります。ページ本体の main query、関連記事を表示する custom query、サイドバーの最新記事一覧などです。
これらの条件が重なったり、独自クエリ後の投稿データを戻していなかったりすると、同じ投稿が複数の場所に表示されることがあります。duplicate loop は、そうした重複表示を切り分けるための実務上の見方です。
duplicate loop は何を指す言葉か
duplicate loop は、The Loop や WP_Query の使い方によって、同じ投稿が意図せず繰り返し表示される状態です。WordPress の公式関数名ではなく、トラブルの状態を説明する言葉として扱います。
たとえば、投稿詳細ページの本文下に関連記事を出した時に、現在読んでいる記事が関連記事にも出てしまうことがあります。また、ページネーションで2ページ目に移動しても同じ投稿が表示される場合もあります。
ここで大事なのは、「重複している場所」がどのクエリから出ているかを分けることです。main query の一覧なのか、custom query の一覧なのかで、確認する引数や修正方法が変わります。
見た目上は同じ「重複」でも、原因は1つではありません。現在投稿の除外漏れ、ページ番号の渡し忘れ、offset の使い方、戻し処理の不足を順番に確認します。
混同しやすい考え方
- 画面に出ている一覧をすべて同じループとして考える
- 関連記事と本文一覧の条件が重なっているか確認しない
- 既存一覧を custom query で作り直して重複を増やす
整理した考え方
- main query と custom query を分けて確認する
- 別枠一覧には必要なら除外条件を入れる
- 既存一覧の調整は main query の調整も検討する
main query と custom query を分ける
duplicate loop を調べる時は、まず main query と custom query を分けます。main query は、WordPress が現在のページ本体のために用意するクエリです。custom query は、開発者が追加で作る独自クエリです。
たとえば、カテゴリーアーカイブの一覧は main query です。その下に「おすすめ記事」を別枠で出しているなら、それは custom query の可能性があります。
重複が起きている時は、まず「どの一覧とどの一覧で重複しているか」を確認します。ページ本体の一覧と関連記事なのか、関連記事の中だけなのか、ページ送りの中で重複しているのかを分けます。
この切り分けをしないと、post__not_in を入れるべきなのか、paged を直すべきなのか、wp_reset_postdata() を確認するべきなのかが分かりにくくなります。
Builder での扱い
WP Query Builder では、duplicate loop は注意表示や診断ポイントとして扱う想定です。関連記事や別枠一覧を生成する時は、現在の投稿を除外するかどうかを選べると安全です。
また、ページネーション付きの独自クエリでは、paged を正しく出力する必要があります。offset を使う設定では、重複や件数ズレの注意を出す方針が向いています。
生成コードでは、独自 WP_Query の後に wp_reset_postdata() を含めることも重要です。初心者がコピーして使うコードでは、重複や表示ズレの原因を減らす基本形にします。
使いどころ・避けどころと実践確認
同じ投稿が二度表示される症状を、クエリ結果とループ処理の両方から説明する時に使う観点です。
SQL結果の重複と、テンプレートが同じループを二度実行する問題を混ぜて修正しないようにします。
複数ループで $post の復元がないと、後続の表示が前のループ結果を参照し、重複に見えることがあります。
取得結果に重複がなくてもHTML側で同じ投稿IDが二度出るなら、クエリではなくループの置き場所を疑います。
各ループの開始・終了位置と表示された投稿IDをログへ残し、SQLで得た投稿IDとHTMLに出た投稿IDを別々に比較します。
WordPressの仕様で確認するポイント
公式資料では、WP_Query Class で post__not_in、paged、offset などの引数を確認できます。The Loop では、取得した投稿を表示する基本の流れを確認できます。
独自 WP_Query 後の表示ズレを確認する場合は、wp_reset_postdata() の公式リファレンスも合わせて確認します。
公式リンク
公式ドキュメント
duplicate loop は、同じ投稿が意図せず重複表示される状態です。原因は、main query と custom query の混同、除外条件の不足、paged の渡し忘れ、offset、wp_reset_postdata() の不足などに分けて確認します。
迷った時は、どの一覧で重複しているかを先に確認します。関連記事なら現在投稿の除外、ページ送りなら paged、独自クエリ後の表示ズレなら wp_reset_postdata() を順番に見ます。
duplicate loop の最終チェック
- main query と custom query を分けて確認した
- 関連記事では現在投稿IDを除外している
- ページ送りでは
pagedを WP_Query に渡している offsetを使っている場合は一度外して確認した- 独自
WP_Query後にwp_reset_postdata()を入れている - 同じ条件のクエリを複数回使っていないか確認した
公式リファレンス
仕様や原文の説明も確認したいときは、公式ドキュメントと整理ページをあわせて見ると理解しやすくなります。
この記事の検証情報
検証環境
- WordPress
- 7.1
- PHP
- 8.3.33
- テーマ
- wpq-media + DDEV
- 対象
- カスタム投稿 / taxonomy / meta_query
更新履歴
- 2026年8月29日 本文と補助情報を更新
- 2026年8月15日 初回公開
この用語を活用する
あとで見返す・共有する
お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。
他の用語も続けて確認できます
似た用語や周辺知識をまとめて見たいときは、用語集トップから探すと迷いにくくなります。