複数のWordPressクエリーを使用して異なる投稿セットを表示している場合、重複コンテンツに遭遇する可能性があります。これは、いくつかの投稿が複数のループに一致し、二重に表示される可能性があるためです。
WordPressには、複数のループでの重複投稿を避けるためのビルトインオプションはありません。しかし、15年以上にわたって様々なWordPressサイトを扱ってきた経験から、この問題を回避する方法を学びました。そこで、あなたのサイトに追加できるカスタムコードスニペットを作成し、異なるループで重複投稿が表示されないようにしました。
この投稿では、WordPressの複数ループによる重複投稿表示を簡単に回避する方法を紹介する。
複数のWordPressループでDuplicator投稿が外観される方法
カスタムWordPressテーマやカスタムページテンプレートを作成する際、複数のWordPressループを使用する必要がある場合があります。
例えば、サイトの人気投稿の次に最近の投稿を表示したい場合があります。各カテゴリーの投稿をすべて表示することで、読者が興味深いコンテンツを見つけやすくなるかもしれません。
これらの例ではすべて、個別投稿が複数のループの条件に一致することがあります。このような場合、WordPressは重複したコンテンツを表示します。
このようなDuplicatorコンテンツは、あなたのサイトを乱雑でプロらしくないものにします。また、付加価値を与えることなく、画面上のスペースを取ってしまいます。
ループごとに投稿を動的に生成しているため、重複投稿が複数のループに表示されるかどうかを手動で予測することはできません。
ということで、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ダッシュボードから「Code Snippets + Add Snippet」に進み、「Add Your Custom Code (New Snippet)」オプションをクリックします。
その後、カスタムコードをコードプレビューエリアに貼り付け、上部にタイトルを入力します。
また、ドロップダウンメニューをクリックして、「コードタイプ」をPHPスニペットとして選択する必要があります。
コードを入力したら、下にスクロールしてインサーターセクションを選択します。
ここでは、初期設定の「Auto Insert」を使用し、プラグインに自動的にコードをサイトに追加させることができます。
完了したら、スニペットを保存して有効化するだけです。
詳しくは、WordPressでカスタムコードを追加する方法をご覧ください。
これで、WordPressのサイトにアクセスすると、重複投稿が消えているのがわかるだろう。
この投稿が、WordPressで複数のループによる投稿の重複表示を回避する方法を学ぶのにお役に立てば幸いです。また、WordPressのループで任意の数の投稿を無効化する方法や、WordPressで先頭に固定表示する方法についてもご紹介していますので、あわせてご覧ください。
If you liked this article, then please subscribe to our YouTube Channel for WordPress video tutorials. You can also find us on Twitter and Facebook.
Nick J
Is there a plugin that does this?
Satriyo
Could someone tell me how to do this? I’m really new to this and need a help, please give me a clear example with the post ID, how to store it? Let’s say, mine is 1527.
Gaurav
I’m running 2 loops before loops of a specific category in which I would like to avoid duplicates. So how do a store ID’s in the array from first two loops?
Joe
Just what I was looking for – thank you!
Guilherme Alves
Thank you soo much :))) This helps me alot!
Save my day <3
WPBeginner Support
Hi 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
This method just works fine until both of 2 loops located in one file.
but when I put the first loop in the header.php and another one in the index.php,
in_array($post->ID, $do_nit_duplicate) returns null.
what can I do?
warren
Good afternoon all,
will this work for my current issue with double display of posts on site? it literally displays a copy under the posts and the 1, 2, -> button…
the site is I have deactivated re-activated plugins i am literally going nuts.
agus
can you help me?
I have proble with duplicate category in my site
please
#thanks
WPBeginner Support
Seems like a theme specific issue, contact theme developers for support.
管理者
Gabriel
Before iterating over the default loop shouldn’t we use wp_reset_postdata(); ?
Greg
@sergeyvlasov – Thanks that worked for me
tho i changed
$do_nit_duplicate to $do_not_duplicate
Ron Hantman
Checkout this solution which does this task outside of the loop:
http://wordpress.stackexchange.com/questions/61936/removing-duplicate-values-between-two-wordpress-queries/
sergeyvlasov
I think there is a flaw in this algorithm. It can spot no more than 1(one) duplication. So the magic line would look like
$do_not_duplicate[] = $post->ID
and then used as
if(in_array($post->ID, $do_nit_duplicate)) continue;