質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1997閲覧

2つのクエリから取得して重複した投稿IDを削除する方法

tomtom199

総合スコア10

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/09/20 07:33

編集2021/09/20 07:59

こんにちは。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つのクエリをマージした時に参考にしたリンクはこちらです。リンク

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayato7

2021/09/20 07:47

1つのクエリで取得してくるという方法ではだめでしょうか? category_nameを指定せず、以下のように配列でcategory__inにカテゴリーIDを渡せばマージなど考える必要はないかなと思いました。 'category__in' => [$reise_ID,$dest_ID],
tomtom199

2021/09/20 07:57

アドバイスありがとうございます!いま追記したのですが、カテゴリーは”hotel”以外にも”イベント”カテゴリーがあり、目的地や旅行テーマのカテゴリーが与えられているので、アドバイスいただいた 'category__in' => [$reise_ID,$dest_ID], にするとhotelだけではなく、イベントの投稿も表示されてしまいます。
hayato7

2021/09/20 12:55 編集

であればcategory_nameは指定したままであれば取得できないでしょうか? (あるいはcategory__not_inでeventを除くなど)
tomtom199

2021/09/20 15:01

category_nameはすでに'hotels'と指定してあり、category__not_inでevent(id=13)をすでに除いた状況での質問です。
guest

回答1

0

自己解決

一応実現したいことはできたので、ここに解決できたコードを載せます。

'fields' => 'ids' // $reise_argと$dest_argにこのコードを追加 ... // それぞれで取得した投稿をマージ $all_IDs = array_merge($destination_query->posts, $reise_query->posts); // 'fields' => 'ids'でIDの配列を返すので、$all_IDs内の重複しているIDを削除 $unique_arr = array_unique($all_IDs); // 新しいクエリを作成し、'post__in' => $unique_arrでフィルターされたIDだけを指定し、3記事までを表示させる $new_query = new WP_Query(array( 'post__in' => $unique_arr, 'posts_per_page' => 3, 'orderby' => 'rand' ));

もし変数$unique_arrのあとで、すでに表示する投稿数を"3"と指定できるならいいのですが、方法がわからないの、ご教授いただけると助かります!
ちなみに$three_IDs = array_rand($unique_arr, 3);を試しましたが、キーだけ取得でき、投稿のIDは取得できませんでした。。。

投稿2021/09/20 15:12

編集2021/09/20 15:13
tomtom199

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomtom199

2021/09/21 07:09 編集

ご教授ありがとうございます!???? そちらのリンクのコードで無事にランダムで値を3つ取得でき表示件数を設定できました。公式のドキュメントは一回読んだのですが、下まで目を通すべきでした。array_flipでキーと値を反転して取得できるのは便利ですね。勉強になりました 最終的なコードを載せておきます。 $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(  'post__in' => $get_three_IDs, ));
退会済みユーザー

退会済みユーザー

2021/09/21 08:37

変な事書いてら… × 3つのランダムな配列 〇 ID3つのランダムな配列 やりたい事できたなら自己解決で締めちゃって
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問