如何从WordPress存储的序列化数组中提取email字段值
错误原因分析
- 第一种写法错误:
get_post_custom()返回的每个自定义字段值都是索引数组,你循环拿到的$value是未经反序列化的序列化字符串,PHP中用字符串按下标['email']取值时,会自动将非数字下标转为整数0,最终取到的就是字符串第一个字符s。 - 第二种写法错误:你直接取
$data[0]是拿到序列化字符串的第一个字符,后续的拆分逻辑完全不符合PHP序列化格式的解析规则,自然无法拿到正确值。
正确实现代码
适配你当前的存储逻辑,直接反序列化取出的值即可:
global $post; $post_id = $post->ID; // 第三个参数传true直接获取单个offer值,无需处理get_post_custom返回的多层数组 $offer_serialized = get_post_meta($post_id, 'offer', true); // 反序列化得到原始提交数组 $offer_arr = unserialize($offer_serialized); // 增加校验避免报错 if (is_array($offer_arr) && isset($offer_arr['email'])) { // 输出email值 echo $offer_arr['email']; }
存储逻辑优化建议
WordPress的add_post_meta/update_post_meta原生支持数组/对象类型的值,会自动完成序列化和反序列化操作,不需要你手动调用serialize处理,修改存储代码后后续取值更简洁:
if(isset($_POST['submit_offer'])){ global $post; $id = $post->ID; $offer_details = array( 'name' => sanitize_text_field($_POST['name']), 'email' => sanitize_text_field($_POST['email']), 'message' => sanitize_text_field($_POST['message_content']) ); // 直接传数组即可,无需手动序列化 $check = add_post_meta( $id, 'offer', $offer_details ); } if($check){esc_html_e( 'Offer Submitted.', 'ivproperty' );}
优化存储逻辑后,取值代码可简化为:
$offer_arr = get_post_meta($post->ID, 'offer', true); if (isset($offer_arr['email'])) { echo $offer_arr['email']; }
注意:当前场景下你存储的序列化内容都是站点自身生成的可信数据,反序列化不存在安全风险。
内容的提问来源于stack exchange,提问作者Sanad
相关产品推荐
相关产品推荐

