Comment accélérer la recherche de produits WooCommerce (filtre texte HUSKY)
Si votre site comprend un grand nombre de produits (3000+) et que la recherche de produits WooCommerce via [woof_text_filter] est lente, ce guide vous aidera à l'optimiser.
Le Problème
Par défaut, HUSKY utilise la méthode SQL JOIN pour les recherches, ce qui peut devenir lent sur les grandes bases de données. Les recherches de texte prenant plus de 10 secondes et les filtres de catégories provoquant des délais sont des symptômes courants.
Solution 1 : Activer la méthode de recherche rapide (post__in)
Le plugin dispose d'une méthode de recherche plus rapide intégrée qui utilise post__in au lieu de SQL JOINs. C'est beaucoup plus efficace pour les grands catalogues de produits.
Mise en œuvre
Ajoutez cette seule ligne au fichier functions.php de votre thème :
add_filter('woof_husky_query_post__in', '__return_true');
Résultats attendus
- Vitesse de recherche de texte : de plus de 10 secondes à 1-3 secondes
- Fonctionne immédiatement après l'ajout du code
- Aucune modification de base de données requise
Solution 2 : Optimiser le filtrage par catégorie
Si le filtrage par catégorie est encore lent après avoir activé la recherche rapide, vous avez deux options :
Option A : Ajouter des index de base de données (recommandé)
Les index de base de données accélèrent considérablement les requêtes de catégorie en optimisant les tables term_relationships et term_taxonomy.
Ajoutez ce code à votre 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);
}
Comment ça marche :
- S'exécute une fois lors du premier chargement de la page d'administration
- Crée des index de base de données optimisés
- Stocke un indicateur d'achèvement pour empêcher une nouvelle exécution
Résultats attendus :
- Filtrage par catégorie : de plusieurs secondes à < 1 seconde
- Solution permanente (les index restent après la suppression du code)
Option B : Mettre en cache les requêtes de catégorie
Si vous ne pouvez pas modifier la structure de la base de données ou si vous souhaitez une approche différente, la mise en cache offre une bonne amélioration des performances.
Ajoutez ce code à votre 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);
}
}
Comment ça marche :
- Met en cache les résultats du filtre de catégorie pendant 1 heure
- Génère une clé de cache unique par combinaison de filtres
- Renvoie les IDs de produits mis en cache lors des recherches identiques suivantes
Résultats attendus :
- Première recherche : vitesse normale
- Recherches identiques suivantes : résultats quasi instantanés
- Le cache expire automatiquement après 1 heure
Quelle solution utiliser ?
Pour les problèmes de vitesse de recherche de texte :
Utilisez la Solution 1 (filtre post__in) – c'est la correction la plus simple et la plus efficace.
Pour les problèmes de vitesse de filtrage par catégorie :
Utilisez la Solution 2A (Index de base de données) si :
- Vous avez accès à la base de données
- Vous souhaitez une optimisation permanente
- Vous avez besoin d'une vitesse constante pour toutes les requêtes
Utilisez la Solution 2B (Mise en cache) si :
- Vous ne pouvez pas modifier la structure de la base de données
- Vos utilisateurs répètent souvent les mêmes recherches
- Vous avez des modèles de recherche variables
Combinaison de solutions :
Vous pouvez utiliser toutes les solutions ensemble en toute sécurité pour des performances maximales :
- Activez la méthode
post__in(Solution 1) - Ajoutez des index de base de données (Solution 2A)
- Ajoutez la mise en cache (Solution 2B) – optionnel pour un boost supplémentaire
Remarques importantes
- Thème enfant requis : Ajoutez toujours le code au fichier
functions.phpd'un thème enfant pour éviter toute perte lors des mises à jour du thème - Sauvegardez d'abord : Avant d'ajouter des index de base de données, sauvegardez votre base de données
- Environnement de test : Testez d'abord les solutions sur un site de staging si possible
- Vidage du cache : Si vous utilisez une solution de mise en cache, rappelez-vous que les résultats mis en cache se mettent à jour toutes les heures
Tester vos modifications
- Ajoutez le code à votre
functions.php - Videz tous les caches (navigateur, WordPress, serveur)
- Testez une recherche qui était auparavant lente
- Surveillez l'amélioration du temps de recherche
Optimisation côté serveur
Si ces solutions n'apportent pas suffisamment d'amélioration, envisagez :
- Passer à un hébergement plus rapide
- Activer la mise en cache d'objets (Redis/Memcached)
- Optimiser la configuration de votre serveur de base de données
- Réduire le nombre de plugins actifs
Source : https://pluginus.net/support/topic/very-slow-woof_text_filter-searches/