PHP8下Contact Form7无法调用ACF repeater数据填充表单求助
问题排查与修复方案
核心问题分析
你的代码在PHP8下失效主要有两个关键原因:
- 赋值运算符误用:
if ($option = 'radio-date')使用了赋值符号=而非严格比较符号===,导致循环逻辑完全错误,每次循环都会强制将$option设为radio-date,引发后续处理异常。 - 未做数组安全校验:当ACF重复器字段无数据时,
get_field()会返回false,PHP8对类型要求更严格,array_map()接收非数组参数会直接抛出TypeError,中断CF7表单提交流程。
修复后的代码
add_filter('wpcf7_form_tag_data_option', function($data, $options, $args) { foreach ($options as $option) { // 使用严格比较运算符匹配目标选项 if ($option === 'radio-date') { $repeater = get_field($option); // 先校验$repeater是否为有效数组,避免类型错误 if (is_array($repeater) && !empty($repeater)) { $items = array_map(function($item) { // 校验子字段存在性,避免Undefined index错误 $start = isset($item['course-date-start']) ? $item['course-date-start'] : ''; $end = isset($item['course-date-end']) ? $item['course-date-end'] : ''; $date = isset($item['course-date']) ? $item['course-date'] : ''; // 清理多余符号,避免空字段导致的格式混乱 return trim("$start - $end, $date", " -,"); }, $repeater); $data = array_merge($data, $items); } } } return $data; }, 10, 3);
额外优化说明
- 保留原始数据:原代码一开始清空
$data = []会丢失其他data:选项的内容,现在改为保留传入的原始数据。 - 子字段安全校验:添加
isset()判断,避免PHP8下出现Undefined index警告,提升代码健壮性。 - 字符串格式清理:用
trim()处理拼接后的字符串,避免空字段带来的多余符号。
调试建议
如果表单仍无法提交,可开启PHP错误日志定位问题:
- 在
wp-config.php中添加配置:define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); - 提交表单后查看
wp-content/debug.log,根据具体错误信息进一步排查。
内容的提问来源于stack exchange,提问作者Edvin Uddfalk
相关产品推荐
相关产品推荐

