<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fleuristore</title>
    <description>The latest articles on DEV Community by Fleuristore (@fleuristore).</description>
    <link>https://dev.to/fleuristore</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4222813%2F6cbc974f-04bf-444d-9a37-eeb2d96ca273.png</url>
      <title>DEV Community: Fleuristore</title>
      <link>https://dev.to/fleuristore</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fleuristore"/>
    <language>en</language>
    <item>
      <title>WooCommerce : des images de catégorie par saison sans écraser l'image par défaut</title>
      <dc:creator>Fleuristore</dc:creator>
      <pubDate>Tue, 03 Nov 2026 14:20:42 +0000</pubDate>
      <link>https://dev.to/fleuristore/woocommerce-des-images-de-categorie-par-saison-sans-ecraser-limage-par-defaut-dca</link>
      <guid>https://dev.to/fleuristore/woocommerce-des-images-de-categorie-par-saison-sans-ecraser-limage-par-defaut-dca</guid>
      <description>&lt;p&gt;On a un catalogue WooCommerce de fournitures pour fleuristes, &lt;a href="https://fleuristore.fr/" rel="noopener noreferrer"&gt;Fleuristore&lt;/a&gt;, avec une vingtaine de rayons et de pages "métier". Chaque terme a son image, choisie pour être intemporelle : fond clair, lumière du jour, produits seuls.&lt;/p&gt;

&lt;p&gt;Puis arrive Noël. On veut que la page &lt;a href="https://fleuristore.fr/occasion/noel/" rel="noopener noreferrer"&gt;Noël&lt;/a&gt; et les vignettes de l'accueil passent en version houx et rouge, sans perdre les images de base, et sans devoir tout remettre à la main le 27 décembre.&lt;/p&gt;

&lt;h2&gt;
  
  
  La règle : ne jamais écraser &lt;code&gt;thumbnail_id&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;La tentation est de remplacer l'image du terme pendant la saison. C'est le meilleur moyen d'oublier de la remettre, ou de perdre l'image d'origine. On a donc posé une règle simple :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;thumbnail_id&lt;/code&gt; reste &lt;strong&gt;l'image par défaut&lt;/strong&gt;, pour toujours ;&lt;/li&gt;
&lt;li&gt;chaque saison ajoute une &lt;strong&gt;variante&lt;/strong&gt; dans une term meta à part : &lt;code&gt;fl_thumb_noel&lt;/code&gt;, &lt;code&gt;fl_thumb_saint-valentin&lt;/code&gt;, etc. ;&lt;/li&gt;
&lt;li&gt;un filtre choisit la bonne image au moment de l'affichage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Le filtre
&lt;/h2&gt;

&lt;p&gt;WordPress passe toutes les lectures de métadonnées de terme par &lt;code&gt;get_term_metadata&lt;/code&gt;. Il suffit d'intercepter &lt;code&gt;thumbnail_id&lt;/code&gt; côté front :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'get_term_metadata'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$term_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$meta_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$single&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nf"&gt;is_admin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$meta_key&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="s1"&gt;'thumbnail_id'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// l'admin voit toujours l'image par défaut&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nv"&gt;$saison&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ma_saison_courante&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// ex. 'noel', ou null hors saison&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;$saison&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nv"&gt;$variante&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_term_meta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$term_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'fl_thumb_'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$saison&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;$variante&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// pas de variante : on garde le défaut&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$single&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$variante&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$variante&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;L'appel à &lt;code&gt;get_term_meta()&lt;/code&gt; dans le filtre ne boucle pas : la clé demandée n'est plus &lt;code&gt;thumbnail_id&lt;/code&gt;, donc le filtre la laisse passer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les pièges rencontrés
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. L'admin doit rester honnête.&lt;/strong&gt; Sans le &lt;code&gt;is_admin()&lt;/code&gt;, l'écran d'édition du terme affiche l'image de saison comme si c'était l'image principale. Et pour relire le vrai défaut depuis un script pendant la saison, il faut passer par la table &lt;code&gt;termmeta&lt;/code&gt; en SQL : &lt;code&gt;get_term_meta()&lt;/code&gt; est filtré.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Les images écrites en dur.&lt;/strong&gt; La page d'accueil avait des vignettes de rayons insérées avec une URL d'image figée (&lt;code&gt;...-768x505.jpg&lt;/code&gt;), pas via le terme. Le filtre ne les voit pas. On a ajouté un second passage qui remplace le &lt;code&gt;src&lt;/code&gt; de ces vignettes d'après le lien vers le rayon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. L'extinction automatique.&lt;/strong&gt; Tout dépend de &lt;code&gt;ma_saison_courante()&lt;/code&gt;, qui lit un calendrier. Le 27 décembre, la fonction ne renvoie plus &lt;code&gt;noel&lt;/code&gt;, le filtre rend la main, et l'image par défaut revient sans intervention. Il reste à purger le cache de pages au changement de saison.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce que ça change au quotidien
&lt;/h2&gt;

&lt;p&gt;Ajouter la Saint-Valentin revient à poser des &lt;code&gt;fl_thumb_saint-valentin&lt;/code&gt; sur les termes concernés. Pas de code, pas de retour arrière à prévoir. Les rayons qui n'ont pas de variante gardent simplement leur image habituelle, par exemple le rayon &lt;a href="https://fleuristore.fr/categorie-produit/emballage-papier-fleuriste/" rel="noopener noreferrer"&gt;emballage pour fleuriste&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Article rédigé avec l'aide d'une IA (Claude), relu et basé sur une mise en place réelle sur notre boutique.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>Structurer un catalogue WooCommerce B2B : trois axes plutôt qu'un</title>
      <dc:creator>Fleuristore</dc:creator>
      <pubDate>Mon, 02 Nov 2026 17:14:22 +0000</pubDate>
      <link>https://dev.to/fleuristore/structurer-un-catalogue-woocommerce-b2b-trois-axes-plutot-quun-43i2</link>
      <guid>https://dev.to/fleuristore/structurer-un-catalogue-woocommerce-b2b-trois-axes-plutot-quun-43i2</guid>
      <description>&lt;p&gt;Quand on vend des fournitures à des professionnels, le réflexe est de ranger le catalogue comme un rayon de magasin : contenants, emballage, matériel, déco. Ça marche pour l'acheteur qui sait déjà ce qu'il cherche. Ça marche beaucoup moins bien pour celui qui arrive avec un &lt;strong&gt;métier&lt;/strong&gt; ou un &lt;strong&gt;événement&lt;/strong&gt; en tête.&lt;/p&gt;

&lt;p&gt;Sur &lt;a href="https://fleuristore.fr/" rel="noopener noreferrer"&gt;Fleuristore&lt;/a&gt;, un grossiste en ligne de fournitures pour fleuristes et décorateurs, on a fini par organiser le catalogue sur trois axes indépendants. Voici le raisonnement et ce que ça implique côté WooCommerce.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Les rayons : la taxonomie produit classique
&lt;/h2&gt;

&lt;p&gt;Les catégories WooCommerce (&lt;code&gt;product_cat&lt;/code&gt;) restent la base : un produit appartient à un rayon, l'arborescence est stable, les URL ne bougent pas. C'est l'axe « quoi ».&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Les métiers : une taxonomie dédiée
&lt;/h2&gt;

&lt;p&gt;Un fleuriste et un décorateur événementiel n'achètent pas la même chose, même dans le même rayon. Plutôt que de dupliquer des catégories, on a créé une taxonomie personnalisée « métier », avec ses propres pages d'archive, par exemple &lt;a href="https://fleuristore.fr/metier/fleuristes/" rel="noopener noreferrer"&gt;les fournitures pour fleuristes&lt;/a&gt; ou &lt;a href="https://fleuristore.fr/metier/decorateurs/" rel="noopener noreferrer"&gt;pour décorateurs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Une déclaration minimale ressemble à ceci :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;register_taxonomy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'metier'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'label'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Métiers'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'hierarchical'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'public'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'rewrite'&lt;/span&gt;      &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s1"&gt;'slug'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'metier'&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'show_in_rest'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un produit peut appartenir à plusieurs métiers : c'est l'axe « pour qui ».&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Les occasions : le calendrier
&lt;/h2&gt;

&lt;p&gt;Troisième taxonomie, « occasion » : mariage, Noël, fête des mères… C'est l'axe « pour quand ». Une page comme &lt;a href="https://fleuristore.fr/occasion/mariage/" rel="noopener noreferrer"&gt;décoration de mariage&lt;/a&gt; rassemble des produits venus de rayons très différents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce que ça change
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pas de duplication&lt;/strong&gt; : un produit vit à un seul endroit, les trois axes ne sont que des filtres.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Des pages d'atterrissage naturelles&lt;/strong&gt; pour les recherches du type « fournitures mariage » ou « matériel fleuriste ».&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Un point de vigilance&lt;/strong&gt; : chaque archive de taxonomie a besoin d'un vrai texte d'introduction et d'une image par défaut, sinon on se retrouve avec des pages pauvres. On stocke l'image dans un &lt;code&gt;term_meta&lt;/code&gt; (&lt;code&gt;thumbnail_id&lt;/code&gt;) et on ne l'écrase jamais automatiquement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si vous gérez un catalogue B2B sur WooCommerce, posez-vous la question : vos clients cherchent-ils un produit, un usage ou une date ? Souvent, les trois.&lt;/p&gt;

</description>
      <category>woocommerce</category>
      <category>ecommerce</category>
      <category>wordpress</category>
    </item>
  </channel>
</rss>
