ProdTabs

ProdTabs › Guides

Migration depuis Custom Product Tabs (YIKES) sans perdre d'onglets

Publié le 16 octobre 2026 par .

Le 12 avril 2025, Custom Product Tabs for WooCommerce, l'extension d'onglets produit de YIKES, a reçu sa dernière mise à jour (d'après l'API du répertoire de wordpress.org, interrogée le 16 octobre 2026). Plus de 80 000 boutiques l'utilisent encore. Avant de s'en passer, il faut savoir où elle range ses données : creusons un peu.

Précision : je suis l'auteur de ProdTabs, une extension concurrente, dont je parle dans la dernière partie. Le reste vaut quelle que soit l'extension choisie pour remplacer YIKES.

Les chiffres de wordpress.org

L'API (interface de programmation) du répertoire des extensions est publique et ne demande aucune authentification. Interrogeons-la :

curl -s 'https://api.wordpress.org/plugins/info/1.2/?action=plugin_information&request%5Bslug%5D=yikes-inc-easy-custom-woocommerce-product-tabs'

La réponse est un document JSON de 34 Ko, dont quatre champs suffisent ici :

"version": "1.8.6",
"last_updated": "2025-04-12 5:21pm GMT",
"tested": "6.7.10",
"active_installs": 80000

On voit que la version 1.8.6 n'est déclarée testée que jusqu'à WordPress 6.7 (sorti en novembre 2024), alors que la même API annonce WordPress 7.1.3. L'extension n'est pas cassée pour autant : sur ma boutique de test, en WordPress 7.1.3, elle reste active et ses données se lisent normalement (je n'ai pas vérifié toutes ses fonctions).

Le stockage des onglets

Tous les onglets d'un produit tiennent dans un seul champ personnalisé (custom field), yikes_woo_products_tabs. Lisons-le avec WP-CLI, l'outil en ligne de commande de WordPress, sur un produit de ma boutique de test :

$ wp post meta get 16 yikes_woo_products_tabs --format=json
[{"title":"Livraison","id":"livraison","content":"Livraison en 48 h en France métropolitaine, offerte dès 49 €. [...]"},{"title":"Garantie","id":"garantie","content":"Garantie de 2 ans, pièces et main d'oeuvre."}]

On y trouve un tableau PHP sérialisé (WP-CLI l'affiche ici en JSON), avec un élément par onglet et trois clés : title, id et content. L'ordre du tableau donne l'ordre d'affichage.

Les onglets enregistrés, ceux qu'on réutilise d'un produit à l'autre, sont ailleurs : dans une option du site, que wp option pluck permet de lire élément par élément :

$ wp option pluck yikes_woo_reusable_products_tabs 4 --format=json
{"tab_title":"Garantie","tab_name":"","tab_content":"<p>Garantie de 2 ans, pièces et main d\\'oeuvre.<\/p>","tab_id":4,"taxonomies":[],"tab_slug":"garantie","global_tab":false}

Les clés taxonomies et global_tab servent à la version Pro, qui affiche un onglet sur toute une catégorie ou sur tout le catalogue. Une troisième option relie ces onglets aux produits qui les utilisent :

$ wp option pluck yikes_woo_reusable_products_tabs_applied 16 --format=json
{"1":{"post_id":16,"reusable_tab_id":"1","tab_id":"livraison"},"4":{"post_id":16,"reusable_tab_id":"4","tab_id":"garantie"}}

Le point important pour une migration est qu'un onglet enregistré n'est pas une référence, c'est une copie posée dans chaque produit. Quand on le modifie, YIKES réécrit toutes les copies, produit par produit (fichier admin/class.yikes-woo-saved-tabs.php de la version 1.8.6, à partir de la ligne 208).

Un identifiant tiré du titre

L'identifiant d'un onglet est recalculé à chaque enregistrement par la ligne 168 de admin/class.yikes-woo-tabs.php, qui passe le titre dans sanitize_title() puis dans urldecode() :

$tab_id = urldecode( sanitize_title( $tab_title ) );

Cet identifiant sert à la fois d'ancre (#tab-livraison) et de classe CSS, ce qui a deux conséquences. D'abord, deux onglets portant le même titre sur un produit reçoivent le même identifiant, et YIKES n'en affiche qu'un. Ensuite, renommer un onglet change son ancre (les liens déjà diffusés, dans une lettre d'information par exemple, n'ouvrent plus le bon onglet).

Un identifiant fixé une fois pour toutes, à la création de l'onglet, aurait évité ces deux problèmes. C'est le choix fait dans ProdTabs.

Une désinstallation sans retour

Le fichier de désinstallation de YIKES, uninstall.php, n'a pas changé depuis sept ans et commence par un commentaire sans ambiguïté :

// When the plugin is uninstalled, brush away all footprints; there shall be no trace.

Promesse tenue : les lignes suivantes suppriment le champ yikes_woo_products_tabs de tous les produits, puis les deux options des onglets enregistrés. WordPress n'exécute ce fichier qu'à la suppression de l'extension (en anglais), pas à sa désactivation.

Rappelez-vous donc de laisser YIKES désactivé, sans le supprimer, pendant quelques semaines après la migration.

Les vérifications préalables

Avant de toucher à une boutique en production, on vérifie quatre points :

Sur ma boutique de test, les deux commandes ne trouvent rien (ce ne sera sans doute pas le cas chez vous).

L'import dans ProdTabs

J'ai écrit l'import de la version gratuite de ProdTabs avec une règle : la boutique ne doit jamais afficher un produit sans ses onglets, ni avec des onglets en double. YIKES reste donc actif pendant l'opération : un produit importé n'affiche plus que ses onglets ProdTabs, et les autres ne bougent pas.

Tout commence par une analyse en lecture seule. Sur ma boutique de test, en trois langues et remplie exprès de cas tordus, elle donne ceci :

Écran Importer depuis Custom Product Tabs (YIKES), étape 1 Analyse. Ce qui a été trouvé : 18 produits ont des onglets YIKES, 71 onglets au total ; 5 onglets enregistrés, qui deviennent des onglets partagés, présents 9 fois sur des produits ; produits par langue, fr 8, es 5, it 5 ; YIKES est actif et peut le rester. Points à vérifier : un onglet jamais affiché par YIKES car un autre onglet du produit a le même titre, un onglet sans titre, un onglet qui porte le titre d'un onglet WooCommerce, un onglet identique à un onglet enregistré sans y être lié, un produit modifié hors de WordPress, un code court d'extension inactive, des onglets de traductions sans équivalent, un onglet global de YIKES Pro. Bouton Voir l'aperçu.

Vient ensuite l'aperçu, produit par produit, de la liste d'onglets après l'import :

Étape 2 Aperçu. Choix entre tous les produits (18) et seulement les produits cochés, case cochée Mettre en forme le contenu comme le faisait YIKES. Tableau Produit et Onglets après l'importation : par exemple le Calendrier de l'avent Classique garde Livraison et Garantie, marqués Partagé ; le calendrier Twist 'n Twinkle liste Description, Tab 1 masqué, TAB 1, un onglet sans titre masqué, un onglet en russe, Vidéo et shortcode, et Livraison marqué Personnalisé, avec la mention que l'onglet WooCommerce Description est masqué sur ce produit.

Le même produit a bien un onglet « Tab 1 » et un autre « TAB 1 » (non, ce n'est pas une coquille, c'est un des cas tordus). YIKES n'affichait que le second, d'où la mention « masqué » sur le premier. La case cochée en haut applique aux textes le filtre the_content, comme le faisait YIKES, pour que l'affichage reste identique.

L'import se fait ensuite par lots et reprend là où il s'était arrêté si la page se ferme. Il se termine par ce rapport :

Étape 4 Rapport. Importation terminée : 18 produits importés, 68 onglets ; 5 onglets partagés créés, 9 onglets de produit utilisent désormais un onglet partagé ; 2 onglets importés masqués. Onglets à examiner, classés par cas avec un lien vers chaque produit : pas encore traduit et affiché dans la langue par défaut, importé masqué pour titre en double, importé masqué sans titre, remplace un onglet WooCommerce, copie personnalisée d'un onglet partagé, onglets réparés car modifiés hors de WordPress, onglet absent de la langue par défaut.

Sur une boutique multilingue, un produit et ses traductions sont importés ensemble. Les onglets enregistrés une fois par langue deviennent un seul onglet partagé, avec ses traductions (la suite est dans l'article sur la traduction des onglets).

ProdTabs se télécharge gratuitement. Je n'ai testé cet import que sur mes boutiques de test : si vous le lancez sur un vrai catalogue et qu'il bute sur un cas imprévu, écrivez-moi.

La ligne de commande

Sur un gros catalogue, on a intérêt à passer par WP-CLI. Essayons d'abord le mode d'essai, qui n'écrit rien en base :

$ wp prodtabs import-yikes --dry-run
id   lang  group  status    tabs                                                      notes
[...]
16   fr    16     ok        shared:Livraison #livraison | shared:Garantie #garantie
18   fr    18     ok        -description | Description #description-2 | [hidden] Tab 1 #tab-1-2 | TAB 1 #tab-1 | [...]   duplicate, untitled, replaces_native, looks_saved
20   fr    20     repaired  Cuidado #entretien | Origine #origine
[...]
70   es    17     ok        shared:Livraison #livraison | (default language text) garantie #garantie   missing_translation
[...]
18 products, 5 saved tabs.

Dix-huit produits analysés en 1,7 seconde, c'est raisonnable. Notez que les identifiants de YIKES sont repris tels quels : un lien vers #tab-livraison ouvre toujours le même onglet.

L'option --products=14,15 limite l'import à quelques produits, la commande sans option traite tout le catalogue, et --undo annule l'opération, comme le bouton « Annuler l'importation » du rapport. L'annulation rend aux produits leur état antérieur et met à la corbeille les onglets partagés créés par l'import. Si YIKES est encore actif, ses onglets réapparaissent, à condition que ses données n'aient pas été effacées entre-temps.

Bref, on peut quitter YIKES sans rien perdre, à condition de ne pas commencer par le supprimer.