vendredi 25 septembre 2026

À propos

Contact

Extensions

Réglages d’extension : une option sérialisée ou plusieurs options ?

Un seul enregistrement dans wp_options ou une entrée par réglage : le choix paraît anodin, jusqu'à ce qu'une migration ou un site multisite en révèle les vrais compromis.

Par Clément Hadrot • 22 juillet 2022 • 5 min de lecture • Aucun commentaire
Réglages d'extension : une option sérialisée ou plusieurs options ?

Deux façons de stocker les réglages d’une extension reviennent sans cesse dans les projets que j’accompagne : tout regrouper dans une unique option sérialisée (un tableau PHP encodé automatiquement par WordPress), ou déclarer une option distincte pour chaque réglage. Aucune des deux n’est universellement supérieure ; le bon choix dépend du nombre de réglages, de leur fréquence de modification, et de la façon dont ils seront lus par le reste du code.

Voici un comparatif mesuré des deux stratégies, sur des critères concrets plutôt que sur une préférence de style.

Option unique : tout dans un tableau sérialisé

update_option( 'kaolin_reglages', array(
    'devise'          => 'EUR',
    'delai_livraison' => 5,
    'notifications'    => array( 'email' => true, 'sms' => false ),
) );

$reglages = get_option( 'kaolin_reglages', array() );
$devise   = $reglages['devise'] ?? 'EUR';

Cette approche, très répandue dans les extensions distribuées sur WordPress.org, s’accorde naturellement avec la Settings API et son mécanisme de groupe d’options unique. Un seul appel à get_option() suffit à récupérer l’ensemble des réglages, ce qui limite le nombre de requêtes en base pour une extension qui consulte plusieurs réglages dans la même page.

Options multiples : une entrée par réglage

update_option( 'kaolin_devise', 'EUR' );
update_option( 'kaolin_delai_livraison', 5 );
update_option( 'kaolin_notification_email', true );
update_option( 'kaolin_notification_sms', false );

$devise = get_option( 'kaolin_devise', 'EUR' );

Chaque réglage devient une ligne indépendante dans wp_options, ce qui permet de mettre à jour un seul réglage sans jamais avoir à relire puis réécrire l’ensemble du tableau, et sans risque d’écraser une modification concurrente sur un autre réglage.

L'essentiel à retenir : Une option unique simplifie la lecture, mais complexifie chaque écriture partielle ; Plusieurs options facilitent le ciblage, au prix d'un nombre d'enregistrements plus élevé ; Le choix doit dépendre du volume de réglages et de leur fréquence de modification indépendante

Comparatif sur les critères qui comptent vraiment

CritèreOption uniquePlusieurs options
Nombre de requêtes en lectureUne seule, quel que soit le nombre de réglagesUne par réglage consulté, sauf préchargement group
Risque d’écrasement concurrentRéel si deux processus modifient des réglages différents en même tempsNul, chaque réglage est indépendant
Compatibilité avec la Settings APINative et directe, un seul groupe d’optionsDemande une déclaration explicite par réglage via register_setting
Autoload et performanceUn seul enregistrement à charger ou exclure de l’autoloadAutoload à gérer réglage par réglage, plus de contrôle mais plus de rigueur requise
Facilité de migration de schémaSimple : on modifie la structure du tableau dans une seule fonctionPlus verbeux : chaque réglage renommé ou restructuré demande sa propre migration
Ciblage par un plugin tiersDifficile : un filtre externe doit connaître toute la structure du tableauFacile : un filtre peut cibler un unique get_option par son nom

Le risque d’écrasement concurrent, en pratique

Ce risque, souvent théorique dans la documentation, s’est révélé bien réel sur un projet de billetterie en ligne : deux écrans d’administration distincts, ouverts simultanément par deux membres différents de l’équipe, modifiaient chacun un sous-ensemble différent du même tableau de réglages sérialisé. Le second enregistrement écrasait systématiquement les modifications du premier, invisibles jusqu’à ce qu’un client signale la disparition d’un réglage pourtant bien modifié quelques minutes plus tôt.

Le correctif a consisté à migrer les réglages les plus sujets à modification concurrente (les statuts d’activation de chaque type de billet) vers des options individuelles, tout en conservant les réglages rarement modifiés (les mentions légales, le texte des courriels de confirmation) dans le tableau sérialisé existant. Une approche hybride, plus pragmatique qu’un choix strictement binaire.

Le nombre de réglages comme critère décisif

  • Moins de dix réglages, rarement modifiés indépendamment : l’option unique reste largement suffisante et la plus simple à maintenir
  • Plusieurs dizaines de réglages, ou des réglages modifiés fréquemment et de façon isolée les uns des autres : les options multiples réduisent les risques et facilitent le ciblage externe
  • Un cas mixte, comme sur ce projet de billetterie : rien n’empêche de faire cohabiter les deux stratégies au sein de la même extension, tant que la logique de séparation reste documentée et cohérente

Le vrai critère n’est pas le nombre de réglages en soi, mais la probabilité que deux d’entre eux soient modifiés indépendamment, par deux personnes ou deux processus différents, au même moment.

Notre verdict

Pour une extension simple, avec une poignée de réglages consultés ensemble et modifiés rarement, l’option unique reste le choix le plus économique en code et en requêtes. Dès qu’un projet grandit, que plusieurs personnes interviennent en parallèle dans l’admin, ou qu’un réglage doit être exposé à d’autres extensions via un simple get_option, la bascule vers des options individuelles, au moins pour les réglages concernés, devient la décision la plus robuste sur la durée.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi