Woocommerce : classer par attribut de produit avec mise à jour automatique des produits

Mathieu Chartier Programmation 0 commentaire

Le technique du filtrage par attribut de produit est relativement commune et connue pour les développeurs de Woocommerce (WordPress) mais il me semblait bon de la rappeler rapidement pour évoquer le sujet qui en découle, à savoir la mise à jour automatique de tous les produits, et notamment de leurs valeurs d'attributs. Nous allons voir comment régler le problème de la sauvegarde manuelle des valeurs d'attributs des produits sans effort, en automatisant tout...

Par défaut, lorsque vous voulez trier par attribut de produit, Woocommerce classe dans n'importe quel ordre car les valeurs d'attributs ne sont pas sauvegardées au bon endroit en base de données, mais uniquement les liaisons entre une valeur donnée et un produit choisi. En d'autres termes, au lieu d'avoir dans la table de données du produit à la fois les informations courantes et les valeurs d'attributs, Woocommerce ne fait qu'enregistrer l'identifiant (ID) de l'attribut. C'est uniquement dans une autre table que les liaisons sont faites entre ce fameux attribut, sa valeur, et le produit. Cela a une conséquence importante, les valeurs n'étant jamais vraiment enregistrées dans la table des produits, le classement se fait sur des valeurs faussées (des valeurs sérialisées qui plus est), et donc dans le désordre.

La seule manière de pouvoir sauvegarder la valeur des attributs dans le produit lui-même est d'ajouter une fonction PHP spécifique, d'entrer dans le produit et de sauvegarder (on attache cette fonction au hook save_post). Si vous souhaitez faire une modification rapide et sauvegarder, cela ne prend pas en compte les attributs, il convient donc bien d'entrer dans chaque produit, un par un, puis de sauvegarder. C'est bien sympa si nous ne possédons qu'une dizaine de produits en ligne, mais quand le nombre s'accroît, la manipulation devient vite chronophage. Nous allons donc voir comment automatiser la sauvegarder des valeurs de tous les attributs d'un seul tenant, en un seul clic sur un bouton (en bas de l'article)...

Filtrer par valeur d'attribut de produit avec Woocommerce

Dans un premier temps, nous allons revoir la technique pour filtrer par valeur d'attribut de produit avec Woocommerce. Ce n'est pas extrêmement compliqué, il faut procéder en deux étapes :

  • La première phase consiste à créer les facteurs de classement qui seront applicables avec Woocommerce.
  • La seconde étape vise à ajouter les types de classement de produits dans les catégories (liste déroulante). Pour rappel, il est possible d'éditer le classement par défaut dans le menu Personnaliser > Woocommerce > Catalogue de produits si besoin.

Dans notre exemple, nous allons ajouter un tri alphabétique des produits, donc sans valeur d'attribut utile, et une classement par barème de prix (et non par prix !), à savoir un attribut créé pour l'occasion sur une boutique en ligne. Dans le code, les attributs de produits commencent toujours par "pa_" suivi du slug de l'attribut ("pa" pour "product attribute" bien entendu). Vous retrouverez donc des valeurs de ce type dans le code.

Voici sans plus attendre la fonction pour créer et personnaliser les critères de classement de Woocommerce.


Maintenant, voici la fonction PHP pour ajouter les types de tris de produits dans Woocommerce. Vous noterez que j'ai masqué trois types de tris ici, dont le tri par défaut (menu_order).


Avec ces deux fonctions, vous obtenez bien un classement fonctionnel pour l'ordre alphabétique, mais pas encore pour les attributs de produits, pour les raisons inhérentes à Woocommerce précédemment évoquées. La capture suivante montre le résultat de la deuxième fonction PHP avec les nouveaux types de tris de produits (le résultat de la première ne pouvant pas vraiment être montré sur une image fixe).

Nouveaux types de tris de produits dans Woocommerce (avec et sans attribut de produit)

Sauvegarder les valeurs d'attributs dans Woocommerce avec save_post

Maintenant que nous savons ajouter les types de tris dans la boutique en ligne, il serait bien de rendre les tris par attributs de produits fonctionnels. Pour ce faire, nous allons devoir ajouter une courte fonction dont l'objectif est d'enregistrer les valeurs d'attributs directement dans le produit (et non plus par liaison de tables dans la base de données). Il s'agit juste de se rattacher au hook save_post pour forcer la sauvegarde des données, il serait également possible de doubler les hooks de rattachement avec edit_post par exemple, voire save_post_{$post->post_type}. Rappelons que ces méthodes d'enregistrement ne fonctionneront que si vous rentrez dans l'édition de la fiche produit et que vous enregistrez...


Voilà, c'est fait, il ne vous restera qu'à enregistrer chaque produit pour que la valeur des attributs soit enregistrée dans la base de données.

Mise à jour automatique des valeurs d'attributs de produits

Avec l'étape précédente, nous avons pu sauvegarder les valeurs d'attributs quand on enregistre un produit, mais cela oblige à refaire la manipulation pour chaque produit, et donc parfois pour des centaines voire milliers de produits déjà existants dans la base de données. En effet, il est tout-à-fait possible lors d'une refonte de site web ou d'amélioration d'une boutique de vouloir ajouter un nouvel attribut et de classer selon lui. Il serait absolument ignoble de devoir enregistrer chaque produit à la main juste pour contrer une sorte de défaut de Woocommerce.

Nous allons donc procéder à une technique simple pour contrer ce manque et ce problème bien embêtant (c'est du vécu, vous vous en doutez... ^^). Dans un premier temps, nous allons voir comment effectuer la sauvegarde automatique des attributs de produits avec Woocommerce, c'est la fonction PHP la plus importante de cet article. Il vous suffira de la rattacher à un hook courant de WordPress pour la lancer ("init", "wp_head", "wp_footer"...). Dans un second temps, nous verrons comment éviter de se rattacher à un hook, mais plutôt en passant par un nouveau bouton ajouter dans les réglages de Woocommerce, ce sera un peu plus "sexy" et fonctionnel. ;-)

Voici donc la fonction d'automatisation de l'enregistrement des attributs de produits. Pensez à supprimer le commentaire au niveau du hook si vous ne voulez pas passer par la seconde étape qui suivra (directement dans l'interface de Woocommerce).


Maintenant, voici comment nous allons ajouter un bouton dans Woocommerce pour effectuer cette procédure de sauvegarde automatique, qui pourra donc être utilisée à tout moment. Je vous mets une capture d'écran pour que vous repériez le menu et l'onglet à rejoindre pour trouver l'option. J'ai placé cela dans l'onglet "Produits > Attributs" du menu de réglages de Woocommerce.

Nouvelle option pour effectuer un enregistrement automatique des attributs de produits dans Woocommerce

Vous noterez qu'il faut trois fonctions plus longues que toutes les autres juste pour ajouter un fichu bouton. C'est un peu le comble dans cet article car jusqu'à présent, il s'agissait de fonctions PHP très courtes et efficaces. Là, on entre un peu plus dans le dur (ça reste accessible bien sûr) juste pour un simple bouton dans une l'interface de Woocommerce... :-)


C'est terminé, vous savez désormais comment trier par attribut de produits dans Woocommerce, tout en automatisant la sauvegarde des valeurs d'attributs de produits au bon endroit dans la base de données, vous devriez gagner pas mal de temps si vous n'aviez pas l'habitude de procéder ainsi... ;-)