You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:06:05