HUSKY - Product Filter for WooCommerce

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を使用(キャッシュ)が適している場合:

  • データベース構造を変更できません
  • ユーザーが同じ検索を頻繁に繰り返します
  • 検索パターンが変動します

解決策の組み合わせ:

最大のパフォーマンスを得るために、すべての解決策を安全に組み合わせることができます:

  1. post__in方式を有効にする(解決策1)
  2. データベースインデックスを追加する(解決策2A)
  3. キャッシュを追加する(解決策2B)– さらなる強化のためにオプション

重要な注意事項

  • 子テーマが必要:テーマ更新時にコードが失われないよう、常に子テーマのfunctions.phpにコードを追加してください
  • まずバックアップ:データベースインデックスを追加する前に、データベースをバックアップしてください
  • テスト環境:可能であれば、まずステージングサイトで解決策をテストしてください
  • キャッシュのクリア:キャッシュ解決策を使用する場合、キャッシュされた結果は1時間ごとに更新されることに注意してください

変更のテスト

  1. コードをfunctions.phpに追加します
  2. すべてのキャッシュをクリアします(ブラウザ、WordPress、サーバー)
  3. 以前遅かった検索をテストします
  4. 検索時間の改善を監視します

サーバーサイドの最適化

これらの解決策で十分な改善が見られない場合は、以下を検討してください:

  • より高速なホスティングへのアップグレード
  • オブジェクトキャッシュの有効化(Redis/Memcached)
  • データベースサーバー設定の最適化
  • アクティブなプラグイン数の削減

出典https://pluginus.net/support/topic/very-slow-woof_text_filter-searches/