Pensé que me estaba haciendo la vida más fácil y estaba consciente del futuro al guardar algunos contenidos como bits de JSON en campos personalizados post_meta. Desafortunadamente, WordPress no está de acuerdo y está haciendo mi vida increíblemente difícil.
Tengo una cadena JSON que se ve esencialmente así. Esto es solo un bit, y la cadena de comentarios son solo algunas entidades unicode ficticias. Todo se genera con json_encode .
{
"0": {
"name": "Chris",
"url": "testdomain.com",
"comment": "\u00a5 \u00b7 \u00a3 \u00b7 \u20ac \u00b7 \u00b7 \u00a2 \u00b7 \u20a1 \u00b7 \u20a2 \u00b7 \u20a3 \u00b7 \u20a4 \u00b7 \u20a5 \u00b7 \u20a6 \u00b7 \u20a7 \u00b7 \u20a8 \u00b7 \u20a9 \u00b7 \u20aa \u00b7 \u20ab \u00b7 \u20ad \u00b7 \u20ae \u00b7 \u20af \u00b7 \u20b9"
}
}
Desafortunadamente, después de guardarlo update_post_meta
, sale así:
{
"0": {
"name": "Chris",
"url": "testdomain.com",
"comment": "u00a5 u00b7 u00a3 u00b7 u20ac u00b7 u00b7 u00a2 u00b7 u20a1 u00b7 u20a2 u00b7 u20a3 u00b7 u20a4 u00b7 u20a5 u00b7 u20a6 u00b7 u20a7 u00b7 u20a8 u00b7 u20a9 u00b7 u20aa u00b7 u20ab u00b7 u20ad u00b7 u20ae u00b7 u20af u00b7 u20b9"
}
}
Y con las barras eliminadas, no se puede json_decode
volver a contenido útil.
¿Alguna idea de por qué WordPress podría estar haciendo esto, y si hay una manera de evitarlo? No puedo usar el indicador JSON_UNESCAPED_UNICODE porque es una instalación de PHP 5.3.x, y ya he intentado codificar htmlentities
antes de pasar el contenido json_encode
, pero eso solo captura un pequeño subconjunto de entidades UTF-8.
¡Gracias por adelantado!
(EDITAR: FWIW, sé que podría guardar una matriz directamente en post_meta y se serializaría y ocurriría magia, pero me gusta la idea de tener los datos almacenados como JSON. Si no hay una solución fácil y elegante voy a la cueva, pero estoy mucho esperando que hay es una solución fácil, elegante!)
¡Hay una manera elegante de manejar esto!
Pase la cadena codificada JSON
wp_slash()
. Esa función escapará a la barra inclinada inicial de cada carácter unicode codificado, lo que evitaráupdate_metadata()
despojarlos.fuente
Puedes engañar a WordPress con algo como esto:
Esta es esa solución fácil * elegante * ...
fuente
Esta función realiza la transformación usando preg_replace:
Antes de cada secuencia "uXXXX" (X = 0..F, hexadecimal) agrega barra invertida. Antes de enviar a DB, llame a esta función.
fuente
Una forma interesante de evitar esto es codificar a base64, ver ejemplo a continuación.
fuente
Para cualquiera que todavía tenga dificultades para guardar una cadena Unicode codificada con JSON a través de wp_update_post , lo siguiente funcionó para mí. Encontrado en class-wp-rest-posts-controller.php
Aquí hay un ejemplo:
fuente
Puede utilizar la función stripslashes_deep () de WordPress.
Para referencia visite aquí
fuente
BARBJANE's
todavía se envía desde WordPress como aBARBJANE\'s
menos que me falte algo aquí ...