WordPress entkleidet Backslashes aus JSON-Strings in post_meta

Ich dachte, dass ich mein Leben einfach und zukunftsbewusst machen würde, indem ich einige Inhalte als JSON-Bits in benutzerdefinierten post_meta-Feldern speichern würde. Leider stimmt WordPress nicht zu und macht mein Leben unglaublich schwierig.

Ich habe eine JSON-Zeichenfolge, die im Wesentlichen so aussieht. Dies ist nur ein Bit, und die Kommentarzeichenfolge besteht nur aus Dummy-Unicode-Entitäten. Das Ganze wird mit json_encode generiert.

{ "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" } } 

Leider, nachdem ich es mit update_post_meta , update_post_meta es so aus:

 { "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" } } 

Und json_decode die Schrägstriche entfernt sind, kann es nicht mehr in nützlichen Inhalt zurückversetzt werden.

Irgendwelche Ideen, warum WordPress dies tun könnte und ob es einen Weg gibt, es zu vermeiden? Ich kann das JSON_UNESCAPED_UNICODE-Flag nicht verwenden, da dies eine Installation von PHP 5.3.x ist, und ich habe bereits versucht, mit htmlentities zu json_encode , bevor der Inhalt an json_encode , aber nur eine kleine Teilmenge von UTF-8-Entitäten erfasst.

Danke im Voraus!

(EDIT: FWIW, Ich weiß, ich könnte ein Array direkt in post_meta speichern und es würde serialisiert werden und Magie würde passieren, aber ich mag einfach die Idee, die Daten als JSON zu speichern. Wenn es keine einfache, elegante Lösung gibt Ich werde hüllen, aber ich hoffe sehr, dass es eine einfache, elegante Lösung gibt!)

Solutions Collecting From Web of "WordPress entkleidet Backslashes aus JSON-Strings in post_meta"

Sieht nicht so aus, als könnte man es vermeiden.

Die function update_metadata (), die letztendlich für das Speichern des Metas zuständig ist, führt explizit einen stripslashes_deep () für den Metawert aus. Diese function entfernt sogar Schrägstriche von Array-Elementen, wenn der Wert ein Array ist.

Es gibt einen Filter, der nach dem Aufruf von “sanitize_meta” ausgeführt wird und in den Sie sich einklinken können. Aber an diesem Punkt sind Ihre Schrägstriche bereits entfernt worden, so dass Sie nicht zuverlässig bestimmen können, wo sie wieder eingefügt werden müssen (oder zumindest weiß ich nicht, wie Sie den Unterschied zwischen der Anführung legitimer JSON-Begrenzer gegen Bits unterscheiden würden von Werten).

Kann nicht sagen, warum es das tut, aber es tut es. Wahrscheinlich, weil es schließlich durch wpdb-> update läuft, das die Zeichenfolgen unescaped benötigt.

Wie Sie befürchtet haben, ist es wahrscheinlich besser, den Wert einfach als Array zu speichern, das serialisiert wird (wie Sie sagten). Wenn Sie es später als JSON möchten, können Sie es einfach über json_encode () ausführen.

Es gibt eine elegante Art, damit umzugehen!

wp_slash() die JSON-codierte Zeichenfolge durch wp_slash() . Diese function wird dem führenden Schrägstrich jedes codierten Unicode-Zeichens entgehen, wodurch verhindert wird, dass update_metadata() sie entfernt.

Sie können mit so etwas wie WordPress schummeln:

 $cleandata = str_replace('\\', '\\\\', json_encode($customfield_data, true)); 

Das ist so einfach * elegante Lösung * …

Ein interessanter Weg, dies zu umgehen, ist die Codierung nach base64, siehe Beispiel unten.

 $data = Array(0 => array('name' => 'chris' , 'URL' => "hello.com")); $to_json = json_encode($data); echo $to_json . "
"; //echos [{"name":"chris","URL":"hello.com"}] $to_base64 = base64_encode($to_json); Echo $to_base64 . "
"; //echos W3sibmFtZSI6ImNocmlzIiwiVVJMIjoiaGVsbG8uY29tIn1d $back_to_json = base64_decode($to_base64); Echo $back_to_json . "
"; //echos [{"name":"chris","URL":"hello.com"}] $back_to_aray = json_decode($back_to_json); print_r($back_to_aray) ; //echos Array ( [0] => stdClass Object ( [name] => chris [URL] => hello.com ))

Diese function führt die Transformation mit preg_replace durch:

 function preg_replace_add_slash_json($value) { return preg_replace('/(u[0-9a-fA-F]{4})/i', '\\\$1', $value); } 

Vor jeder “uXXXX” (X = 0, F, hexadezimal) Sequenz wird ein Backslash hinzugefügt. Rufen Sie diese function vor dem Senden an die DB auf.

Sie können die function stripslashes_deep () von WordPress verwenden.

 < ?php stripslashes_deep($your_json);?> 

Für Referenz besuchen Sie hier