本文へ移動

用語集

WP_Query トラブル用語duplicate loop

duplicate loop は、WordPress の一覧や関連記事で、同じ投稿が意図せず繰り返し表示される状態です。原因は、main query と custom query の混同、現在の投稿を除外していないこと、paged や offset の指定、wp_reset_postdata() の不足などに分けて確認します。

Huddly Huddly 投稿日: 2026年8月15日 更新日: 2026年8月29日 読了目安: 4分

まず結論

duplicate loop は、WordPress の一覧や関連記事で同じ投稿が意図せず重複表示される状態です。原因は、main query と custom query の混同、現在投稿の除外漏れ、pagedoffset の指定、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_inpagedoffset などの引数を確認できます。The Loop では、取得した投稿を表示する基本の流れを確認できます。

独自 WP_Query 後の表示ズレを確認する場合は、wp_reset_postdata() の公式リファレンスも合わせて確認します。

公式リンク

公式ドキュメント

duplicate loop は、同じ投稿が意図せず重複表示される状態です。原因は、main query と custom query の混同、除外条件の不足、paged の渡し忘れ、offsetwp_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日 初回公開

この用語を活用する

あとで見返す・共有する

お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。

他の用語も続けて確認できます

似た用語や周辺知識をまとめて見たいときは、用語集トップから探すと迷いにくくなります。

用語集トップを見る