###問題の概要
不思議な現象を見つけました。
WordPressでREGEXP
検索を使うと、下記【特定の文字】を入力した際に該当しない記事を取得してきてしまいます。
【特定の文字】a
,i
,s
,;
,^
,.
これらをもっていない記事がなぜか表示されるのです。
###問題が生じる状況
WordPressでお馴染みの$the_query = new WP_Query( $args );
で、$args
に次のようにmeta_query
を指定しています。
php
1$args = []; 2$args['post_type'] = 'testpost'; 3$words_arr = get_meta_query_search( $search_str, 'or' ); 4$args['meta_query'] = array(array( 5 array( 6 'key' => 'search_fields', 7 'value' => convert_arr_to_regex( $word_arr, 'or' ), 8 'compare' => 'REGEXP', 9 ) 10)); 11$the_query = new WP_Query( $args );
各関数は後述しますが、$search_str
がりんご ばなな
であったとき、りんご|ばなな
でsearch_fields
検索するという流れです。
このりんご ばなな
での検索はできています。
不思議な現象というのは、この$search_str
が【特定の文字】であったとき、search_fields
にその6文字が存在しない記事を取得してきてしまうという現象です。
###試したこと
次のようにREGEXP
を=
にしました。
そしてvalue
を【特定の文字】であるa
にしても、search_fields
にa
がなければ記事を取得するという現象は起こりませんでした。
php
1$args = []; 2$args['post_type'] = 'testpost'; 3$args['meta_query'] = array(array( 4 array( 5 'key' => 'search_fields', 6 'value' => 'a', 7 'compare' => '=', 8 ) 9)); 10$the_query = new WP_Query( $args );
###質問
この現象の問題点と解決策を知りたいです。
なお目的は、カスタムフィールドsearch_fields
に、$search_str
を含む記事の検索機能になります。後述の関数を使う流れは変更したくないです。
ご指導宜しくお願い致します。
###各関数について
ここまでで書いた各関数について記載させていただきます。
/* WP_Query の $args に meta_query での条件を追加します カスタムフィールド search_fields に $search_str を含む記事を取得します */ function get_meta_query_search( $search_str, $join ){ $search_arr = my_get_search_arr_from_str( $search_str ); $meta_query = array( 'key' => 'search_fields', 'value' => convert_arr_to_regex( $search_arr, $join ), 'compare' => 'REGEXP', ); return $meta_query; } /* 検索に使うため、$search_str を配列に分解します 先頭のシャープを削除し、検索に便利なよう全角半角変換します */ function my_get_search_arr_from_str( $search_str ){ // 入力値を配列にする $search_str = mb_convert_kana($search_str, 's'); $search_arr = preg_split("/[\s]+/", $search_str ); // 先頭がシャープの場合は1つだけ削除して配列へ $word_arr = []; $term_arr = []; foreach( $search_arr as $search ){ $search = preg_replace("/( | )/", "", $search ); if( mb_substr($search, 0, 1) === '#' || mb_substr($search, 0, 1) === '#' ){ $search = mb_substr( $search , 1 , strlen($search)-1 ); if( $search !='' ){ $word_arr[] = $search; } } else{ if( $search !='' ){ $word_arr[] = $search; } } } // 変換した配列を返す $word_arr_convert = []; foreach( $word_arr as $word ){ $word_arr_convert[] = mb_convert_kana($word, 'kvrn'); $word_arr_convert[] = mb_convert_kana($word, 'KVRN'); } return $word_arr_convert; } /* meta_query 検索で REGEXP を使うため $arr を次のように変換します ['りんご','ばなな'] → 'りんご|ばなな' $type が 'or' なら OR検索で使うという感じです */ function convert_arr_to_regex( $arr, $type ){ if($type=="or"){ $result = implode('|',$arr); }elseif($type=="and"){ $result = []; foreach( $arr as $ar ){ $result[] = '(?=.*' . $ar . ')'; } $result = '^' . implode('',$result); } if(empty($arr)){ $result = ''; } return $result; }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/10 06:09 編集
2019/10/10 06:45
2019/10/10 08:27
2019/10/10 08:38
2019/10/10 08:43
2019/10/10 08:44
2019/10/10 09:11
2019/10/10 12:19
2019/10/10 12:28
2019/10/10 12:46
2019/10/10 13:41
2019/10/10 16:00 編集
2019/10/10 15:31
2019/10/10 15:59
2019/10/11 01:54
2019/10/11 04:22