Boolean und Integer sind Strings nach der Serialisierung

Lesezeit: 2 Minuten

Benutzer-Avatar
Xaver

Ich verwende WordPress update_post_meta um ein Array wie zu speichern

$obj = array(
    'array' => array(1, 'zwei', !!3),
    'string' => 'abc',
    'bool' => true,
    'bool2' => false,
    'integer' => 1,
    'integer2' => 17
);

update_post_meta($post_ID, 'my-key', $obj);

Wenn ich jedoch das Rohfeld überprüfe, bekomme ich

a:6:{s:5:"array";a:3:{i:0;i:1;i:1;s:4:"zwei";i:2;s:1:"1";}s:6:"string";s:3:"abc";s:4:"bool";s:1:"1";s:5:"bool2";s:1:"0";s:7:"integer";i:1;s:8:"integer2";i:17;}

während es sein sollte

a:6:{s:5:"array";a:3:{i:0;i:1;i:1;s:4:"zwei";i:2;b:1;}s:6:"string";s:3:"abc";s:4:"bool";b:1;s:5:"bool2";b:0;s:7:"integer";i:1;s:8:"integer2";i:17;}

Möglicherweise stellen Sie fest, dass alle booleschen Werte als Zeichenfolge gespeichert werden (b:1 = s:1:"1")

Das Problem tritt nur bei bestimmten WordPress-Installationen auf und nicht bei jeder. Die habe ich auch gecheckt serialisieren Funktion, die korrekt funktioniert (gibt zurück b:1)

Auch mit get_post_meta

get_post_meta($post_ID, 'my-key', true);

und überprüfen Sie den Wert mit is_bool gibt false zurück (offensichtlich)

BEARBEITEN: Ich habe gerade bemerkt, dass auch Integer als Strings gespeichert werden

  • Gibt es ‘sanitize_meta’-Filter, vielleicht von bestimmten Plugins, die auf die Installationen angewendet werden, in denen dies geschieht? Suchen Sie in der Codebasis nach add_filter('sanitize_

    – Tom

    10. Oktober 2013 um 9:17 Uhr


  • welche WordPress-Version verwendest du? Können Sie wp aktualisieren und dann erneut überprüfen? Ich habe ein wp 3.5.2 installiert und das Problem war da, nachdem ich auf 3.6.1 aktualisiert habe, wurde das Problem behoben

    – jnhghy – Alexandru Jantea

    11. Oktober 2013 um 6:09 Uhr

  • WordPress >= 3.6 verwendet wp_unslash während 3.5.2 noch verwendet striplashes_deep

    – Xaver

    16. Oktober 2013 um 21:08 Uhr

Benutzer-Avatar
jnhghy – Alexandru Jantea

update_post_meta verwendet update_metadata, Sie können seinen Code finden hier in dieser Funktion, wenn Sie einen Blick darauf werfen in Zeile 119 Sie werden sehen, dass der meta_value übergeben wird wp_unslash dessen Rückgabewert ein String ist (die Funktion, die den Datentyp ändert, ist striplashes_deep)

Als Problemumgehung können Sie serialisieren den Wert, bevor Sie ihn übergeben update_post_meta()

BEARBEITEN:
Problem gefunden: vor 3.6.0 hatte update_metadata in Zeile 117 diesen Code:

$meta_key = stripslashes($meta_key)

Streifenwimpern ist eine PHP-Funktion, die einen String zurückgibt.
ab 3.6.0 sieht diese Zeile so aus:

$meta_key = wp_unslash($meta_key);

die nur Strings vom Typ meta_keys entfernt.

Ein Update auf WordPress 3.6.0 oder höher behebt das Problem.

  • beste Antwort bisher! aber wp_unslash verwendet striplashes_deep die nur Zeichenfolgen konvertiert

    – Xaver

    10. Oktober 2013 um 16:04 Uhr

  • Ok, ich habe die Quelle überprüft und es scheint, dass DAS das Problem ist! Du ersparst mir jede Menge Kopfschmerzen!

    – Xaver

    11. Oktober 2013 um 9:45 Uhr

  • Ja, WordPress 3.6.0 sollte nicht mehr entlashen. Wenn dies immer noch der Fall ist, melden Sie dies bitte.

    – hakre

    13. Oktober 2013 um 11:51 Uhr

1282680cookie-checkBoolean und Integer sind Strings nach der Serialisierung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy