
PHP unserialize : décoder options WordPress et données sérialisées
Désérialisez `wp_postmeta`, sessions PHP et caches Laravel en JSON lisible dans le navigateur — tableaux et scalaires uniquement, sans script local.
Pourquoi décoder du PHP sérialisé plutôt que lire a:3:{…} ?
Une option_value WordPress, un wp_postmeta.meta_value, un blob de session PHP ou un dump de cache Laravel arrive souvent dans l’éditeur sous la forme a:3:{s:8:"blogname";…}. Cette chaîne est le serialize() de PHP — pas du JSON, pas un bundle minifié. Le désérialiseur PHP en ligne transforme les jetons tableaux et scalaires en JSON lisible (ou en syntaxe tableau PHP) dans le navigateur. Il n’exécute pas PHP, n’instancie pas d’objets de classe, et n’envoie pas la charge utile. Cet article est le workflow de débogage : où vivent ces blobs, comment les coller sans risque, et quand il faut encore du PHP natif. Pour le format filaire, JSON vs serialize, et l’injection d’objets, commencez par le guide de sérialisation PHP. Les assets front du même site WordPress sont un autre chantier — voir la minification WordPress.
Serialize vs unserialize : deux outils, un dump WordPress
PHP serialize() émet une chaîne typée. unserialize() reconstruit la valeur. FastMinify reprend cette scission : php-serialize encode du JSON ou une syntaxe tableau PHP en jetons a:/s:/i: ; php-unserialize les décode. Ne collez pas un blob sérialisé dans le sérialiseur, ni du JSON dans le désérialiseur. Les utilitaires voisins sont sur le hub utilitaires développeur.
a:…, s:…, i:…, d:…, b:…, N;array(…) / => — voir PHP serialize en ligneLe cœur et beaucoup de plugins appellent maybe_serialize() / maybe_unserialize(). Si la valeur est un tableau PHP (ou un objet), elle est stockée comme chaîne serialize() dans MySQL. Les scalaires (chaînes, nombres) restent tels quels — vous ne verrez pas de préfixe a: sur chaque ligne.
wp_options.option_value — nom du site, permaliens, instances de widgets, réglages de pluginswp_postmeta.meta_value — tailles de pièces jointes, champs personnalisés, constructeurs de pageswp_usermeta / wp_commentmeta — même schéma, par utilisateur ou commentaire_transient_*) encapsulent souvent un tableau avec un timeoutO: plus un nom de classe, FastMinify la refuse — c’est un objet plugin, pas un tableauEn PHP, unserialize() sur une entrée non fiable peut instancier des objets et déclencher des chaînes gadgets (injection d’objets). FastMinify parse le format en JavaScript. Il n’exécute jamais PHP, et ne décode pas les objets de classe O: ni les références R:. C’est une limite et une propriété de sûreté. Servez-vous-en pour inspecter des dumps tableaux. Un décodage réussi ne veut pas dire « ce payload est sûr à unserialize en production ».
unserialize($s, ['allowed_classes' => false]) (PHP 7+)eval ni de wp-cli eval sur un blob copié d’un ticketCe que le parseur accepte — et à quoi ressemble une ligne WordPress
Chaque jeton commence par une lettre. Le désérialiseur FastMinify accepte le même sous-ensemble qu’il peut sérialiser : null, bool, int, float, chaîne, tableau imbriqué. Objets et références sont des erreurs, pas des sauts silencieux.
Avant
Après
a:N:{…} — tableau de N paires clé/valeur (associatif ou indexé)s:n:"…" — chaîne ; n est la longueur en octets, pas le nombre de caractères UTF-8i: entier, d: flottant, b:0/b:1 bool, N; nullO:8:"stdClass" et R: / r: — non décodés icis:3:"hello") échouent au lieu de corrompre le reste du tableauLes métadonnées de pièces jointes et beaucoup de champs type ACF sont des tableaux d’entiers et de chaînes — exactement le sous-ensemble géré. Collez la cellule, désérialisez, copiez le JSON.
Avant
Après
wp option get … --format=json désérialise déjà en PHP — FastMinify sert quand vous n’avez que le dump SQLLes fichiers de session PHP et certains drivers de cache Laravel stockent des payloads serialize(). Si la valeur est un tableau de scalaires, l’outil navigateur fonctionne. S’il s’agit d’un modèle Eloquent, d’une instance Carbon, ou de n’importe quelle classe O:, FastMinify renvoie une erreur claire. C’est voulu — le produit ne prétend pas être l’unserialize de PHP.
Cache::put d’un tableau plat : en général a: — coller et décoderO: — décoder en PHP avec une allow-list, pas iciencrypt() ne sont pas du serialize() — déchiffrer d’abord dans l’appO:, pas de R:, pas d’exécution d’objetDésérialiser dans le navigateur : une boucle WordPress concrète
Ouvrez le désérialiseur PHP, collez une seule chaîne sérialisée, cliquez Désérialiser. La sortie est du JSON par défaut (indent 2, espaces). Passez en syntaxe tableau PHP si vous recollez dans un snippet. Tout reste dans l’onglet — pas de compte, pas d’aller-retour serveur.
Un widget de barre latérale s’affiche vide après une migration. L’option widget_* est un tableau sérialisé. Il faut voir quelles clés ont survécu, pas deviner depuis une cellule de 400 caractères.
Étape 1 : copier l’option_value brute
Depuis SQL ou WP-CLI, copiez la chaîne complète qui commence à a:. Les aperçus tronqués avec … échoueront au parse.
Étape 2 : coller dans php-unserialize
Ouvrez php-unserialize. Laissez la sortie sur JSON. Si vous voyez une erreur de format inconnu sur O:, le widget a stocké un objet — arrêtez-vous et utilisez PHP avec allowed_classes.
Étape 3 : éditer le JSON, puis re-sérialiser seulement si vous devez réécrire
Corrigez les clés dans le JSON. Réencodez avec php-serialize. Cet aller-retour concerne les tableaux/scalaires que ce parseur gère — il n’est pas octet-identique à la chaîne WordPress d’origine (ordre des clés, espaces). Préférez WP-CLI wp option update avec du JSON quand c’est possible.
Redis affiche une valeur qui commence par a:. Vous voulez savoir quelles clés de config sont dans le payload avant de flusher la clé.
Étape 1 : copier le payload sans le préfixe de longueur Redis
Si le driver enveloppe serialize() dans un préfixe Laravel, retirez le préfixe applicatif jusqu’au premier a: ou s:.
Étape 2 : décoder en local
Collez dans le désérialiseur. Les tableaux imbriqués deviennent des objets ou tableaux JSON. Les nulls restent si « inclure les valeurs null » est activé (défaut).
Étape 3 : laisser les payloads O: à PHP
Un jeton de classe Illuminate\… produira une erreur. C’est l’outil qui se comporte comme documenté — pas un dump Redis cassé.
Quand il faut encore PHP (et comment faire l’aller-retour tableaux)
Si le blob contient des objets, ou si vous êtes dans un script de deploy, décodez en PHP sans instancier de classes. Les objets de classe incomplète donnent le nom de classe sans exécuter les constructeurs. FastMinify ne remplace pas cette barrière.
Exemple de base
Le cœur connaît déjà le format. maybe_unserialize() renvoie des tableaux. WP-CLI affiche du JSON pour que vous n’éditiez jamais les préfixes de longueur à la main. Utilisez FastMinify quand vous n’avez qu’un export SQL ou un collage de ticket — puis réécrivez via les APIs WP, pas un UPDATE brut d’une chaîne serialize() bricolée.
Exemple de base
Décodez avec php-unserialize, éditez le JSON, encodez avec php-serialize. Les objets JSON imbriqués deviennent des tableaux PHP, pas des objets O:. Trier les clés ou retirer nulls/structures vides change ce que vous réécrivez. La doc on-page le dit clairement : ce n’est pas un utilitaire de migration SQL WordPress octet-accurate. Pour CSS/JS du même site, restez sur le guide minification WordPress — autre pipeline.
Exemple de base
Conclusion
Collez la chaîne serialize(), lisez le JSON, décidez si le payload est un tableau que vous pouvez faire aller-retour ou un objet qui appartient à PHP. FastMinify fait cette inspecte en local et refuse O:/R:. Ce n’est pas unserialize(), pas WP-CLI, et pas un find-replace sûr sur un dump MySQL. Pour le format en profondeur, gardez le guide de sérialisation PHP à côté de ce workflow.
Articles connexes

Stages, includes, règles `rules:` : validez la structure d'un .gitlab-ci.yml avant la pipeline — pas un runner GitLab, pas le CI Lint officiel.

YAML cassé, `on` ou `jobs` manquants, steps vides : validez la structure de vos workflows avant le push — et laissez actionlint à la CI.

Erreurs de syntaxe SDL, review de schéma et formatage avant merge — complément au beautify GraphQL existant.