wordpressのテーマ修正をおこなっています。
やりたいことは、フリーワード検索して一覧表示させる際に、カスタムポストを検索対象にすることです。
しかし、そのカスタムポストはタイトル以外、ACFで作成したカスタムフィールドで構成されています。
それらカスタムフィールドに対して、フリーワードでlike検索をかけた上で、検索結果を出したいというものです。
そこで、pre_get_postsフックを使って、検索条件を追加しようと、以下のようなコードをfunctions.phpに追加しました。
php
1function sample_func($query) { 2 if ( is_admin() || ! $query->is_main_query() ) 3 return; 4 if ( $query->is_search() ){ 5 $word = $_GET['s']; 6 $query->set('post_type', 'your_english'); 7 8 $metas = array( 9 'relation' => 'OR', 10 array( 11 'key' => 'field1', 12 'value' => $word, 13 'compare' => 'LIKE' 14 ), 15 array( 16 'key' => 'field2', 17 'value' => $word, 18 'compare' => 'LIKE' 19 ) 20 ); 21 $query->set('meta_query',$metas); 22 return; 23 } 24} 25add_action( 'pre_get_posts', 'sample_func', 20 ); 26
これを適用させて、ちゃんと設定したqueryが反映されていることは確認しました。
しかし、実際にあるカスタムポストのfield2にのみ存在する単語を検索フォームにいれても、検索結果として取得できませんでした。
試しにWPで実行されたクエリを確認してみると、meta_queryで追加した条件が、ANDで繋がっている状態でした。
たしかにこれでは取得できません。ANDで繋がっている部分をORに変えた状態で直接DBで実行させてみると、正しく取得されました。
念のため、同じことをpre_get_postsは使わずに、search.phpで直接new WP_Query($args)させてやってみましたが、
出力されたクエリは、meta_queryがANDで繋がっている状態でした。
SQL
1SELECT 2 SQL_CALC_FOUND_ROWS wp_posts.ID 3FROM 4 wp_posts 5 INNER JOIN wp_postmeta ON ( 6 wp_posts.ID = wp_postmeta.post_id 7 ) 8WHERE 9 1 = 1 10 AND ( 11 ( 12 ( 13 wp_posts.post_title LIKE '%チャンス%' 14 ) 15 OR ( 16 wp_posts.post_excerpt LIKE '%チャンス%' 17 ) 18 OR ( 19 wp_posts.post_content LIKE '%チャンス%' 20 ) 21 ) 22 ) 23 AND ( 24 ( 25 wp_postmeta.meta_key = 'field1' 26 AND wp_postmeta.meta_value LIKE '%チャンス%' 27 ) 28 OR ( 29 wp_postmeta.meta_key = 'field2' 30 AND wp_postmeta.meta_value LIKE '%チャンス%' 31 ) 32 ) 33 AND wp_posts.post_type IN ('post', 'acf1') 34 AND ( 35 (wp_posts.post_status = 'publish') 36 ) 37GROUP BY 38 wp_posts.ID 39ORDER BY 40 wp_posts.post_title LIKE '%チャンス%' DESC, 41 wp_posts.post_date DESC 42LIMIT 43 0, 20
このようなクエリが出力されている状態です。
wp_postmeta.meta_key = 'field1'
この記述の2行上のANDが原因です。ここをORにかえると正常に取得できます。
知りたいのは、ここのANDをORに変えた状態でクエリを出力させるには、pre_get_postsフックでどのように記述すれば良いのか?ということです。
もしくは、WP_Queryでもいいです。
フリーワード検索で、投稿タイトル・本文と、カスタムポストのタイトル・カスタムフィールドの値に対して、各々OR条件でLike検索をかける方法をご教授いただきたいです。
どうぞ、宜しくお願い致します。
あなたの回答
tips
プレビュー