排查Contact Form 7对接外部CRM API的提交失败问题
Contact Form 7 数据同步CRM问题排查与修复
一、核心问题定位
你的代码存在几个关键问题,导致数据同步失败且无有效反馈:
- 日志输出变量错误:使用
var_dump($posted_data)但实际变量是$data,导致日志无内容 - 请求头缺失
Content-Type:API无法识别JSON格式的请求体 wp_safe_remote_post域名限制:若CRM域名不在WP安全列表中,请求会被拦截- 前端响应未生效:未在API失败时设置
$abort = true,CF7会强制显示默认成功消息 - 条件判断逻辑重叠:第二个
if未与第一个错误判断互斥,可能覆盖错误消息
二、优化日志输出(获取完整调试信息)
1. 开启WP调试日志
在wp-config.php中添加配置,确保日志写入wp-content/debug.log:
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false);
2. 完善日志记录代码
替换原有日志代码,记录提交数据、API请求/响应的完整信息:
// 记录CF7提交的原始数据 error_log('CF7提交数据: ' . print_r($data, true)); // 记录API请求详情 error_log('API请求URL: ' . $apiurl); error_log('API请求头: ' . print_r($apiheaders, true)); error_log('API请求体: ' . json_encode($apibody)); // 记录API响应详情 error_log('API响应结果: ' . print_r($response, true)); error_log('响应状态码: ' . $response_code);
三、前端显示自定义提交状态
要让自定义错误/成功消息生效,必须在API失败时设置$abort = true,阻止CF7执行默认流程:
// API请求错误处理 if (is_wp_error($response)) { $abort = true; $error_msg = $response->get_error_message(); $submission->set_response('提交失败:' . $error_msg); $submission->set_status('api_failed'); } // API响应非200处理 elseif ($response_code != 200) { $abort = true; $response_body = wp_remote_retrieve_body($response); $submission->set_response('数据同步失败,状态码: ' . $response_code . ',详情: ' . $response_body); $submission->set_status('api_failed_' . $response_code); } // 同步成功处理 else { // 可选:设置$abort=true替换默认成功消息,否则保留CF7默认提示 $abort = true; $submission->set_response('感谢您的留言!我们会尽快回复您。'); $submission->set_status('api_success'); }
四、修复数据同步问题(完整修正代码)
以下是修复后的完整代码,解决了所有核心问题:
function sync_cf7_to_crm($form, &$abort, $submission) { if ($abort === true) { return; } // 获取并记录提交数据 $data = $submission->get_posted_data(); error_log('CF7提交数据: ' . print_r($data, true)); // 验证必填字段 if (empty($data['your-email']) || empty($data['your-name'])) { $abort = true; $submission->set_response('请填写姓名和邮箱!'); $submission->set_status('invalid_data'); return; } // 过滤表单数据 $email = sanitize_text_field($data['your-email']); $name = sanitize_text_field($data['your-name']); $phone = isset($data['your-phone']) ? sanitize_text_field($data['your-phone']) : ''; $message = isset($data['your-message']) ? sanitize_textarea_field($data['your-message']) : ''; // API配置 $apiurl = 'https://coolapi.com'; $apiheaders = array( 'Authorization' => 'Token token=NotMyRealToken', 'Content-Type' => 'application/json' // 必须添加,告知API请求格式 ); $apibody = array( 'marketing_form' => array( 'email' => $email, 'first_name' => $name, 'phone_number' => $phone, 'notes' => $message, 'relationship' => 'self', 'community_id' => 19019, 'lead_source_id' => 60725 ) ); $args_for_push = array( 'headers' => $apiheaders, 'body' => json_encode($apibody), 'timeout' => 15, // 设置超时时间,避免请求挂起 'sslverify' => true // 自签证书可设为false,生产环境不建议 ); // 若wp_safe_remote_post被拦截,改用wp_remote_post(或添加域名到安全列表) $response = wp_remote_post($apiurl, $args_for_push); error_log('API请求参数: ' . print_r($args_for_push, true)); error_log('API响应结果: ' . print_r($response, true)); $response_code = wp_remote_retrieve_response_code($response); // 响应处理逻辑 if (is_wp_error($response)) { $abort = true; $error_msg = $response->get_error_message(); $submission->set_response('表单提交失败:' . $error_msg); $submission->set_status('api_failed'); error_log('API请求失败: ' . $error_msg); } elseif ($response_code != 200) { $abort = true; $response_body = wp_remote_retrieve_body($response); $submission->set_response('数据同步失败,状态码: ' . $response_code . ',详情: ' . $response_body); $submission->set_status('api_failed_' . $response_code); error_log('API响应错误,状态码: ' . $response_code . ',响应体: ' . $response_body); } else { $abort = true; $submission->set_response('感谢您的留言!我们已收到您的信息,会尽快与您联系。'); $submission->set_status('api_success'); error_log('CRM同步成功,状态码: ' . $response_code); } } add_action('wpcf7_before_send_mail', 'sync_cf7_to_crm', 10, 3);
额外配置(若使用wp_safe_remote_post)
如果要保留安全请求,将CRM域名添加到WP允许列表:
add_filter('allowed_http_hosts', 'add_crm_host_to_allowed'); function add_crm_host_to_allowed($hosts) { $hosts[] = 'coolapi.com'; return $hosts; }
内容的提问来源于stack exchange,提问作者rudtek
相关产品推荐
相关产品推荐

