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が完全にスキップされます。これは、多くのtaxonomy termでDynamic Recountを使用しているストアにとって、最も効果的な単一の切り替えです。
cacheは製品の変更時ではなく、スケジュールに基づいてクリアされます。間隔はcache設定の横にあるauto-cleanオプションで設定されます (デフォルトの有効期限は 1 週間です)。製品のバッチを追加またはインポートした後、管理パネルの clear cache ボタンで手動でフラッシュできます。
Cache Terms を有効にする
recount cacheの隣には、Cache terms 設定があります。フィルターフォームに多数のterms (数百の製品カテゴリ、attributes、またはtags) が含まれている場合、このオプションはレンダリングされたterm listをcacheするため、HTML をページ読み込みごとに再構築する必要がありません。
recount cacheと同じように機能します。スケジュールに基づいてクリアされ、独自のauto-clean intervalと管理パネルの clear terms cache ボタンがあります。深くネストされたカテゴリツリーや多くのattribute valuesを持つストアの場合、両方のcachesを一緒に有効にすることで、リクエストあたりのデータベース負荷を大幅に削減できます。
事前生成された製品データに Turbo Mode を使用する
Turbo Mode は、HUSKY が大規模カタログ向けに提供する最も強力なoptimisationです。有効にすると、アクティブなtermsのすべての組み合わせに対して、フィルタリングされたproduct IDsを含むflat fileを事前生成します。各filter requestで複雑な WP_Query + tax_query + meta_query を構築して実行する代わりに、プラグインは事前計算されたファイルを読み取ります — 応答時間の差はしばしば桁違いです。
Turbo Mode は HUSKY → 拡張機能 → Turbo Mode で設定されます。ファイルの再生成は WordPress cron または、信頼性のために実際のサーバーcrontab を介してスケジュールできます (Turbo Mode cron の設定に関する FAQ を参照してください)。
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 は、内部データを WordPress object cache を介してルーティングするために woof_use_wp_cache hook をサポートしています。すでにpersistent object cache backend (Redis, Memcached) を使用している場合、このhookを有効にすると、フィルターデータがデータベースから高速in-memory storageに移動します。
add_filter('woof_use_wp_cache', function($is){
return true;
});
重要: このhookは、persistent object caching pluginがインストールされていないと効果がありません。これは組み込みのcache settingsの代替ではなく、ホスティング環境がobject cachingをサポートしている場合にそれらを補完します。
最適な結果を得るために設定を組み合わせる
大規模カタログ (10,000 以上の製品、多数のtaxonomy terms) の推奨ベースライン:
- 詳細 → オプションで Cache dynamic recount と Cache terms を有効にする
- Turbo Mode を有効にし、カタログサイズに合わせて製品制限を設定する
persistent object cacheが利用可能な場合はwoof_use_wp_cacheを適用するstagingでwoof_counter_methodをテストして、メモリ節約モードが設定で機能するかどうかを確認するfilter resultsから特定の製品を除外する必要がある場合にのみwoof_products_queryを使用する
まず、2 つの組み込みcache togglesから始めます — これらはコード変更を必要とせず、それ自体で最も顕著な改善をもたらします。