使用update_post_meta保存序列化字符串为何会自动追加额外字符?
问题根因
update_post_meta() 属于WordPress内置的元数据操作API,本身自带自动序列化/反序列化逻辑:当你传入数组、对象等复杂数据类型时,函数会自动将其序列化为字符串存入数据库;调用get_post_meta()取值时,也会自动将序列化内容反序列化为原数据类型返回。
你遇到的是二次序列化问题:你手动将数组提前序列化为字符串后传入函数,API会把这个序列化字符串识别为普通字符串,再次做序列化处理,就会在原内容外层追加s:162:"..."格式的包装。
解决方法
常规方案(推荐)
直接传入原始数组,不要手动做序列化操作,示例代码如下:
// 直接定义原始数组,不要手动转序列化字符串 $edd_files = [ 1 => [ 'index' => '0', 'attachment_id' => '0', 'thumbnail_size' => '', 'name' => 'aaa', 'file' => 'aaa', 'condition' => 'all' ] ]; update_post_meta($download_id, 'edd_download_files', $edd_files);
特殊场景方案
如果确实有特殊需求必须存手动序列化后的字符串,可以直接用$wpdb执行SQL语句跳过API的自动序列化逻辑,示例:
global $wpdb; $edd_files = 'a:1:{i:1;a:6:{s:5:"index";s:1:"0";s:13:"attachment_id";s:1:"0";s:14:"thumbnail_size";s:0:"";s:4:"name";s:3:"aaa";s:4:"file";s:3:"aaa";s:9:"condition";s:3:"all";}}'; $wpdb->update( $wpdb->postmeta, ['meta_value' => $edd_files], ['post_id' => $download_id, 'meta_key' => 'edd_download_files'] ); // 元数据不存在时先执行插入 if($wpdb->rows_affected === 0) { $wpdb->insert( $wpdb->postmeta, ['post_id' => $download_id, 'meta_key' => 'edd_download_files', 'meta_value' => $edd_files] ); }
补充说明
你提到的短字符串保存无异常,是因为短字符串为普通文本时,即使被二次序列化,取出时API自动反序列化一次后就能得到原字符串,使用感知不明显;但序列化格式的字符串被二次序列化后,取出得到的还是序列化字符串,无法直接转为数组,才会暴露出问题。
内容的提问来源于stack exchange,提问作者stackprogramer
相关产品推荐
相关产品推荐

