Filtre de l'éditeur en masse WooCommerce qui ne fonctionne pas, perdu page 2
Quand le filtre de l'éditeur en masse WooCommerce ne fonctionne pas, le symptôme est presque toujours le même : la première page du tableau affiche les bons produits, puis la page 2, un changement du nombre de lignes par page, un clic sur le tri ou l'interrupteur des variations ramène tout le catalogue. Dans la plupart des cas, le filtre lui-même n'est pas en cause. Ce qui se casse, c'est l'endroit du serveur où BEAR conserve le filtre entre deux requêtes, et c'est aussi pourquoi une modification en masse prévue pour 200 produits filtrés peut finir par s'écrire sur tous les produits de la boutique. Voici comment fonctionne ce stockage, le réglage qui corrige le problème depuis la version 2.2.2, l'ancien extrait de code qui peut silencieusement annuler ce réglage, et les cas où le filtre fonctionne exactement comme prévu mais renvoie tout de même un résultat inattendu.
Comment l'éditeur en masse conserve un filtre d'une page à l'autre
Quand vous appuyez sur Filtrer (Filter), le navigateur envoie les conditions une seule fois. BEAR les enregistre sur le serveur sous une clé aléatoire et la page ne retient que cette clé. Chaque requête suivante, page 2, nouvelle longueur de page, tri, interrupteur variations, modification en masse, export, n'envoie que la clé, et le serveur relit les conditions dans le stockage. Si le stockage ne renvoie rien, il n'y a rien pour filtrer, et la requête s'exécute sur tous les produits.
Le compteur sous le tableau est donc le chiffre le plus important de l'écran. Affichage de l'élément 1 à 50 sur 226 éléments (Showing 1 to 50 of 226 entries) juste après le filtrage, puis sur 5720 éléments (of 5720 entries) à la page 2, signifie que le filtre a été perdu entre les deux requêtes. L'onglet Modifier en bloc (Bulk Edit) n'affiche pas de compteur ; il indique La modification en masse sera appliquée à : les produits filtrés (Bulk editing will be applied to: the filtered products), et il lit le filtre dans le même stockage. Quand le compteur saute, une modification en masse ou un export basé sur le filtre couvre donc, à ce moment-là, tout le catalogue.
Avant chaque Effectuer la modification groupée (Do Bulk Edit) sur un filtre, regardez le compteur. Si un traitement est déjà parti sur les mauvais produits, ouvrez l'onglet Historique (History) : chaque opération en masse y est enregistrée avec les valeurs précédentes et peut être annulée comme un seul enregistrement.
Deux choses effacent un filtre par conception. Recharger la page de l'éditeur ouvre une nouvelle page sans clé, et le filtre disparaît ; enregistrez-le comme profil de filtre si vous en avez de nouveau besoin. Et un filtre stocké expire un jour après son application, de sorte qu'un onglet resté ouvert pendant la nuit demande de réappliquer le filtre avant le traitement en masse suivant.
La solution : Stockage du plugin réglé sur Option
Ouvrez l'onglet Paramètres (Settings) de BEAR et trouvez Stockage du plugin (Plugin memory storage) dans la colonne des réglages généraux. Il a deux valeurs : Option (recommandé) (Option (recommended)) et Transient. Choisissez Option (recommandé) (Option (recommended)) et appuyez sur Enregistrer tous les réglages (Save all settings). Le réglage s'applique à toute la boutique et seul un administrateur peut le modifier. Il existe depuis la version 2.2.2 ; mettez donc d'abord BEAR à jour si vous ne le voyez pas.
Pourquoi c'est important :
- Option conserve le filtre, les données de modification en masse et le compteur de progression du traitement dans une ligne de la table
wp_optionspar utilisateur, nomméewoobe_memory_suivi de l'ID de l'utilisateur, avec le chargement automatique désactivé pour qu'elle ne soit jamais chargée sur les pages de la boutique. Une ligne de base de données ne peut pas être évincée. Les caches peuvent abandonner leur copie, et la requête suivante la relit simplement dans la base de données. - Transient est la façon dont BEAR fonctionnait auparavant. Sur un site sans cache d'objets persistant, un transient est lui aussi une ligne de base de données, et cela fonctionne. Avec Redis ou Memcached, WordPress ne conserve les transients que dans le cache et ne les écrit jamais dans la base de données (voir l'API Transients), de sorte que tout ce qui vide le cache détruit le filtre. La clé du transient était en outre construite à partir de l'adresse IP du visiteur, qui change d'une requête à l'autre derrière certains proxys et CDN et qui est partagée par les collègues d'un même bureau.
Option est la valeur par défaut des nouvelles installations et des installations mises à jour qui n'ont jamais enregistré une autre valeur. Si le compteur saute encore avec Option sélectionné, la section suivante en est la raison la plus probable.
Les anciens extraits woobe_storage_type écrasent le réglage
Pendant des années, la réponse à un filtre perdu était une ligne dans le fichier functions.php du thème qui basculait le stockage sur 'session' ou 'transient' via le filtre woobe_storage_type. Ce filtre existe toujours, et il s'exécute après la lecture du réglage : ce que renvoie l'extrait l'emporte, quoi qu'il y ait de sélectionné dans les Paramètres. Un site qui a ajouté l'extrait il y a des années continue de fonctionner avec des sessions ou des transients après la mise à jour, alors que l'onglet Paramètres affiche Option.
Cherchez woobe_storage_type dans le thème actif, le thème enfant, les mu-plugins et les extensions de snippets. Un reste typique ressemble à ceci :
add_filter('woobe_storage_type', function($type) {
return 'session'; // or 'transient'
});
Supprimez-le, puis choisissez le stockage dans les Paramètres. La session n'y est plus proposée : elle dépend de la gestion des sessions de PHP et de WooCommerce sur le serveur et c'était la moins fiable des trois pour une série de requêtes AJAX. Ne gardez un extrait que si un test sur votre site montre que le réglage seul ne fonctionne pas, et dans ce cas faites-le renvoyer 'option', afin qu'il impose au moins le stockage qui survit à un vidage du cache.
Redis, Memcached et autres caches
Le vidage du cache d'objets et woobe_use_cache_flush
Avant de construire les lignes du tableau, BEAR appelle wp_cache_flush() pour que le tableau affiche les valeurs actuelles et non ce qui était en cache avant votre dernière modification. Sans cache d'objets persistant, cela ne vide que la mémoire de la requête en cours et ne coûte rien. Avec Redis, Memcached ou Object Cache Pro, cela vide tout le cache du site à chaque chargement du tableau, ce qui effaçait autrefois le transient contenant le filtre.
Avec le stockage sur Option, le vidage ne touche plus au filtre. Il impose encore au reste du site une reconstruction du cache à chaque chargement du tableau. Sur une boutique dotée d'un cache d'objets persistant, vous pouvez désactiver le vidage :
// Child theme functions.php or a code snippets plugin.
// BEAR: do not flush the persistent object cache before drawing the products table.
add_filter( 'woobe_use_cache_flush', '__return_false' );
Le compromis : une valeur modifiée à l'instant peut parfois afficher son ancienne version dans le tableau jusqu'au rechargement. La boutique côté visiteur n'est affectée dans aucun cas. Le hook figure avec les autres options au niveau du code sur Plus de paramètres (implicites).
Un cache d'objets persistant est souvent actif sans que personne ne l'ait installé : les hébergeurs gérés et les panneaux d'hébergement activent Redis ou Memcached pour vous. Si Extensions (Plugins) dans wp-admin affiche une liste Drop-ins contenant object-cache.php, vous en avez un.
Caches de pages, d'administration et d'optimisation
Les caches de pages comme WP Rocket, LiteSpeed Cache ou WP-Optimize, les règles de CDN comme une règle Cloudflare « tout mettre en cache », et les caches au niveau de l'hébergement ne doivent jamais mettre en cache /wp-admin/ ni /wp-admin/admin-ajax.php. La page de l'éditeur et chaque requête du tableau passent par ces adresses, et un administrateur doit voir le résultat de la modification qu'il vient de faire, pas une copie stockée. Les réglages par défaut des extensions connues les excluent déjà ; c'est du côté des règles personnalisées, des caches serveur des hébergeurs gérés et des fonctions « optimiser l'administration » qu'il faut chercher. Si le filtre fonctionne avec tout le cache désactivé et échoue quand il est activé, ajoutez les exclusions et videz tous les caches.
Quand le filtre ne renvoie rien ou les mauvais produits
Certains résultats qui ressemblent à un filtre défaillant sont en réalité le filtre faisant exactement ce qu'on lui a demandé.
Une catégorie parente n'inclut pas ses sous-catégories
Filtrer par une catégorie trouve les produits assignés à ce terme. Un produit assigné uniquement à Chaussures > Baskets n'est pas trouvé par Chaussures. Sélectionnez aussi les sous-catégories, ou laissez le filtre inclure les enfants pour les taxonomies que vous choisissez :
// Child theme functions.php or a code snippets plugin.
// BEAR: filtering by a parent term also finds products of its child terms.
add_filter( 'woobe_filter_include_children', function ( $include, $taxonomy ) {
if ( in_array( $taxonomy, array( 'product_cat' ), true ) ) {
return true;
}
return $include;
}, 10, 2 );
La recherche EXACT exige le titre complet
Les comportements de la recherche de texte sont CONTIENT (LIKE), EXACT, PAS (NOT), COMMENCE PAR (BEGIN) et FINIT PAR (END). EXACT compare avec le titre complet, sans tenir compte de la casse : un mot d'un titre de cinq mots ne trouve rien. Utilisez CONTIENT (LIKE) pour une partie de titre. Pour chercher plusieurs textes à la fois, voir plusieurs titres dans le champ de recherche.
Un prix normal exact ne trouve rien
Dans la fourchette du prix normal, la valeur basse est incluse et la valeur haute est exclue, donc 46,90 à 46,90 est une fourchette vide. Saisissez 46,90 à 46,91. Les prix des variations sont aussi recherchés : un produit variable apparaît quand l'une de ses variations est dans la fourchette.
Mis en avant est un champ, pas une clé méta
WooCommerce ne conserve pas mis en avant (Featured) dans les métadonnées de l'article ; un champ méta personnalisé ajouté dans l'onglet Champs méta (Meta Fields) sous un nom comme featured ne trouve donc rien et peut casser le filtre où il est utilisé. Supprimez un tel champ et activez à la place la colonne intégrée mis en avant (Featured) dans les Paramètres.
Thèmes et extensions qui modifient les requêtes de produits
BEAR sélectionne les produits avec une requête WordPress normale ; tout code qui modifie les requêtes de produits dans l'administration ou dans les requêtes AJAX modifie donc aussi les résultats de l'éditeur. Des thèmes qui imposent leur propre tri par défaut des produits, des extensions de recherche qui réécrivent la recherche de produits et des extensions de translittération qui altèrent le texte des requêtes ont tous déjà fait renvoyer au filtre tout le catalogue ou des produits aléatoires. Ouvrez d'abord la console du navigateur (F12) sur la page de l'éditeur et cherchez les erreurs en rouge. Remettez ensuite le tri par défaut des produits de WooCommerce sur un tri standard et testez, ou repérez l'extension fautive avec la méthode de isoler les extensions pendant les modifications en masse, qui permet aussi de tenir durablement une telle extension à l'écart des requêtes de BEAR.
Liste de contrôle : vérifier que le filtre tient
- BEAR est mis à jour vers la version actuelle, et Stockage du plugin (Plugin memory storage) est sur Option (recommandé) (Option (recommended)).
- Aucun extrait
woobe_storage_typene reste dans le thème, le thème enfant, les mu-plugins ou une extension de snippets, sauf s'il renvoie'option'. - Rechargez la page de l'éditeur, appliquez un filtre et notez le compteur sous le tableau.
- Passez à la page 2, changez le nombre de lignes par page, cliquez sur une colonne pour trier et activez puis désactivez variations. Le compteur doit rester identique.
- Cochez deux produits, lancez une petite modification en masse sur eux et vérifiez l'enregistrement dans l'Historique. Lancez ensuite la vraie opération sur le filtre.
Si le compteur change encore avec Option sélectionné et sans extrait en place, ouvrez un sujet sur le forum d'assistance de BEAR en indiquant la version de BEAR, les extensions de cache et de cache d'objets que vous utilisez, et les deux compteurs que vous voyez.