

_**実現したいこと**_  
２つあります。  
１．２つのクエリから取得した投稿で、重複した投稿があるのでそれを除外したい  
２．表示を３件までに設定したい

_**現状**_  
ホテル紹介のサイトを制作しています。そこでホテルの個別記事のページに、その個別記事のホテルと関連する他のホテルを表示させています。  
方法としては、それぞれ"目的地用($dest_arg)"と"旅行テーマ用($reise_arg)"の２つのクエリから現在の投稿と同じカテゴリーを持つ投稿を取得して、その２つのクエリを１つにまとめて投稿を表示させていますが、重複した投稿も表示されています。

原因として考えたのは"$dest_arg"と"$reise_arg"から同じ投稿が取得されて、それを１つに$new_queryでまとめているので同じ投稿がフィルターされないまま表示されているのだと思います。

_**例**_  
ホテルAの記事ページの場合は、関連ホテルとして"ホテルB"と"ホテルD"のみを表示させたいが、  
"$dest_arg" => ホテルB＆ホテルDが取得  
"$reise_arg" => ホテルB＆ホテルDが取得  
"$new_query" => ホテルBとホテルDが２つずつ表示  
されている現状です。

カテゴリーの階層  
カテゴリ => ホテル(hotels)  
カテゴリ => イベント

親カテゴリ1 => 目的地(ID=15)  
子カテゴリ1 => 日本  
子カテゴリ1の子カテゴリ => 東京、大阪、沖縄

子カテゴリ2 => イギリス  
子カテゴリ2の子カテゴリ => ロンドン、リバプール

親カテゴリ2 => 旅行テーマ(ID=2)  
子カテゴリ => ショッピング、食べ歩き、美術館巡り

記事のカテゴリー分配  
ホテルA => ホテル、目的地、 **日本** 、 **東京** 、旅行テーマ、 **ショッピング**  
ホテルB => ホテル、目的地、 **日本** 、大阪、旅行テーマ、食べ歩き、 **ショッピング**  
ホテルC => ホテル、目的地、イギリス、ロンドン、旅行テーマ、美術館巡り  
ホテルD => ホテル、目的地、 **日本** 、 **東京** 、旅行テーマ、 **ショッピング**

イベント(ID=13)のページもあるので、下記のような記事もあります。 ( ホテルのみを取得するために'category_name' =>
'hotels',と設定しています )  
イベントA => イベント)、目的地、東京、旅行テーマ、ショッピング  
イベントB => イベント、目的地、大阪、旅行テーマ、食べ歩き  
イベントC => イベント、目的地、沖縄、旅行テーマ、美術館巡

[code]

    // single-hotel.php
    
    // 現在の投稿の目的地の子カテゴリーのIDを取得
    foreach((get_the_category()) as $childcat) {
     　if (cat_is_ancestor_of(15, $childcat)) {
     　　　$dest_ID = $childcat->cat_ID;
    　　}};
    
    // 現在の投稿の旅行テーマの子カテゴリーのIDを取得   
    foreach((get_the_category()) as $childcat) {
       if (cat_is_ancestor_of(2, $childcat)) {
           $reise_ID = $childcat->cat_ID;
        }};
    
    // 目的地の記事を取得
    $dest_arg = array (
        'post__not_in'      => array($post->ID),
        'category_name'     =>  'hotels',
        'category__in' => $dest_ID,
        'category__not_in' => array(13, 14),
        'orderby'           => 'rand',
        // 'posts_per_page'    => 3,
    );
    
    // 旅行テーマの記事を取得
    $reise_arg = array (
        'post__not_in'      => array($post->ID),
        'category_name'     =>  'hotels',
        'category__in' => $reise_ID,
        'category__not_in' => array(13, 14),
        'orderby'           => 'rand',
        // 'posts_per_page'    => 3,
    );
    
    $destination_query = new WP_Query($dest_arg);
    $reise_query = new WP_Query($reise_arg);
    
    $new_query = new WP_Query();
    $new_query->posts = array_merge( $destination_query->posts, $reise_query->posts );
    // $new_query = array_unique($dest_arg, $reise_arg);
    $new_query->post_count = $destination_query->post_count + $reise_query->post_count;
    
    if( $new_query -> have_posts() ):
       while ( $new_query -> have_posts() ) :
      　$new_query -> the_post();
    ?>
    
[/code]

「投稿が取得された時点で取得された投稿のIDを配列に格納して重複してるIDを削除」するというロジックを考えたのですが、どうやってコードを書いたらいいのかわからず手が止まっている状態なのでアドバイスいただけると幸いです。

また関連ホテルを最大で３件まで表示させたいのですが、この場合"$new_query = new
WP_Query();"で'posts_per_page'のように制限をかけられるのでしょうか？現在は６件など取得された投稿数がそのまま反映されています。

宜しくお願い致します。

_**試したこと**_  
下記のコードで表示数を制限したかったのですが、なにも変わりませんでした。  
$new_query = new WP_Query('posts_per_page=3');

２つのクエリをマージした時に参考にしたリンクはこちらです
[参考リンク](https://wordpress.stackexchange.com/questions/55519/can-i-merge-2-new-
wp-queryvariable-s/123193#123193)

**＊＊＊解決＊＊＊**  
array_uniqueで重複した投稿IDを除外して、下記のコードで配列内のIDをランダムで３つ取得することができ、それらを表示させることができました。  
array_intersect_key($unique_arr, array_flip(array_rand($unique_arr, 3));  
[参考リンク](https://www.php.net/manual/ja/function.array-rand.php#122467)

[code]

    'fields' => 'ids'　// このコードを$reise_argと$dest_argに追加
    
    $all_IDs = array_merge($destination_query->posts, $reise_query->posts); 
    $unique_arr = array_unique($all_IDs);
    $get_three_IDs = array_intersect_key( $unique_arr, array_flip( array_rand( $unique_arr, 3 ) );
    
    $new_query = new WP_Query( array (
         'post__in' => $get_three_IDs, ));
    
[/code]


CC BY-SA 4.0
2021-09-20T09:18:58.180
82601
2021-09-21T09:19:55.737
2021-09-21T09:19:55.737
29392
29392
question
php wordpress
２つのクエリから取得して重複した投稿IDを削除したいです。


post__not_in  
利用されていますけどそれをそのまま利用してはいかがでしょうか？

流れの処理としては

（１）関連する目的地の記事を取得

（２）その記事のIDを配列にする

（３）旅行テーマの記事を取得  
その際にpost__not_inで事前に関連する目的地関連記事で取得している記事を条件に加えて除外する

そこまで難しい処理ではないと思います。

記事の制限は二つのカテゴリで2回記事を取得しているのでなかなかめんどくさいですが  
2回目に取得するposts_per_pageの数字を変数で個数を調整すればよいでしょう。

（１）目的に関連するの記事をまずは3件取得する

（２）実際取れた件数をN(最大3 最小0)として  
3-N = 0 の場合は旅行テーマの記事を取得しない  
3-N > 0 の場合は旅行テーマの記事を(3-N)件取得する


CC BY-SA 4.0
2021-09-21T02:07:47.213
82612
2021-09-21T02:07:47.213
22665
82601
answer