
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.
¿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.
Serialize vs unserialize: dos herramientas, un dump WordPress
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.
a:…, s:…, i:…, d:…, b:…, N;array(…) / => — ver PHP serialize en líneaEl 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 pluginswp_postmeta.meta_value — tamaños de adjuntos, campos personalizados, page builderswp_usermeta / wp_commentmeta — el mismo patrón, por usuario o comentario_transient_*) suelen envolver un array con un timeoutO: más un nombre de clase, FastMinify la rechaza — es un objeto de plugin, no un arrayEn 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».
unserialize($s, ['allowed_classes' => false]) (PHP 7+)eval ni wp-cli eval de un blob copiado de un ticketQué acepta el parser — y cómo se ve una fila WordPress
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
Después
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-8i: entero, d: float, b:0/b:1 bool, N; nullO:8:"stdClass" y R: / r: — no se decodifican aquís:3:"hello") fallan en lugar de corromper el resto del arrayLos 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
Después
wp option get … --format=json ya deserializa en PHP — FastMinify cuando solo tienes el dump SQLLos 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.
Cache::put de un array plano: suele ser a: — pega y decodificaO: — decodifica en PHP con una allow-list, no aquíencrypt() no son serialize() — descifra primero en la appO:, no R:, no ejecución de objetosDeserializar en el navegador: un bucle WordPress concreto
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.
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.
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.
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.
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.
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.
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:.
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).
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)
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
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
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
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.
Artículos relacionados

Stages, includes, `rules:`: valida la estructura de un .gitlab-ci.yml antes del pipeline — no es un runner de GitLab ni el CI Lint oficial.

YAML roto, `on` o `jobs` ausentes, steps vacíos: valida la estructura de tus workflows antes del push — y deja actionlint para la CI.

Errores de sintaxis SDL, review de esquema y formateo antes del merge — complemento al beautify GraphQL existente.