こんにちは。wordpress初心者なのでここで質問させていただきます。
実現したいこと
実現したいことが2つあります。
1.2つのクエリから取得した投稿で、重複した投稿があるのでそれを除外したい
2.表示を3件までに設定したい
現状
ホテル紹介のサイトを制作しています。そこでホテルの個別記事のページに、その個別記事のホテルと関連する他のホテルを表示させています。
方法としては、それぞれ"目的地用($dest_arg)"と"旅行テーマ用($reise_arg)"の2つのクエリから現在の投稿と同じカテゴリーを持つ投稿を取得して、その2つのクエリを1つにまとめて投稿を表示させていますが、重複した投稿も表示されています。
原因として考えたのは"目的地用"と"旅行テーマ用"のクエリから同じ投稿が取得されて、それを1つに$new_queryでまとめているので同じ投稿がフィルターされないまま表示されているのだと思います。
例)
ホテルAの記事ページの場合は、関連ホテルとして"ホテルB"と"ホテルD"のみを表示させたいが、
"$dest_arg" => ホテルB&ホテルDが取得
"$reise_arg" => ホテルB&ホテルDが取得
"$new_query" => ホテルBとホテルDが2つずつ表示
されている現状です。
カテゴリーの階層
カテゴリ => ホテル(hotels)
カテゴリ => イベント
親カテゴリ1 => 目的地(ID=15)
子カテゴリ1 => 日本
子カテゴリ1の子カテゴリ => 東京、大阪、沖縄
子カテゴリ2 => イギリス
子カテゴリ2の子カテゴリ => ロンドン、リバプール
親カテゴリ2 => 旅行テーマ(ID=2)
子カテゴリ => ショッピング、食べ歩き、美術館巡り
記事のカテゴリー分配
ホテルA => ホテル、目的地、日本、東京、旅行テーマ、ショッピング
ホテルB => ホテル、目的地、日本、大阪、旅行テーマ、食べ歩き、ショッピング
ホテルC => ホテル、目的地、イギリス、ロンドン、旅行テーマ、美術館巡り
ホテルD => ホテル、目的地、日本、東京、旅行テーマ、ショッピング
***追記***
サイトにはイベント(ID=13)のページもあるので、下記のような記事もあります。 ( ホテルのみを取得するために'category_name' => 'hotels',と設定しています )
イベントA => イベント)、目的地、東京、旅行テーマ、ショッピング
イベントB => イベント、目的地、大阪、旅行テーマ、食べ歩き
イベントC => イベント、目的地、沖縄、旅行テーマ、美術館巡
// 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); // それぞれで取得した投稿IDで重複していれば、それを除外 // $dest_argで投稿ID 63を取得、$reise_argで投稿ID63を取得 $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(); ?>
「投稿が取得された時点で取得された投稿のIDを配列に格納して重複してるIDを削除」するというロジックを考えたのですが、どうやってコードを書いたらいいのかわからず手が止まっている状態なのでアドバイスいただけると幸いです。
また関連ホテルを最大で3件まで表示させたいのですが、この場合"$new_query = new WP_Query();"で'posts_per_page'のように制限をかけられるのでしょうか?
宜しくお願い致します。
2つのクエリをマージした時に参考にしたリンクはこちらです。リンク
回答1件
あなたの回答
tips
プレビュー