HUSKY - Product Filter for WooCommerce

如何加速 WooCommerce 产品搜索(HUSKY 文本筛选器)

如果您的网站拥有大量产品(3000+),并且通过[woof_text_filter]的WooCommerce产品搜索速度较慢,本指南将帮助您进行优化。

问题所在

默认情况下,HUSKY 使用 SQL JOIN 方式进行搜索,这在大数据库上可能会变慢。常见症状包括:文本搜索耗时超过10秒,分类筛选导致延迟。

解决方案一:启用快速搜索方法(post__in)

该插件内置了一种更快的搜索方法,使用post__in代替 SQL JOIN。对于大型产品目录来说,这种方法高效得多。

实施步骤

将以下这一行代码添加到您主题的functions.php文件中:

add_filter('woof_husky_query_post__in', '__return_true');

预期效果

  • 文本搜索速度:从超过10秒缩短到1-3秒
  • 添加代码后立即生效
  • 无需修改数据库

解决方案二:优化分类筛选

如果在启用快速搜索后分类筛选仍然缓慢,您有两个选项:

选项A:添加数据库索引(推荐)

数据库索引通过优化term_relationshipsterm_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:缓存分类查询

如果您无法修改数据库结构或希望采用不同方法,缓存也能带来良好的性能提升。

将以下代码添加到您的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小时后自动过期

应该使用哪种解决方案?

针对文本搜索速度问题:

使用解决方案一(post__in 筛选)——这是最简单也最有效的修复方法。

针对分类筛选速度问题:

使用解决方案二A(数据库索引),如果:

  • 您有数据库访问权限
  • 您希望实现永久优化
  • 您需要所有查询都保持一致的快速

使用解决方案二B(缓存),如果:

  • 您无法修改数据库结构
  • 您的用户经常重复相同搜索
  • 您的搜索模式变化多样

组合使用解决方案:

您可以安全地同时使用所有解决方案以获得最佳性能:

  1. 启用post__in方法(解决方案一)
  2. 添加数据库索引(解决方案二A)
  3. 添加缓存(解决方案二B)——可选,用于进一步提升

重要说明

  • 必须使用子主题:始终将代码添加到子主题的functions.php中,以防止主题更新时丢失
  • 先备份:在添加数据库索引之前,先备份您的数据库
  • 测试环境:如有可能,先在临时站点上测试解决方案
  • 缓存清除:如果使用缓存方案,请记住缓存结果每小时更新一次

测试您的更改

  1. 将代码添加到您的functions.php
  2. 清除所有缓存(浏览器、WordPress、服务器)
  3. 测试之前缓慢的搜索
  4. 观察搜索时间改善情况

服务器端优化

如果这些解决方案未能提供足够的改进,请考虑:

  • 升级到更快的主机
  • 启用对象缓存(Redis/Memcached)
  • 优化您的数据库服务器配置
  • 减少活跃插件数量

来源https://pluginus.net/support/topic/very-slow-woof_text_filter-searches/