如何加速 WOOF 文本过滤器搜索
如果您的网站有大量产品(3000+),并且在使用以下插件时遇到搜索性能缓慢的问题 [woof_text_filter],本指南将帮助您进行优化。
问题
默认情况下,HUSKY 使用 SQL JOIN 方法进行搜索,这在大数据库上可能会变慢。文本搜索需要 10 秒以上以及类别过滤导致延迟是常见症状。
Solution 1: Enable Fast Search Method (post__in)
该插件内置了更快的搜索方法,它使用 post__in 而不是 SQL JOINs。这对于大型产品目录来说效率更高。
实现
将这单行添加到您的主题的 functions.php 文件:
add_filter('woof_husky_query_post__in', '__return_true');
预期结果
- 文本搜索速度:从 10+ 秒缩短到 1-3 秒
- 添加代码后立即生效
- 无需数据库更改
解决方案 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);
}
How it works:
- 首次加载管理员页面时运行一次
- 创建优化的数据库索引
- 存储完成标志以防止重复运行
Expected Results:
- 分类过滤:从几秒钟到小于 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);
}
}
How it works:
- 缓存类别过滤器结果 1 小时
- 为每个过滤器组合生成唯一的缓存键
- Returns cached product IDs on subsequent identical searches
Expected Results:
- 第一次搜索:正常速度
- Subsequent identical searches: Near-instant results
- 缓存将在 1 小时后自动过期
使用哪种解决方案?
对于文本搜索速度问题:
使用解决方案 1 (post__in filter) – 这是最简单有效的方法。
对于类别过滤速度问题:
使用解决方案 2A (数据库索引) 如果:
- 您拥有数据库访问权限
- 您想要永久优化
- 您需要所有查询的一致速度
使用解决方案 2B (缓存) 如果:
- 您无法修改数据库结构
- 您的用户经常重复相同的搜索
- You have variable search patterns
组合解决方案:
您可以安全地一起使用所有解决方案以获得最佳性能:
- Enable
post__in方法(解决方案 1) - 添加数据库索引(解决方案 2A)
- 添加缓存(解决方案 2B)– 可选,用于额外提速
重要提示
- 需要子主题: 始终将代码添加到子主题的
functions.php以防止在主题更新过程中丢失 - 备份优先:在添加数据库索引之前,请备份您的数据库
- 测试环境: 如果可能,请先在暂存站点上测试解决方案
- 缓存清除: 如果使用缓存解决方案,请记住缓存结果每小时更新一次
测试您的更改
- Add the code to your
functions.php - Clear all caches (browser, WordPress, server)
- 测试以前缓慢的搜索
- 监控搜索时间改进
服务器端优化
如果这些解决方案仍无法提供足够的改进,请考虑:
- 升级到更快的托管
- 启用对象缓存 (Redis/Memcached)
- 优化您的数据库服务器配置
- 减少活动插件数量
Source: https://pluginus.net/support/topic/very-slow-woof_text_filter-searches/