如何反序列化Advanced Custom Fields字段值用于WP All Export Pro导出XML并修复报错
报错原因
这个Invalid argument supplied for foreach()错误是由于原代码假设所有反序列化后的结果都是嵌套在索引为0的数组内,但实际场景中这个前提不成立:反序列化失败返回非数组结果、ACF字段本身是一维数组、字段为空都会导致传给foreach的参数不是可遍历的结构。
修复后的可用代码
将你原函数替换为以下代码即可:
<?php function data_deserialize($value){ // 传入值为空直接返回 if(empty($value)) return ''; $output = ''; $data = maybe_unserialize($value); // 反序列化后不是可遍历结构直接返回原始值 if(!is_array($data) && !$data instanceof Traversable) return $value; // 适配原教程的外层索引0嵌套场景,不需要可以删除这段判断 if(is_array($data) && count($data) === 1 && isset($data[0]) && is_array($data[0])){ $data = $data[0]; } // 校验结构合法后再遍历 if(is_array($data) || $data instanceof Traversable){ foreach ($data as $key => $item){ // 处理值仍为数组的嵌套场景 if(is_array($item)){ $item = json_encode($item, JSON_UNESCAPED_UNICODE); } $output .= $key.': '.$item.PHP_EOL; } }else{ $output = $data; } return $output; } ?>
补充说明
- 代码兼容绝大多数ACF序列化字段场景,遇到异常结构会直接返回原值不会抛出错误
- 如果你确认你的字段不存在外层
0索引包裹,可删除对应注释处的判断代码 - 如果需要导出结果用逗号分隔而非换行,将
PHP_EOL替换为,即可
内容的提问来源于stack exchange,提问作者Robert Z.
相关产品推荐
相关产品推荐

