4

我正在使用 WordPress update_post_meta来保存一个数组,例如

$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);

但是,如果我检查原始字段,我会得到

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;}

虽然它应该是

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;}

您可能会注意到所有布尔值都存储为字符串 ( b:1 = s:1:"1")

问题仅出现在某些 WordPress 安装上,而不是每个安装上。我还检查了工作正常的序列化函数(返回b:1

也使用get_post_meta

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

并使用is_bool检查值返回 false (显然)

编辑:刚刚注意到整数也被保存为字符串

4

1 回答 1

6

update_post_meta 使用 update_metadata如果您查看第 119 行,您可以 在该函数中找到它的代码您会看到 meta_value 被传递给wp_unslash,其返回值是一个字符串(更改数据类型的函数是stripslashes_deep

作为一种解决方法,您可以在将值传递给update_post_meta()之前对其进行序列化

编辑:
发现问题:在 3.6.0 update_metadata 在第 117 行之前,此代码:

$meta_key = stripslashes($meta_key)

stripslashes是一个返回字符串的 php 函数。
从 3.6.0 开始,该行如下所示:

$meta_key = wp_unslash($meta_key);

仅删除字符串类型的 meta_keys。

对 wordpress 3.6.0 或更高版本的更新将解决此问题。

于 2013-10-10T14:44:23.033 回答