php – 布尔值和整数是序列化后的字符串

我正在使用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安装上,而不是每个安装.我还检查了正常工作的serialize功能(返回b:1)

也使用get_post_meta

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

并使用is_bool签入值返回false(显然)

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

解决方法:

update_post_Meta使用update_Metadata你可以在该函数中找到它的代码here如果你看一下at line 119,你会看到Meta_value传递给wp_unslash,返回值是一个字符串(更改数据类型的函数stripslashes_deep)

作为一种解决方法,您可以在将值传递到update_post_meta()之前将其值设为serialize

编辑:
发现问题:在3.6.0之前,update_Metadata有第117行这个代码

$Meta_key = stripslashes($Meta_key)

stripslashes一个返回字符串的PHP函数.
截至3.6.0该行看起来像:

$Meta_key = wp_unslash($Meta_key);

striplashes只有字符串类型Meta_keys.

wordpress 3.6.0或更高版本的更新将解决该问题.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...