投稿情報を連想配列で参照する投稿日の検索が自由自在に時代はWP_Queryなのか検索ワード「-10,000円」を検索できるようにしたい標準で使用できる数少ないショートコード[caption]とはこの記事は最後に更新してから1年以上経過しています。検索ワード「-10,000円」を検索できるようにしたい標準の区切り文字と「-」の働き説明とあるサイトで「-10,000円」をキーワードに検索した際、予想と異なるページが表示され、ちょっと驚いた。今回はその原因調査と対策についてまとめてみた。標準の区切り文字と「-」の働きまずは検索ワード「-10,000円」がどんなクエリーになっているのか現行バージョンの4.8.0で確認(適宜改行)。'%000円%'))タイトル、抜粋、本文のすべてに「10」が含まれず、かつタイトル、抜粋、本文のいずれかに「000円」が含まれる投稿にマッチするクエリーになっている。LIKE」が適用されている。検索対象がタイトルと本文のほか、抜粋が追加されていることもわかる。バージョンをさかのぼりながら確認していくと、検索対象に抜粋が追加されたのはバージョン4.5.0だった。バージョン4.5.0以降では原則上記のクエリーとなることがわかった(バージョン4.7.0では'wp_query_search_exclusion_prefix'フィルターが用意され、「-」ではなく別の字に変更可能)。LIKE」が適用される件はバージョン4.4.0で追加されいた。検索ワード「-10,000円」のクエリーは次のようになる。'%000円%'))これに対し4.4.0より前のバージョン(ここでは4.3.1)で検索ワード「-10,000円」のクエリーは次のようになる。'%000円%'))このようにバージョンによって検索ワードの解釈が異なるので、この点は注意したい。検索ワードが「,」で分割されることの対応については、分割される前に「,」を適当な字に置き換えて、クエリーが生成された後に「,」に戻す方法を試してみる。);ここで使用したのは'pre_get_posts'アクションと'posts_search'フィルターである。'pre_get_posts'アクションでは、検索ワードにカンマ区切りの数値がないか調べ、あった場合は「,」を「■」に書き換え、検索ワードとして格納し直している。ここでは置き換え文字として「■」を使用しているが、実運用時する場合はもっと使用される可能性が低い字をあてるほうがよい。'posts_search'フィルターは、検索ワードからクエリーを生成した後に実行されるフィルターでパラメータ$searchには生成されたクエリーが格納されている。そこで検索ワードとクエリーのそれぞれについて「■」を「,」に書き換えている。上記を適用した結果、クエリーは次のようになる。今度は除外記号の「-」を「!」に変更する。これはWordPressのバージョンによって対応が異なるが、4.7.0以降であれば先に触れたように'wp_query_search_exclusion_prefix'フィルターを利用するのが手っ取り早い。);上記を適用した結果、クエリーは次のようになり、無事「-10,000円」が含まれるページが検索されるようになった。'%-10,000円%'))なおここでは「!」を使用しているが、検索ワードの区切り文字(記号)を指定してしまうと意図した検索結果が得られない場合があるので、その点は注意したい。「,」を置き換えない方法さて検索ワードを「,」で分割させない方法として、そのワードを「"」で囲む方法がある。'pre_get_posts'フィルターでそういった対応ができないわけではないのだが、元の検索ワードに「"」が含まれるケースを考えるといろいろと悩ましいので、今回は「,」を置き換える方法を採用した。【追記】'wp_query_search_exclusion_prefix'フィルターで返す文字はシングルバイトでなければ正しく機能しない。nullを返すことで、除外検索そのものを無効化できる(バージョン4.4.0より前のバージョンと同等になる)。)パラメータ$dで指定したフォーマットで投稿日を取得する。)PHPバージョンの互換性を調べる。)投稿情報が指定したカテゴリーに属しているか調べる。)IDを指定してカテゴリー情報を取得する。)WordPressシステムの関数にアクション関数を追加する。©12NetWordPress私的マニュアル主にjQueryのメモPHPExcelのノートWebの。