WordPressの検索 | WordPress
全角カナ・英数字を半角に正規化してから検索する例。
$s = isset( $_GET['query'] ) ? sanitize_text_field( wp_unslash( $_GET['query'] ) ) : '';
$s = mb_convert_kana( $s, 'a' );
query_posts( array(
's' => $s,
) );
mb_convert_kana($s, 'a')は、全角英数字を半角に変換するための処理(日本語サイトの検索でよくある正規化)。
注意点(元のコードからの修正点)
- 入力のサニタイズ漏れ:元のコードは
$_GET['query']の値をそのままエスケープせずに使用していた。ユーザー入力は必ずsanitize_text_field()などでサニタイズしてから使用する。 &s=' . $sはタイトルのみ検索、という記述は誤り:WordPressのデフォルト検索(パブリッククエリs)は、投稿タイトルだけでなく本文(post_content)・抜粋(post_excerpt)も対象にLIKE検索を行う。タイトルのみに絞りたい場合は、pre_get_postsでSQLのWHERE句をposts_whereフィルターなどを使って書き換える、またはsearch_only_titleのような専用プラグインを利用する必要がある。query_posts()は非推奨:メインクエリを書き換えるquery_posts()の使用は公式に非推奨とされている(クエリの編集を参照)。検索結果に絞り込みをかけたい場合はpre_get_postsアクションを使うのが推奨される方法。global $query_string;は使用しない:この記法は古いバージョンのWordPressの慣習であり、現在は推奨されない。
推奨される書き方(pre_get_postsを使う例)
add_action( 'pre_get_posts', function ( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$s = isset( $_GET['query'] ) ? sanitize_text_field( wp_unslash( $_GET['query'] ) ) : '';
$s = mb_convert_kana( $s, 'a' );
$query->set( 's', $s );
}
});