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のパフォーマンス改善