サポート » 使い方全般 » 全角も半角も検索するには?

  • 解決済 ioxrxogi

    (@ioxrxogi)


    現在、検索にはプラグインのSearch Everything8.1.6を利用しています。
    (カスタム投稿も検索できるので使用しています)

    これ以外でもいいのですが、全角も半角も検索できるようにしたいのですが何か方法はありますか。

    たとえば、本文に

    全角でABC、あるいは、半角でABCとあったとして、
    ABCあるいはABCで検索して、ヒットさせたいと思っています。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • こんにちは

    検索条件で、照合順序(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)の仕様が違うのか
    なぜかローカルでは何もしなくても全角、半角が区別無く検索できてしまいました。
    ネットオウルの詳しい仕様は調べられないようなので比べようがないのですが……。

    質問していて何ですが、いったん閉めたいと思います。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • このトピックに返信するにはログインが必要です。