WooCommerce商品検索を高速化する方法(HUSKYテキストフィルター)
サイトに多数の商品(3000以上)があり、[woof_text_filter]によるWooCommerceの商品検索が遅い場合、このガイドが最適化の役に立ちます。
問題点
デフォルトでは、HUSKYは検索にSQL JOIN方式を使用しますが、大規模なデータベースでは遅くなることがあります。テキスト検索に10秒以上かかる、カテゴリーフィルタリングで遅延が発生するなどの症状がよく見られます。
解決策1:高速検索方式を有効にする(post__in)
このプラグインには、SQL JOINの代わりにpost__inを使用する高速検索方式が組み込まれています。これは大規模な商品カタログに対してはるかに効率的です。
実装方法
この1行をテーマのfunctions.phpファイルに追加します:
add_filter('woof_husky_query_post__in', '__return_true');
期待される結果
- テキスト検索速度:10秒以上から1~3秒に改善
- コード追加後すぐに効果が現れます
- データベースの変更は不要です
解決策2:カテゴリーフィルタリングの最適化
高速検索を有効にしてもカテゴリーフィルタリングが遅い場合は、2つのオプションがあります。
オプションA:データベースインデックスを追加(推奨)
データベースインデックスは、term_relationshipsテーブルとterm_taxonomyテーブルを最適化することで、カテゴリークエリを劇的に高速化します。
このコードをfunctions.phpに追加します:
add_action('admin_init', 'add_woof_category_indexes', 999);
function add_woof_category_indexes() {
global $wpdb;
// Run only once
if (get_option('woof_category_indexes_added')) {
return;
}
// Add index to term_relationships table
$wpdb->query("
ALTER TABLE {$wpdb->term_relationships}
ADD INDEX woof_cat_idx (object_id, term_taxonomy_id)
");
// Add index to term_taxonomy table
$wpdb->query("
ALTER TABLE {$wpdb->term_taxonomy}
ADD INDEX woof_tax_idx (taxonomy, term_id)
");
// Mark as completed
update_option('woof_category_indexes_added', true);
}
仕組み:
- 最初の管理ページ読み込み時に1回実行されます
- 最適化されたデータベースインデックスを作成します
- 再実行を防ぐために完了フラグを保存します
期待される結果:
- カテゴリーフィルタリング:数秒から< 1秒に改善
- 恒久的な解決策(コード削除後もインデックスは残ります)
オプションB:カテゴリークエリのキャッシュ
データベース構造を変更できない場合や別のアプローチを希望する場合、キャッシュは良好なパフォーマンス向上を提供します。
このコードをfunctions.phpに追加します:
add_filter('woof_get_query_args', 'cache_woof_category_queries', 10, 1);
function cache_woof_category_queries($args) {
// Only cache when category filter is used
if (empty($_GET['product_cat'])) {
return $args;
}
// Generate cache key based on current filters
$cache_key = 'woof_cat_' . md5(serialize($_GET));
$cached_ids = get_transient($cache_key);
// Return cached results if available
if ($cached_ids !== false) {
$args['post__in'] = $cached_ids;
return $args;
}
return $args;
}
add_action('pre_get_posts', 'store_woof_category_cache', 999);
function store_woof_category_cache($query) {
// Store query results in cache
if (!empty($_GET['product_cat']) && !empty($query->posts)) {
$cache_key = 'woof_cat_' . md5(serialize($_GET));
$post_ids = wp_list_pluck($query->posts, 'ID');
set_transient($cache_key, $post_ids, HOUR_IN_SECONDS);
}
}
仕組み:
- カテゴリーフィルターの結果を1時間キャッシュします
- フィルターの組み合わせごとに一意のキャッシュキーを生成します
- 以降の同一検索ではキャッシュされた商品IDを返します
期待される結果:
- 最初の検索:通常の速度
- 以降の同一検索:ほぼ瞬時の結果
- キャッシュは1時間後に自動的に期限切れになります
どの解決策を使用すべきか
テキスト検索の速度問題の場合:
解決策1を使用(post__inフィルター)– これが最も簡単で効果的な修正です。
カテゴリーフィルタリングの速度問題の場合:
解決策2Aを使用(データベースインデックス)が適している場合:
- データベースへのアクセス権があります
- 恒久的な最適化を希望します
- すべてのクエリで一貫した速度が必要です
解決策2Bを使用(キャッシュ)が適している場合:
- データベース構造を変更できません
- ユーザーが同じ検索を頻繁に繰り返します
- 検索パターンが変動します
解決策の組み合わせ:
最大のパフォーマンスを得るために、すべての解決策を安全に組み合わせることができます:
post__in方式を有効にする(解決策1)- データベースインデックスを追加する(解決策2A)
- キャッシュを追加する(解決策2B)– さらなる強化のためにオプション
重要な注意事項
- 子テーマが必要:テーマ更新時にコードが失われないよう、常に子テーマの
functions.phpにコードを追加してください - まずバックアップ:データベースインデックスを追加する前に、データベースをバックアップしてください
- テスト環境:可能であれば、まずステージングサイトで解決策をテストしてください
- キャッシュのクリア:キャッシュ解決策を使用する場合、キャッシュされた結果は1時間ごとに更新されることに注意してください
変更のテスト
- コードを
functions.phpに追加します - すべてのキャッシュをクリアします(ブラウザ、WordPress、サーバー)
- 以前遅かった検索をテストします
- 検索時間の改善を監視します
サーバーサイドの最適化
これらの解決策で十分な改善が見られない場合は、以下を検討してください:
- より高速なホスティングへのアップグレード
- オブジェクトキャッシュの有効化(Redis/Memcached)
- データベースサーバー設定の最適化
- アクティブなプラグイン数の削減
出典:https://pluginus.net/support/topic/very-slow-woof_text_filter-searches/