複数のWordPressクエリを使用して異なる投稿セットを表示している場合、重複コンテンツに遭遇する可能性があります。これは、一部の投稿が複数のループに一致し、2回表示される可能性があるためです。
WordPressには、複数のループで投稿が重複するのを避けるための組み込みオプションはありません。しかし、15年以上にわたるさまざまなWordPressサイトの管理経験から、この問題を回避する方法を学びました。そのため、サイトに追加して、異なるループで重複投稿が表示されるのを回避できるカスタムコードスニペットを作成しました。
この記事では、WordPressで複数のループを使用して重複投稿の表示を簡単に回避する方法を説明します。

WordPressの複数のループで重複投稿がどのように表示されるか
カスタムWordPressテーマまたはカスタムページテンプレートを作成する際、複数のWordPressループを使用する必要がある場合があります。
たとえば、サイトの最も人気のある投稿の隣に最近の投稿を表示したい場合があります。各カテゴリのすべての投稿を表示することで、読者が興味深いコンテンツを見つけるのを助けることもできます。
これらの例のすべてにおいて、1つの投稿が複数のループの基準に一致する可能性があります。この場合、WordPressは重複コンテンツを表示します。
この重複コンテンツは、サイトを乱雑でプロフェッショナルでないように見せることがあります。また、価値を追加せずに画面スペースを占有します。
各ループの投稿を動的に生成しているため、重複投稿が複数のループに表示されるかどうかを手動で予測することはできません。
それでは、WordPressで複数のループを扱う際に重複投稿を回避する簡単な方法を見てみましょう。
複数のWordPressループで重複投稿を回避する
このガイドでは、重複投稿エラーを引き起こすWordPressコードのサンプルを示し、その後、問題を修正するコードスニペットを共有します。
WordPressの子テーマを作成する 際 やカスタムテンプレートを作成する際、コードは完全に異なる場合があります。しかし、このコードスニペットを開始点として使用し、ご自身のウェブサイトに合わせて変更することができます。
まず、重複投稿の問題を作成しましょう。以下のサンプルコードでは、重複投稿を回避せずに、「travel」カテゴリのすべての投稿と「news」カテゴリのすべての投稿を表示しています。
/****** The First Query *******/
$first_query = new WP_Query( array (
'category_name' => 'news',
'posts_per_page' => 3
));
// The Loop
if ( $first_query->have_posts() ) {
echo '<ul>';
while ( $first_query->have_posts() ) {
$first_query->the_post();
//display posts
echo '<li>';
echo the_post_thumbnail( array(50, 50) );
echo get_the_title();
echo '</li>';
}
echo '</ul>';
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
/****** The Second Query *******/
$second_query = new WP_Query( array (
'category_name' => 'travel',
'posts_per_page' => 3
) );
// The Loop
if ( $second_query->have_posts() ) {
echo '<ul>';
while ( $second_query->have_posts() ) {
$second_query->the_post();
echo '<li>';
echo the_post_thumbnail( array(50, 50) );
echo get_the_title();
echo '</li>';
}
echo '</ul>';
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
?>
ご覧のとおり、このコードは クエリ の重複投稿をチェックしません。
投稿が「ニュース」と「旅行」の両方のカテゴリに属している場合、次の画像のように2回表示されます。

この問題を解決しましょう。
WordPressブログで投稿が重複して表示されるのを避けるには、最初のループに表示されたすべての投稿に関するデータを一時的に保存する必要があります。
その情報があれば、2番目のループに重複投稿が表示されないように、2番目のクエリを変更できます。
/****** The First Query *******/
$first_query = new WP_Query( array (
'category_name' => 'news',
'posts_per_page' => 3
) );
// The Loop
if ( $first_query->have_posts() ) {
echo '<ul>';
while ( $first_query->have_posts() ) {
$first_query->the_post();
// Store Post IDs in an Array to reuse later
$exclude[] = $post->ID;
//display posts
echo '<li>';
echo the_post_thumbnail( array(50, 50) );
echo get_the_title();
echo '</li>';
}
echo '</ul>';
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
/****** The Second Query *******/
$second_query = new WP_Query( array (
'category_name' => 'travel',
'post__not_in' => $exclude, // Tell WordPress to Exclude these posts
'posts_per_page' => 3
) );
// The Loop
if ( $second_query->have_posts() ) {
echo '<ul>';
while ( $second_query->have_posts() ) {
$second_query->the_post();
echo '<li>';
echo the_post_thumbnail( array(50, 50) );
echo get_the_title();
echo '</li>';
}
echo '</ul>';
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
?>
上記のコードでは、投稿IDを$excludeという配列に保存しています。その後、2番目のクエリにpost__not_in引数を追加し、最初のループに表示された投稿を除外します。
サイトにコードスニペットを追加することに慣れていない場合は、WPCode を使用する方が簡単な方法です。これは、サイトを壊すリスクなしにカスタムコードを追加できる、WordPress向けの最高のコードスニペットプラグインです。
まず、WPCodeプラグインをインストールして有効化する必要があります。ヘルプが必要な場合は、WordPressプラグインのインストール方法に関するガイドを参照してください。
有効化したら、WordPressダッシュボードから「コードスニペット」>「スニペットを追加」に移動し、「カスタムコードを追加(新規スニペット)」オプションをクリックできます。

その後、カスタムコードをコードプレビューエリアに貼り付け、一番上にタイトルを入力できます。
ドロップダウンメニューをクリックして、「コードタイプ」をPHPスニペットとして選択する必要もあります。

コードを入力したら、下にスクロールして「挿入」セクションを選択してください。
ここでは、「自動挿入」のデフォルト設定を使用して、プラグインがコードをサイトに自動的に追加できるようにすることができます。

完了したら、スニペットを保存してアクティブ化してください。
詳細については、WordPressにカスタムコードを追加する方法に関するガイドをご覧ください。
これで、WordPressのウェブサイトにアクセスすると、重複した投稿が消えていることがわかります。

この記事が、WordPressで複数のループを使用して重複投稿の表示を回避する方法を学ぶのに役立ったことを願っています。また、WordPressループで任意の数の投稿を表示する方法とWordPressでスティッキー投稿を作成する方法に関するガイドも参照してください。
この記事が気に入ったら、WordPressのビデオチュートリアルについては、YouTubeチャンネルを購読してください。 TwitterやFacebookでもフォローできます。

Nick J
これを行うプラグインはありますか?
Satriyo
これがどのように行うか誰か教えてもらえませんか?私は本当にこれに慣れておらず、助けが必要です。投稿IDを付けて、どのように保存するか、明確な例を教えてください。私の投稿IDは1527だとしましょう。
Gaurav
特定のカテゴリのループの前に2つのループを実行しており、重複を避けたいと考えています。最初の2つのループからIDを配列にどのように保存しますか?
Joe
まさに探していたものです – ありがとうございます!
Guilherme Alves
本当にありがとうございます :))) とても助かります!
私の日を救ってくれました <3
WPBeginnerサポート
Guilhermeさん、こんにちは。
You are welcome
Don’t forget to follow us on Facebook for more WordPress tips and tutorials.
管理者
Julie
AWESOME!! Thank you so much! And thank you SERGEYVLASOV for that last comment– Worked like a charm for my multiple loops. Hooray!!
Pirooz
この方法は、2つのループが同じファイル内にある間はうまく機能します。
しかし、最初のループを header.php に、もう一方を index.php に配置すると、
in_array($post->ID, $do_nit_duplicate) が null を返します。
どうすればよいですか?
warren
皆さん、こんにちは。
これは、サイトでの投稿の二重表示に関する現在の問題に役立ちますか?投稿の下にコピーが表示され、1、2、->ボタンが表示されます…
サイトが…プラグインを無効化して再有効化しましたが、本当に気が狂いそうです。
agus
手伝っていただけますか?
サイトに重複したカテゴリがあります
お願いします
#ありがとう
WPBeginnerサポート
テーマ固有の問題のようです。サポートについてはテーマ開発者にお問い合わせください。
管理者
Gabriel
デフォルトのループを反復処理する前に、wp_reset_postdata(); を使用すべきではありませんか?
Greg
@sergeyvlasov – ありがとう、うまくいきました
tho i changed
$do_nit_duplicate を $do_not_duplicate に
Ron Hantman
このタスクをループの外で行うソリューションをご覧ください:
http://wordpress.stackexchange.com/questions/61936/removing-duplicate-values-between-two-wordpress-queries/
sergeyvlasov
このアルゴリズムには欠陥があると思います。1つしか重複を検出できません。したがって、マジックラインは次のようになります。
$do_not_duplicate[] = $post->ID
そして、次のように使用されます。
if(in_array($post->ID, $do_nit_duplicate)) continue;