PHP使用serialize()序列化数据存储时多出s:前缀如何解决?
问题原因
WordPress 原生的 add_post_meta、update_post_meta、get_post_meta 系列方法内置了序列化/反序列化逻辑,支持直接存储数组、对象等非标量类型,不需要手动调用 serialize() 提前处理。
你提前手动序列化数组后,传入 add_post_meta 的是字符串类型值,WordPress 会对这个字符串再做一次序列化,最终存储的内容就多了一层 s:xxx:"" 外层字符串标识,取数据时就会出现你遇到的输出结果。
解决方案
两种处理方案可选:
方案1(推荐):直接传入原始数组存储
去掉手动序列化的步骤,直接把数组传给 add_post_meta 即可,WordPress 会自动完成序列化和反序列化处理:
<?php $arr = [ "actors" => [ "name" => "Actors", "value" => "Curt Clendenin, Michael Ornelas, Keaton Shyler, David Uchansky" ], "director" => [ "name" => "Director", "value" => "Colin Fleming, John Garside" ], "writer" => [ "name" => "Writer", "value" => "Colin Fleming (story), John Garside (story), Jerry Renek (story)" ] ]; // 直接传原始数组,无需手动序列化 add_post_meta(1, '_attributes', $arr); ?>
取数据时调用 get_post_meta 并将第三个参数设为 true,就能直接拿到原始数组:
$attributes = get_post_meta(1, '_attributes', true);
方案2:手动序列化场景下多做一次反序列化
如果有特殊业务需求必须提前手动序列化数组,取数据时需要连续调用两次 unserialize 才能得到原始数组:
// 第一次反序列化得到你手动生成的序列化字符串 $serialized_str = get_post_meta(1, '_attributes', true); // 第二次反序列化得到原始数组 $attributes = unserialize($serialized_str);
内容的提问来源于stack exchange,提问作者devil
相关产品推荐
相关产品推荐

