HUSKY - Product Filter for WooCommerce

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 :

  1. Activez la méthode post__in (Solution 1)
  2. Ajoutez des index de base de données (Solution 2A)
  3. 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.php d'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

  1. Ajoutez le code à votre functions.php
  2. Videz tous les caches (navigateur, WordPress, serveur)
  3. Testez une recherche qui était auparavant lente
  4. 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/