サポート » 使い方全般 » 検索時の中黒「・」について

  • 解決済 berghilo

    (@berghilo)


    いつもWordPressでサイト運営をさせていただき、大変ありがとうございます。

    検索時についての質問をさせていただきます。

    WordPress本文中に例えば、
    「ハリー・ポッター」
    という文字があった場合、
    「ハリーポッター」
    と検索するとヒット数はゼロになってしまいます。

    スマホなどでは殆ど中黒「・」は記入しないと思いますので、掲載文字を「ハリーポッター」にすればいいのかなとは思うのですが、正式名称は「ハリー・ポッター」なので、中黒「・」を入れた「ハリー・ポッター」にしたいわけです。

    こうした場合、「ハリーポッター」で検索しても、「ハリー・ポッター」がヒットするようなことはできますでしょうか?

    なお、「ハリー・ポッター」は一例なので、この中黒「・」は他にも幾つかあります。

    functions.phpになにか書くような気がしますが、当方それほどスキルが無く、ご教授いただける方がいらっしゃいましたら、何卒よろしくお願いします。

5件の返信を表示中 - 1 - 5件目 (全5件中)
  • ishitaka

    (@ishitaka)

    こんにちは

    MySQL の REPLACE 関数を使用して ‘・’ を取り除いたもので検索するのはどうでどうでしょう?

    検索条件の変更は、posts_where フックなど変更することができます。

    例:

    function my_posts_where( $where, $query ) {
    	global $wpdb;
    
    	if ( is_search() && $query->is_search() ) {
    		$s = $query->query['s'];
    		$s = str_replace( '・', '', $s );
    		$like = $wpdb->esc_like( $s );
    		$where = preg_replace( '/^(\sAND \(\()(.*\)\))/', '$1' . "(REPLACE({$wpdb->posts}.post_content,'・','')  LIKE '%{$like}%') OR " . '$2', $where );
    	}
    
    	return $where;
    }
    
    add_filter( 'posts_where', 'my_posts_where', 10, 2 );
    berghilo

    (@berghilo)

    ishitakaさん

    早速のご提案大変有り難うございます。
    ご連絡いただいたコードをfunctions.phpに書き、見事思い通りになりました。

    この度はご教授大変ありがとうございます。
    これでまたWordPress運営が楽しくなります。

    ありがとうございました。

    berghilo

    (@berghilo)

    上記コードの追記です。

    希望通りのコードだったのですが、私のそもそもの質問が『WordPress本文中に』だったのがいけなかったため、検索対象が本文のみで、ページタイトまでは反映していませんでした。

    ページタイトルにも反映させるには、

    {$wpdb->posts}.post_content の行の下に

    post_contentをpost_titleに変えて追加すればいいのでしょうか?

    お手数をおかけしますが、ご助言いただけますと幸いです。
    よろしくお願いします。

    ishitaka

    (@ishitaka)

    既存の検索もコンテンツとタイトル、抜粋が検索対象ですね。失礼しました。
    下記コードは、既存の検索に合わせてタイトルと共に抜粋も検索の対象としました。抜粋が不要の場合は post_excerpt の行を削除してください。

    function my_posts_where( $where, $query ) {
    	global $wpdb;
    
    	if ( is_search() && $query->is_search() ) {
    		$s = $query->query['s'];
    		$s = str_replace( '・', '', $s );
    		$like = $wpdb->esc_like( $s );
    
    		$w =
    			"(REPLACE({$wpdb->posts}.post_title,'・','')  LIKE '%{$like}%') OR " .
    			"(REPLACE({$wpdb->posts}.post_excerpt,'・','')  LIKE '%{$like}%') OR " .
    			"(REPLACE({$wpdb->posts}.post_content,'・','')  LIKE '%{$like}%') OR ";
    
    		$where = preg_replace( '/^(\sAND \(\()(.*\)\))/', '$1' . $w . '$2', $where );
    	}
    
    	return $where;
    }
    add_filter( 'posts_where', 'my_posts_where', 10, 2 );
    berghilo

    (@berghilo)

    ishitakaさん

    再度のご投稿ありがとうございます。

    タイトルも検索対象になりました。
    この度は解決していただき、大変ありがとうございました。

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