如何使用 HUSKY 加速大型目录中的 WooCommerce 产品筛选
当 WooCommerce 商店的产品数量超过数千时,产品筛选器可能会成为瓶颈。每个taxonomy term都需要一个count query,每个attribute都会增加一个join,而Dynamic Recount则会使数据库工作量倍增。HUSKY(以前称为 WOOF)包含几个专为大型目录设计的内置caching mechanisms和hooks。本文仅涵盖插件源代码中存在的功能 — 没有假设的settings,也没有虚构的hooks。
启用 Cache Dynamic Recount
在 HUSKY → 高级 → 选项中,您会找到设置 Cache dynamic recount number for each item in filter。启用后,HUSKY 会将每个term的recount结果存储在 WordPress 的options table中或作为transient,因此后续页面加载会完全跳过counting queries。对于使用Dynamic Recount和许多taxonomy term的商店来说,这是最有效的单一切换。
cache是按计划清除的,而不是在产品更改时清除。清除间隔由cache设置旁边的auto-clean选项设置(默认过期时间为一周)。添加或导入一批产品后,您可以使用管理面板中的 clear cache 按钮手动清除它。
启用 Cache Terms
在recount cache旁边是 Cache terms 设置。当筛选表单包含大量terms(数百个产品类别、attributes或tags)时,此选项会cache渲染的term list,因此无需在每次页面加载时重建 HTML。
它的工作方式与recount cache相同:按计划清除,有自己的auto-clean interval和管理面板中的 clear terms cache 按钮。对于具有深层嵌套类别树或许多attribute values的商店,同时启用这两个caches可以大幅减少每次请求的数据库负载。
使用 Turbo Mode 进行预生成的产品数据
Turbo Mode 是 HUSKY 为大型目录提供的最强大的optimisation。启用后,它会预生成一个flat file,其中包含每个活动terms组合的过滤后的product IDs。插件不是在每个filter request上构建和执行复杂的 WP_Query + tax_query + meta_query,而是读取预计算的文件 — 响应时间上的差异通常是一个数量级。
Turbo Mode 在 HUSKY → 扩展 → Turbo Mode 下配置。文件再生可以通过 WordPress cron 或为了可靠性,通过真实的服务器crontab 进行调度(请参阅有关 Turbo Mode cron 设置的常见问题解答)。
调整 Turbo Mode 产品限制
默认情况下,Turbo Mode 在cache generation期间处理多达 15,000 种产品。在产品较多的商店中,生成会在所有产品被索引之前停止。使用woof_turbo_mode_products_limit hook 来提高此限制:
add_filter('woof_turbo_mode_products_limit', function($limit) {
// Increase limit for catalogs larger than 15,000 products
return 50000;
});
该hook位于 ext/turbo_mode/index.php:277。将值设置得足够高以覆盖您的整个目录,但请注意文件生成期间的 PHP execution time和memory limits。
优化大型站点的 Counter Method
Dynamic Recount系统使用基于WP_Query的计数器,这在拥有大量产品的商店中可能会消耗大量内存。woof_counter_method hook(来源:classes/counter.php)允许您切换到更轻量级的计数方法,该方法设置 nopaging=false 和 posts_per_page=1,以牺牲潜在的不太精确的计数为代价,减少每次query的内存消耗:
add_filter('woof_counter_method', function($saving_memory) {
// Enable memory-saving counter mode
return true;
});
请先在您的staging站点上测试此功能 — 它在某些配置上运行良好,但并非所有配置都如此。
使用 woof_products_query 自定义 Filter Query
woof_products_query filter hook(来源:index.php)在执行WP_Query之前传递完整的 $query_args 数组。使用它来添加自定义meta queries、排除某些产品或调整query structure以提高性能:
add_filter('woof_products_query', function($query_args) {
// Exclude products that should never appear in filter results
$query_args['meta_query'][] = array(
'key' => '_exclude_from_filter',
'compare' => 'NOT EXISTS'
);
return $query_args;
});
对于taxonomy级别的操作(更改taxonomies之间的relation operators),请使用相关的 woof_main_query_tax_relations hook。
为筛选数据启用 WordPress Object Cache
HUSKY 支持 woof_use_wp_cache hook,通过 WordPress object cache 路由其内部数据。如果您已经使用persistent object cache backend(Redis, Memcached),启用此hook会将筛选数据从数据库移至快速in-memory storage:
add_filter('woof_use_wp_cache', function($is){
return true;
});
重要提示: 如果没有安装persistent object caching plugin,此hook将无效。它不能替代内置的cache settings — 当您的托管环境支持object caching时,它会对其进行补充。
结合设置以获得最佳结果
大型目录(10,000+ 产品,许多taxonomy term)的推荐基线:
- 在高级 → 选项中启用 Cache dynamic recount 和 Cache terms
- 启用 Turbo Mode 并设置产品限制以匹配您的目录大小
- 如果
persistent object cache可用,则应用woof_use_wp_cache - 在
staging上测试woof_counter_method,以查看内存节省模式是否适用于您的设置 - 仅当您需要从
filter results中排除特定产品时才使用woof_products_query
从两个内置的cache toggles开始 — 它们不需要代码更改,并且本身就能带来最显著的改进。