こんにちは
検索条件で、照合順序(collation)を utf8_unicode_ci にすればよさそうです。
下記のページで、MySQL の照合順序について詳しく解説されています。
http://qiita.com/Vit-Symty/items/159c27d7d62c78ee9ce7
例)
function my_posts_search( $search, $wp_query ) {
global $wpdb;
if ( ! $wp_query->is_search )
return;
$search = '';
$q = $wp_query->query_vars;
$n = ! empty( $q['exact'] ) ? '' : '%';
$exclusion_prefix = apply_filters( 'wp_query_search_exclusion_prefix', '-' );
foreach ( $q['search_terms'] as $term ) {
$exclude = $exclusion_prefix && ( $exclusion_prefix === substr( $term, 0, 1 ) );
if ( $exclude ) {
$like_op = 'collate utf8_unicode_ci NOT LIKE';
$andor_op = 'AND';
$term = substr( $term, 1 );
} else {
$like_op = 'collate utf8_unicode_ci LIKE';
$andor_op = 'OR';
}
if ( $n && ! $exclude ) {
$like = '%' . $wpdb->esc_like( $term ) . '%';
$q['search_orderby_title'][] = $wpdb->prepare( "{$wpdb->posts}.post_title LIKE %s", $like );
}
$like = $n . $wpdb->esc_like( $term ) . $n;
$search .= $wpdb->prepare( "{$searchand}(({$wpdb->posts}.post_title $like_op %s) $andor_op ({$wpdb->posts}.post_excerpt $like_op %s) $andor_op ({$wpdb->posts}.post_content $like_op %s))", $like, $like, $like );
$searchand = ' AND ';
}
if ( ! empty( $search ) ) {
$search = " AND ({$search}) ";
if ( ! is_user_logged_in() ) {
$search .= " AND ({$wpdb->posts}.post_password = '') ";
}
}
return $search;
}
add_filter('posts_search','my_posts_search', 10, 2);
ishitakaさん、ありがとうございます。
提示されたコードを理解するのは今の自分ではかなり難しいと思います。
とりあえず、そのままいれてみましたが何も検索されませんでした。
空白で検索するとエラーが出ましたが、こちらは検索して対処しました。
Warning: Invalid argument supplied for foreach() in I:///functions.php on line 834
834 : foreach ( $q['search_terms'] as $term ) {
foreach ( (array)$q['search_terms'] as $term ) {
あと今更ですが、ローカルと使用しているサーバー(ネットオウルのWPblog)の仕様が違うのか
なぜかローカルでは何もしなくても全角、半角が区別無く検索できてしまいました。
ネットオウルの詳しい仕様は調べられないようなので比べようがないのですが……。
質問していて何ですが、いったん閉めたいと思います。