HUSKY - Products Filter Professional for WooCommerce

WOOF テキストフィルター検索を高速化する方法

サイトに多数の製品(3000以上)があり、パフォーマンスの低下に苦しんでいる場合 [woof_text_filter]、このガイドはそれを最適化するのに役立ちます。

問題

デフォルトでは、HUSKY は検索に SQL JOIN メソッドを使用しますが、これは大規模なデータベースでは遅くなる可能性があります。テキスト検索に 10 秒以上かかったり、カテゴリフィルタリングで遅延が発生したりするのはよくある症状です。

ソリューション1: 高速検索メソッド (post__in) を有効にする

このプラグインには、組み込みの高速検索方法があり、これを使用します post__in SQL JOIN の代わりに。これは、大規模な製品カタログにとって非常に効率的です。

実装

この1行をテーマの functions.php ファイル:

add_filter('woof_husky_query_post__in', '__return_true');

期待される結果

  • テキスト検索速度: 10秒以上から1〜3秒
  • コードを追加するとすぐに機能します
  • データベースの変更は不要です

ソリューション2:カテゴリフィルタリングの最適化

高速検索を有効にしてもカテゴリフィルターが遅い場合、次の 2 つのオプションがあります:

オプション A: データベースインデックスを追加する (推奨)

Database indexes dramatically speed up category queries by optimizing the term_relationships and 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 秒未満へ
  • 恒久的なソリューション(コード削除後もインデックスは残ります)

オプション B: カテゴリクエリのキャッシュ

If you can’t modify database structure or want a different approach, caching provides good performance improvement.

このコードをあなたの 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を返します

期待される結果:

  • 最初の検索:通常の速度
  • 連続した同一の検索: ほぼ瞬時の結果
  • Cache auto-expires after 1 hour

どのソリューションを使用するか?

テキスト検索の速度の問題について:

ソリューション 1 を使用する (post__inフィルター)–これが最も簡単で効果的な修正です。

カテゴリフィルタリングの速度問題について:

ソリューション 2A を使用 (データベースインデックス)もし:

  • データベースにアクセスできます
  • 永続的な最適化を望む
  • すべてのクエリで一貫した速度が必要です

ソリューション 2B を使用する (キャッシュ) の場合:

  • データベース構造を変更することはできません
  • ユーザーが同じ検索を繰り返すことが多い
  • 複数の検索パターンがあります

ソリューションの組み合わせ:

最大限のパフォーマンスを得るために、すべてのソリューションを安全に併用できます:

  1. 有効化 post__in method (Solution 1)
  2. データベースインデックスを追加する(ソリューション2A)
  3. キャッシングを追加する(ソリューション 2B) – 追加のブーストのためのオプション

重要事項

  • チャイルドテーマ必須: コードは常に子テーマの functions.php テーマの更新中に損失を防ぐため
  • まずバックアップを取ってください:データベースインデックスを追加する前に、データベースをバックアップしてください
  • テスト環境: 可能であれば、まずステージングサイトでソリューションをテストしてください
  • Cache Clearing: キャッシュソリューションを使用している場合、キャッシュされた結果は 1 時間ごとに更新されることに注意してください。

変更のテスト

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

サーバーサイド最適化

これらのソリューションで十分な改善が得られない場合は、次を検討してください。

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

ソース: https://pluginus.net/support/topic/very-slow-woof_text_filter-searches/