実現したいこと
こんにちは。
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
どうぞよろしくお願いいたします。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/04/17 10:11
2023/04/17 12:17