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

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

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

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

PHP

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

Q&A

1回答

527閲覧

WordPressの記事検索で本文かカスタムフィールドのどれかに指定した値が含まれる記事を取得したい

flow-t

総合スコア23

WordPress

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

PHP

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

0グッド

0クリップ

投稿2023/04/13 10:51

実現したいこと

こんにちは。
WordPressの記事検索で、指定した文字列($_GET['order_keyword'])が記事本文か、プラグインAdvanced Custom Fields (ACF) で作成したカスタムフィールドのどれかに含まれる記事を取得したいのですが、うまくいきません。

1.カスタムフィールドのどれかに含まれる場合
2.記事本文かタイトルに含まれる場合
1.2のどちらかであればできるのですが、1.2を合わせたOR条件(記事本文かカスタムフィールドのどれかに含む)ができないのです。

前提

対象投稿タイプ:exhibition-indonesia

対象のカスタムフィールドのキー:
exhibition_name_jp
exhibition_area
exhibition_place
exhibition_item
exhibition_author
exhibition_url

カスタムフィールドexhibition_start_day(年月日)が今日(アクセスした年月日)以降であることが必須条件。

発生している問題・エラーメッセージ

「(記事本文ではなく)カスタムフィールドのどれかに含まれる」条件は実現できたが、記事本文('s'=>$_GET['order_keyword'])をOR条件で加えることができない。

該当のソースコード

// 現在の日付を取得 $today = date('Y-m-d'); // order_keywordの値を取得 $order_keyword = isset($_GET['order_keyword']) ? sanitize_text_field($_GET['order_keyword']) : ''; // クエリの基本パラメータを設定 $args = array( 'post_type' => 'exhibition-indonesia', 'posts_per_page' => -1, 'meta_query' => array( 'relation'=>'AND', array( 'key' => 'exhibition_start_day', 'value' => $today, 'compare' => '>=', 'type' => 'DATE', ), ), ); // order_keywordが存在する場合、検索条件を追加 if (!empty($order_keyword)) { // $args['s'] = $order_keyword; $add1['relation'] = 'OR'; $custom_fields = array('exhibition_name_jp', 'exhibition_area', 'exhibition_place', 'exhibition_item', 'exhibition_author', 'exhibition_url'); foreach ($custom_fields as $field) { $add1[] = array( 'key' => $field, 'value' => $order_keyword, 'compare' => 'LIKE', ); } $add1[] = array( 's' => $order_keyword ); array_push($args['meta_query'],$add1); } // WP_Queryを実行 $posts_arr = new WP_Query($args);

上記のコードでの$args(order_keywordにフランスを指定)
カスタムフィールドのどれかにフランスが含まれる記事を取得。タイトル、本文に含まれるものは取得しない。

array(3) { ["post_type"]=> string(20) "exhibition-indonesia" ["posts_per_page"]=> int(-1) ["meta_query"]=> array(3) { ["relation"]=> string(3) "AND" [0]=> array(4) { ["key"]=> string(20) "exhibition_start_day" ["value"]=> string(10) "2023-04-13" ["compare"]=> string(2) ">=" ["type"]=> string(4) "DATE" } [1]=> array(8) { ["relation"]=> string(2) "OR" [0]=> array(3) { ["key"]=> string(18) "exhibition_name_jp" ["value"]=> string(12) "フランス" ["compare"]=> string(4) "LIKE" } [1]=> array(3) { ["key"]=> string(15) "exhibition_area" ["value"]=> string(12) "フランス" ["compare"]=> string(4) "LIKE" } [2]=> array(3) { ["key"]=> string(16) "exhibition_place" ["value"]=> string(12) "フランス" ["compare"]=> string(4) "LIKE" } [3]=> array(3) { ["key"]=> string(15) "exhibition_item" ["value"]=> string(12) "フランス" ["compare"]=> string(4) "LIKE" } [4]=> array(3) { ["key"]=> string(17) "exhibition_author" ["value"]=> string(12) "フランス" ["compare"]=> string(4) "LIKE" } [5]=> array(3) { ["key"]=> string(14) "exhibition_url" ["value"]=> string(12) "フランス" ["compare"]=> string(4) "LIKE" } [6]=> array(1) { ["s"]=> string(12) "フランス" } } } }

試したこと

's' => $order_keywordをtax_queryのOR条件で取得すると条件に関係なく投稿タイプexhibition-indonesiaの全記事が取得されてしまう。

// 現在の日付を取得 $today = date('Y-m-d'); // order_keywordの値を取得 $order_keyword = isset($_GET['order_keyword']) ? sanitize_text_field($_GET['order_keyword']) : ''; // クエリの基本パラメータを設定 $args = array( 'post_type' => 'exhibition-indonesia', 'posts_per_page' => -1, 'tax_query'=>[ 'relation'=>'OR', [ 'meta_query' => array( 'relation'=>'AND', array( 'key' => 'exhibition_start_day', 'value' => $today, 'compare' => '>=', 'type' => 'DATE', ), ) ] ] ); // order_keywordが存在する場合、検索条件を追加 if (!empty($order_keyword)) { array_push($args['tax_query'],['s'=>$order_keyword]); $add1['relation'] = 'OR'; $custom_fields = array('exhibition_name_jp', 'exhibition_area', 'exhibition_place', 'exhibition_item', 'exhibition_author', 'exhibition_url'); foreach ($custom_fields as $field) { $add1[] = array( 'key' => $field, 'value' => $order_keyword, 'compare' => 'LIKE', ); } array_push($args['tax_query'][0]['meta_query'],$add1); } // WP_Queryを実行 $posts_arr = new WP_Query($args);

上記のコードでの$args

array(3) { ["post_type"]=> string(20) "exhibition-indonesia" ["posts_per_page"]=> int(-1) ["tax_query"]=> array(3) { ["relation"]=> string(2) "OR" [0]=> array(1) { ["meta_query"]=> array(3) { ["relation"]=> string(3) "AND" [0]=> array(4) { ["key"]=> string(20) "exhibition_start_day" ["value"]=> string(10) "2023-04-13" ["compare"]=> string(2) ">=" ["type"]=> string(4) "DATE" } [1]=> array(7) { ["relation"]=> string(2) "OR" [0]=> array(3) { ["key"]=> string(18) "exhibition_name_jp" ["value"]=> string(12) "フランス" ["compare"]=> string(4) "LIKE" } [1]=> array(3) { ["key"]=> string(15) "exhibition_area" ["value"]=> string(12) "フランス" ["compare"]=> string(4) "LIKE" } [2]=> array(3) { ["key"]=> string(16) "exhibition_place" ["value"]=> string(12) "フランス" ["compare"]=> string(4) "LIKE" } [3]=> array(3) { ["key"]=> string(15) "exhibition_item" ["value"]=> string(12) "フランス" ["compare"]=> string(4) "LIKE" } [4]=> array(3) { ["key"]=> string(17) "exhibition_author" ["value"]=> string(12) "フランス" ["compare"]=> string(4) "LIKE" } [5]=> array(3) { ["key"]=> string(14) "exhibition_url" ["value"]=> string(12) "フランス" ["compare"]=> string(4) "LIKE" } } } } [1]=> array(1) { ["s"]=> string(12) "フランス" } } } -->

補足情報(FW/ツールのバージョンなど)

WordPress 6.2

どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

$add1['relation'] = 'OR';
array_push($args['meta_query'], $add1);
この配列自体が meta_query の一部として扱われていないため、WordPressは $add1 配列を新しい meta_query 条件式として解釈しようとしていませんか。そのため、meta_query内の条件式ORではなく、ANDで結合しているように見えます。詳しく四でないので齟齬あればすいません。まずはその点いかがですか?

投稿2023/04/17 09:32

編集2023/04/17 09:33
hiroki-sys

総合スコア64

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

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

flow-t

2023/04/17 10:11

$args['meta_query']が認識されていないのでは、ということでしょうか? この部分で「exhibition_start_dayが今日以降の記事」を取得しており、それは結果に反映されているので、この部分にかんしては意図したとおり認識されているようです。
hiroki-sys

2023/04/17 12:17

はい。取得もされているようですね。 問題は、$add1 配列が meta_query の一部として認識されず、関係演算子 "AND" で結合されてしまうことです。 $args['meta_query'] には、'relation' が "AND" に設定されているため、これに新しい条件を追加する場合は、新しい条件も "AND" で結合されます。しかし、$add1 配列をそのまま追加しているため、これらの条件も "AND" で結合されてしまうため、意図しない結果になっているはずです。 解決策としては、$add1 配列を配列の配列にすることです。つまり、$add1 配列を1つの配列の要素として、新しい配列に追加します。そして、この新しい配列を $args['meta_query'] に追加することで、関係演算子 "AND" で結合される条件のグループを作成し、それに $add1 配列を追加することができるはずです。 $args['meta_query'][] = array( // OR 検索するために配列を追加 'relation' => 'OR', // OR で結合する array( // あとはカスタムフィールドの各項目についての条件を追加していく。 'relation' => 'OR'を指定することで、いずれかのカスタムフィールドにキーワードが含まれる記事が取得されます。 これでタイトルの要望はクリアされるはずです。ドキュメントを読みつつ進めてみてください。 https://developer.wordpress.org/reference/classes/wp_query/ https://developer.wordpress.org/reference/classes/wp_meta_query/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問