複数の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でも私たちを見つけることができます。

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