PHP unserialize: decodificar opciones WordPress y datos serializados

PHP unserialize: decodificar opciones WordPress y datos serializados

Deserializa `wp_postmeta` de WordPress, sesiones PHP y caches Laravel a JSON legible en el navegador — solo arrays y escalares, sin script local.

31.08.2026
9 min de lectura
Compartir este artículo:
PHP
Deserialización
WordPress
Depuración
Serialización
Tutorial

¿Por qué decodificar PHP serializado en lugar de mirar a:3:{…}?

Un option_value de WordPress, un wp_postmeta.meta_value, un blob de sesión PHP o un dump de cache Laravel suele llegar al editor como a:3:{s:8:"blogname";…}. Esa cadena es serialize() de PHP — no JSON, no un bundle minificado. El deserializador PHP en línea convierte tokens de arrays y escalares en JSON legible (o sintaxis de array PHP) en el navegador. No ejecuta PHP, no instancia objetos de clase y no sube el payload. Este artículo es el flujo de depuración: dónde viven esos blobs, cómo pegarlos con seguridad y cuándo sigue haciendo falta PHP nativo. Para el formato de cable, JSON vs serialize e inyección de objetos, empieza por la guía de serialización PHP. Los assets front del mismo sitio WordPress son otro trabajo — ver minificación WordPress.

Inspeccionar wp_options, postmeta y transients sin un script PHP local
Salida JSON o array PHP, indent 2 espacios por defecto — nada sale de la pestaña
Parser honesto: solo arrays y escalares — objetos O: y referencias R: rechazados
Más seguro que unserialize() de PHP sobre un dump desconocido: sin ejecución de objetos
Ida y vuelta de arrays vía php-serialize tras editar el JSON legible

Serialize vs unserialize: dos herramientas, un dump WordPress

serialize() escribe; unserialize() lee — FastMinify separa las páginas

PHP serialize() emite una cadena tipada. unserialize() reconstruye el valor. FastMinify replica esa división: php-serialize codifica JSON o sintaxis de array PHP en tokens a:/s:/i:; php-unserialize los decodifica. No pegues un blob serializado en el serializador, ni JSON en el deserializador. Las utilidades vecinas están en el hub de utilidades para desarrolladores.

Página unserialize: pega a:…, s:…, i:…, d:…, b:…, N;
Página serialize: pega JSON o array(…) / => — ver PHP serialize en línea
Formato de salida unserialize: JSON (por defecto) o sintaxis de array PHP
El JSON pretty sirve para leer; el JSON compacto pasa por el minificador JSON en línea después de copiar
Un JS minificado de un plugin no es serialize(): usa un desminificador JavaScript en línea
Dónde WordPress guarda de verdad serialize()

El core y muchos plugins llaman a maybe_serialize() / maybe_unserialize(). Si el valor es un array PHP (o un objeto), se guarda como cadena serialize() en MySQL. Los escalares (cadenas, números) se quedan igual — no verás el prefijo a: en cada fila.

wp_options.option_value — nombre del sitio, permalinks, instancias de widgets, ajustes de plugins
wp_postmeta.meta_value — tamaños de adjuntos, campos personalizados, page builders
wp_usermeta / wp_commentmeta — el mismo patrón, por usuario o comentario
Transients (_transient_*) suelen envolver un array con un timeout
Si la celda empieza por O: más un nombre de clase, FastMinify la rechaza — es un objeto de plugin, no un array
unserialize() de PHP es un límite de seguridad; la herramienta del navegador no es PHP

En PHP, unserialize() sobre entrada no fiable puede instanciar objetos y disparar cadenas gadget (inyección de objetos). FastMinify parsea el formato en JavaScript. Nunca ejecuta PHP y no decodifica objetos de clase O: ni referencias R:. Es un límite y una propiedad de seguridad. Úsalo para inspeccionar dumps de arrays. Un decode correcto no significa «este payload es seguro para unserialize en producción».

Dump desconocido: inspecciona primero en el navegador — sin upload, sin proceso PHP
Si debes decodificar en PHP: unserialize($s, ['allowed_classes' => false]) (PHP 7+)
Nunca eval ni wp-cli eval de un blob copiado de un ticket
Los dumps de opciones pueden contener claves API — una pestaña local es más segura que un deserializador online que envía a un servidor

