WordPress集成Meta Conversion API至GravityForms遇致命错误求助
先开启WordPress调试模式定位具体错误:
在wp-config.php中添加/修改以下配置:
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false );
错误日志会生成在wp-content/debug.log,里面的具体信息是定位问题的核心依据。下面是代码中常见的致命错误点及修复方案:
1. HTML转义字符导致的语法错误
你提供的代码是经过HTML转义的(比如"、<、>),直接复制到functions.php会触发语法错误,这是最常见的致命原因。需要把转义字符还原:
- 把所有
"替换为双引号" - 把
<?php还原为<?php - 把
->还原为->
2. PHP版本兼容性问题
代码中使用了??空合并运算符,这要求PHP版本至少7.0。如果服务器PHP版本低于7.0,会直接报错。可以通过以下方式检查PHP版本:
在functions.php中临时添加:
error_log('PHP Version: ' . phpversion());
查看debug.log,如果版本低于7.0,联系主机商升级PHP。
3. 未检查数组索引导致的Undefined Index错误
preparePayload函数中直接访问$userData['email']、$userData['full_name']等字段,如果表单字段匹配失败或用户未填写,会触发Undefined Index警告,在严格模式下可能升级为致命错误。同时Meta要求用户数据需小写+去空格后再哈希,修复后的代码如下:
function preparePayload($userData) { $event_id = uniqid('evt_', true); $event_source_url = "https://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"; // 初始化用户数据默认值 $email = $userData['email'] ?? ''; $phone = $userData['phone'] ?? ''; $fullName = $userData['full_name'] ?? ''; $address = $userData['address'] ?? ''; // 拆分姓名,处理只有名字没有姓氏的情况 $nameParts = explode(' ', trim($fullName)); $firstName = $nameParts[0] ?? ''; $lastName = $nameParts[1] ?? ''; return [ 'data' => [ [ 'event_name' => 'Lead', 'event_time' => time(), 'event_source_url' => $event_source_url, 'event_id' => $event_id, 'user_data' => [ 'em' => !empty($email) ? hash('sha256', strtolower(trim($email))) : '', 'ph' => !empty($phone) ? hash('sha256', preg_replace('/[^0-9]/', '', $phone)) : '', 'fn' => !empty($firstName) ? hash('sha256', strtolower(trim($firstName))) : '', 'ln' => !empty($lastName) ? hash('sha256', strtolower(trim($lastName))) : '', 'st' => !empty($address) ? hash('sha256', strtolower(trim($address))) : '', ], 'action_source' => 'website', ], ], ]; }
4. Gravity Forms函数未加载的问题
rgar是Gravity Forms的内置函数,如果Gravity Forms未激活或函数未提前加载,会触发“Call to undefined function rgar()”错误。可以替换为原生PHP写法:
// 替换collectFormDataByLabel中的rgar调用 $userData[$key] = isset($entry[(string)$field_id]) ? $entry[(string)$field_id] : '';
5. CURL扩展未启用
sendToFacebookAPI中使用了CURL,如果服务器未启用CURL扩展,会触发“Call to undefined function curl_init()”错误。可以添加检查逻辑:
// 在sendToFacebookAPI函数开头添加 if (!function_exists('curl_init')) { error_log('CURL扩展未启用,无法发送请求到Meta API'); return 'CURL not enabled'; }
联系主机商启用CURL扩展即可。
修复后的完整代码
// Adding the hook to Gravity Forms submission add_action('gform_after_submission', 'handle_form_submission', 10, 2); function handle_form_submission($entry, $form) { // Setup configuration variables $pixel_id = 'example-pixel-id'; $access_token = 'example-access-token'; // Collect data from the form entry using the label-based function $userData = collectFormDataByLabel($entry, $form); // Prepare the data payload $payload = preparePayload($userData); // Send the data to Facebook Conversion API $response = sendToFacebookAPI($pixel_id, $access_token, $payload); // Optionally log the response for debugging error_log('Facebook API Response: ' . $response); } function findFieldByLabel($form, $label) { foreach ($form['fields'] as $field) { if (strcasecmp($field->label, $label) == 0) { return $field->id; } } return false; } function collectFormDataByLabel($entry, $form) { $labels = [ 'Full Name' => 'full_name', 'Property Address' => 'address', 'Phone' => 'phone', 'Email' => 'email' ]; $userData = []; foreach ($labels as $label => $key) { $field_id = findFieldByLabel($form, $label); if ($field_id) { // 替换rgar为原生PHP写法 $userData[$key] = isset($entry[(string)$field_id]) ? $entry[(string)$field_id] : ''; } else { $userData[$key] = ''; } } return $userData; } function preparePayload($userData) { $event_id = uniqid('evt_', true); $event_source_url = "https://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"; // 初始化用户数据默认值 $email = $userData['email'] ?? ''; $phone = $userData['phone'] ?? ''; $fullName = $userData['full_name'] ?? ''; $address = $userData['address'] ?? ''; // 拆分姓名,处理只有名字没有姓氏的情况 $nameParts = explode(' ', trim($fullName)); $firstName = $nameParts[0] ?? ''; $lastName = $nameParts[1] ?? ''; return [ 'data' => [ [ 'event_name' => 'Lead', 'event_time' => time(), 'event_source_url' => $event_source_url, 'event_id' => $event_id, 'user_data' => [ 'em' => !empty($email) ? hash('sha256', strtolower(trim($email))) : '', 'ph' => !empty($phone) ? hash('sha256', preg_replace('/[^0-9]/', '', $phone)) : '', 'fn' => !empty($firstName) ? hash('sha256', strtolower(trim($firstName))) : '', 'ln' => !empty($lastName) ? hash('sha256', strtolower(trim($lastName))) : '', 'st' => !empty($address) ? hash('sha256', strtolower(trim($address))) : '', ], 'action_source' => 'website', ], ], ]; } function sendToFacebookAPI($pixel_id, $access_token, $payload) { // 检查CURL是否启用 if (!function_exists('curl_init')) { error_log('CURL扩展未启用,无法发送请求到Meta API'); return 'CURL not enabled'; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://graph.facebook.com/v19.0/{$pixel_id}/events?access_token={$access_token}"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 添加SSL验证(生产环境建议开启,测试环境可关闭) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); $response = curl_exec($ch); // 捕获CURL错误 if(curl_errno($ch)){ error_log('CURL Error: ' . curl_error($ch)); } curl_close($ch); return $response; }
内容的提问来源于stack exchange,提问作者Ambitious Webber

