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

WordPress集成Meta Conversion API至GravityForms遇致命错误求助

排查与修复Gravity Forms + Meta Conversion API集成的致命错误

先开启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会触发语法错误,这是最常见的致命原因。需要把转义字符还原:

  • 把所有"替换为双引号"
  • 把&lt;?php还原为<?php
  • 把-&gt;还原为->

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:25:57