Qué acepta el parser — y cómo se ve una fila WordPress

Prefijos de tipo en un option_value típico

Cada token empieza por una letra. El deserializador de FastMinify acepta el mismo subconjunto que puede serializar: null, bool, int, float, cadena, array anidado. Objetos y referencias son errores, no omisiones silenciosas.

Antes

a:3:{s:8:"blogname";s:10:"FastMinify";s:11:"description";s:22:"Local developer tools.";s:7:"WPLANG";s:5:"en_US";}

Después

{ "blogname": "FastMinify", "description": "Local developer tools.", "WPLANG": "en_US" }
a:N:{…} — array con N pares clave/valor (asociativo o indexado)
s:n:"…" — cadena; n es la longitud en bytes, no el recuento de caracteres UTF-8
i: entero, d: float, b:0/b:1 bool, N; null
O:8:"stdClass" y R: / r:no se decodifican aquí
Prefijos de longitud rotos (s:3:"hello") fallan en lugar de corromper el resto del array
wp_postmeta: un array anidado que sí se puede leer

Los metadatos de adjuntos y muchos campos tipo ACF son arrays de enteros y cadenas — exactamente el subconjunto de este parser. Pega la celda, deserializa, copia el JSON.

Antes

a:2:{s:5:"width";i:1200;s:6:"height";i:630;}

Después

{ "width": 1200, "height": 630 }
phpMyAdmin / TablePlus: copia la celda cruda, no la vista recortada
WP-CLI wp option get … --format=json ya deserializa en PHP — FastMinify cuando solo tienes el dump SQL
Tras decodificar, barra: JSON (por defecto) vs sintaxis de array PHP; indent 2; espacios o tabulaciones
Filtros opcionales: quitar nulls, arrays vacíos, objetos vacíos o ordenar claves — cambian el payload, déjalos off para una inspección fiel
JSON compacto para un ticket: minificador JSON en línea sobre la salida copiada
Sesiones, caches Laravel y el muro O:

Los archivos de sesión PHP y algunos drivers de cache Laravel guardan payloads serialize(). Si el valor es un array de escalares, la herramienta del navegador funciona. Si es un modelo Eloquent, una instancia Carbon o cualquier clase O:, FastMinify devuelve un error claro. Es esperado — el producto no finge ser el unserialize de PHP.

Laravel Cache::put de un array plano: suele ser a: — pega y decodifica
Eloquent Laravel / DTOs custom: O: — decodifica en PHP con una allow-list, no aquí
Cookies cifradas y payloads encrypt() no son serialize() — descifra primero en la app
Stores igbinary o JSON no son serialize() de PHP — mira el driver antes de pegar
La misma honestidad que la doc de la herramienta: no O:, no R:, no ejecución de objetos

Deserializar en el navegador: un bucle WordPress concreto

Usar el deserializador PHP

Abre el deserializador PHP, pega una sola cadena serializada, pulsa Deserializar. La salida es JSON por defecto (indent 2, espacios). Cambia a sintaxis de array PHP si vas a pegar en un snippet. Todo se queda en la pestaña — sin cuenta, sin ida y vuelta al servidor.

Tokens aceptados: N;, b:, i:, d:, s:, arrays a: anidados
Rechazados: objetos de clase O:, referencias R:/r:, prefijos de longitud truncados o inválidos
Opciones: salida JSON vs array PHP; incluir nulls (on por defecto); quitar arrays/objetos vacíos; ordenar claves; tamaño de indent y espacios vs tab
No es una herramienta de migración SQL WordPress: no hagas find-replace a mano de s:n:"…" en un dump
Escenario — instancia de widget en wp_options

Un widget de la barra lateral se muestra vacío tras una migración. La opción widget_* es un array serializado. Necesitas ver qué claves sobrevivieron, no adivinar desde una celda de 400 caracteres.

1

Paso 1: copiar el option_value crudo

Desde SQL o WP-CLI, copia la cadena completa que empieza en a:. Las vistas recortadas con fallarán al parsear.

2

