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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:11:08