2026年5月20日

2026年5月20日

WordPressの日本語検索がうまくいかない場合の解決方法

はじめに

「WordPress」と入力すると記事がヒットするのに「ワードプレス」では何も出てこない、「設定方法」では見つかるのに「設定の方法」では見つからない。WordPressの標準検索はLIKE検索を使っており、日本語の部分一致や類義語には対応していません。この記事では日本語検索を改善する方法を解説します。

症状・原因

WordPressの標準検索の限界:

  • スペース区切りの単語単位WHERE post_content LIKE '%検索語%'で検索
  • 形態素解析なし:「設定方法」「設定の方法」「方法を設定」を同一視しない
  • カナ・漢字の表記ゆれ非対応:「プラグイン」と「ぷらぐいん」が別物扱い
  • AND検索のみ:複数キーワードをスペースで区切るとAND条件になる

解決手順

ステップ1:MySQLのngram全文検索を有効化する

MySQL 5.7以降では日本語対応のngram全文検索を使えます。

-- MySQLでngramパーサーを使った全文インデックスを作成
ALTER TABLE wp_posts ADD FULLTEXT INDEX ft_content_ngram (post_content, post_title)
    WITH PARSER ngram;

-- n-gramのサイズを確認(デフォルト2文字)
SHOW VARIABLES LIKE 'ngram_token_size';

my.cnfで設定を変更する場合:

[mysqld]
# n-gramトークンサイズを1文字に(より細かい検索)
ngram_token_size = 1

ステップ2:WordPressの検索をFULLTEXTに変更する

// functions.php — FULLTEXT検索に切り替え
add_filter('posts_search', function($search, $query) {
    if (!$query->is_search() || !$query->is_main_query()) {
        return $search;
    }
    
    global $wpdb;
    $search_term = $query->get('s');
    
    if (empty($search_term)) {
        return $search;
    }
    
    // FULLTEXT検索のSQL
    $search = $wpdb->prepare(
        " AND MATCH({$wpdb->posts}.post_title, {$wpdb->posts}.post_content)
          AGAINST (%s IN BOOLEAN MODE)",
        $search_term . '*'
    );
    
    return $search;
}, 10, 2);

ステップ3:日本語の表記ゆれに対応する

// functions.php — 検索前にカナ・英字を正規化
add_filter('request', function($vars) {
    if (isset($vars['s'])) {
        $s = $vars['s'];
        
        // 全角英数字を半角に変換
        $s = mb_convert_kana($s, 'as', 'UTF-8');
        
        // カタカナをひらがなに変換
        $s = mb_convert_kana($s, 'H', 'UTF-8');
        
        $vars['s'] = $s;
    }
    return $vars;
});

ステップ4:AND/OR検索を改善する

// functions.php — スペース区切りをOR検索に変更
add_filter('posts_where', function($where, $query) {
    if (!$query->is_search() || !$query->is_main_query()) {
        return $where;
    }
    
    global $wpdb;
    $search_term = $query->get('s');
    $terms = explode(' ', $search_term);
    
    if (count($terms) <= 1) {
        return $where;
    }
    
    // OR検索のWHERE句を構築
    $conditions = [];
    foreach ($terms as $term) {
        $term = trim($term);
        if (!empty($term)) {
            $conditions[] = $wpdb->prepare(
                "({$wpdb->posts}.post_title LIKE %s OR {$wpdb->posts}.post_content LIKE %s)",
                '%' . $wpdb->esc_like($term) . '%',
                '%' . $wpdb->esc_like($term) . '%'
            );
        }
    }
    
    if (!empty($conditions)) {
        $where = " AND (" . implode(' OR ', $conditions) . ")";
    }
    
    return $where;
}, 10, 2);

ステップ5:SearchWPで日本語検索を大幅改善する

SearchWPは日本語対応の高精度検索プラグインです。

# SearchWPをインストール
wp plugin install searchwp --activate

管理画面の「SearchWP」メニューから:

1. Engines → デフォルトエンジンを設定

2. アトリビュート:タイトル・コンテンツ・メタデータの重みを設定

3. インデックス再構築:「Re-index」ボタンで全コンテンツを再解析

ステップ6:Ajax Live Search(リアルタイム検索)を追加する

// live-search.js — 入力中にリアルタイムで候補を表示
document.addEventListener('DOMContentLoaded', function() {
    const searchInput = document.querySelector('input[name="s"]');
    let timeout = null;
    
    searchInput.addEventListener('input', function() {
        clearTimeout(timeout);
        timeout = setTimeout(function() {
            const keyword = searchInput.value;
            if (keyword.length < 2) return;
            
            fetch(`/wp-json/wp/v2/posts?search=${encodeURIComponent(keyword)}&per_page=5`)
                .then(r => r.json())
                .then(posts => {
                    // 検索候補リストを表示
                    showSuggestions(posts);
                });
        }, 300);  // 300msのdebounce
    });
});

注意事項

  • MySQLのFULLTEXTインデックス作成は大規模テーブルでは時間がかかります。本番サイトは深夜に実行してください。
  • ngram_token_size = 1は検索精度は上がりますが、インデックスサイズが増加します。
  • SearchWPは有料プランで高度な機能(ファジー検索・類義語辞書)が使えます。

まとめ

WordPressの日本語検索を改善するには、MySQLのngram全文検索への切り替えかSearchWPの導入が効果的です。表記ゆれ対策としてmb_convert_kana()での正規化も組み合わせると検索精度が大きく向上します。関連記事:検索機能が動作しない場合WordPressのパフォーマンス改善

お気軽にご相談ください

お見積りへ お問い合わせへ