Paso 2: pegar en php-unserialize

Abre php-unserialize. Deja la salida en JSON. Si ves un error de formato desconocido en O:, el widget guardó un objeto — para aquí y usa PHP con allowed_classes.

3

Paso 3: editar JSON y re-serializar solo si debes escribir de vuelta

Corrige claves en el JSON. Vuelve a codificar con php-serialize. Esta ida y vuelta es para arrays/escalares que este parser soporta — no es idéntica byte a byte a la cadena original de WordPress (orden de claves, espacios). Prefiere WP-CLI wp option update con JSON cuando puedas.

Escenario — dump de cache Laravel en Redis

Redis muestra un valor que empieza por a:. Quieres saber qué claves de config hay en el payload antes de hacer flush de la clave.

1

Paso 1: copiar el payload sin el prefijo de longitud de Redis

Si el driver envuelve serialize() en un prefijo Laravel, quita el prefijo de aplicación hasta el primer a: o s:.

2

Paso 2: decodificar en local

Pega en el deserializador. Los arrays anidados se vuelven objetos o arrays JSON. Los nulls se quedan si «incluir valores null» está activo (por defecto).

3

Paso 3: dejar los payloads O: a PHP

Un token de clase Illuminate\… dará error. Es la herramienta comportándose como está documentada — no un dump Redis roto.

Cuándo sigues necesitando PHP (y cómo hacer la ida y vuelta de arrays)

allowed_classes => false — la inspección en PHP

Si el blob contiene objetos, o estás en un script de deploy, decodifica en PHP sin instanciar clases. Los objetos de clase incompleta te dan el nombre de clase sin ejecutar constructores. FastMinify no sustituye esa barrera.

Ejemplo básico

<?php // Inspeccionar un dump serialize() no fiable sin instanciar clases (PHP 7+). $raw = file_get_contents('option_value.txt'); $value = unserialize($raw, ['allowed_classes' => false]); var_export($value);
WordPress: maybe_unserialize y WP-CLI

El core ya conoce el formato. maybe_unserialize() devuelve arrays. WP-CLI imprime JSON para que nunca edites a mano los prefijos de longitud. Usa FastMinify cuando solo tienes un export SQL o un pegado de ticket — luego escribe de vuelta por las APIs de WP, no con un UPDATE crudo de una cadena serialize() retocada.

Ejemplo básico

# Leer una opción como JSON (WordPress deserializa en PHP). wp option get widget_text --format=json # Actualizar desde un archivo JSON en lugar de parchear s:n:\"…\" en SQL. wp option update my_plugin_settings "$(cat settings.json)" --format=json
Ida y vuelta en el navegador — solo arrays

Decodifica con php-unserialize, edita el JSON, codifica con php-serialize. Los objetos JSON anidados se vuelven arrays PHP, no objetos O:. Ordenar claves o quitar nulls/estructuras vacías cambia lo que escribes de vuelta. La doc on-page lo dice claro: no es una utilidad de migración SQL WordPress byte-accurate. Para CSS/JS del mismo sitio, quédate en la guía de minificación WordPress — otro pipeline.

Ejemplo básico

// Bucle en el navegador (solo arrays/escalares): // 1. Pegar cadena serialize() → php-unserialize → JSON // 2. Editar JSON // 3. Pegar JSON → php-serialize → nueva cadena a:… // No hagas UPDATE de wp_options con un prefijo s:n:"…" editado a mano.

Conclusión

Pega la cadena serialize(), lee el JSON, decide si el payload es un array que puedes ir y volver o un objeto que pertenece a PHP. FastMinify hace esa inspección en local y rechaza O:/R:. No es unserialize(), no es WP-CLI y no es un find-replace seguro sobre dumps MySQL. Para el formato en profundidad, ten la guía de serialización PHP junto a este flujo.

Copia la celda entera — una cadena a: truncada falla al parsear
Deja los payloads O: a PHP con allowed_classes => false
No edites a mano los prefijos s:n:"…" en SQL
Ida y vuelta solo de arrays: unserialize → JSON → serialize
Mantén los dumps en el navegador; option_value puede contener secretos
Compartir este artículo
Compartir este artículo: