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

在WordPress中使用cURL跨域传输并存储用户数据的问题

Hey,针对你这个WordPress跨站用户数据传递的问题,我来分享一套可行的实现方案,同时帮你排查可能遇到的坑:

核心需求回顾

当domain1的用户点击跳转至domain2的链接时,需将server1/domain1的用户数据(用户名、邮箱等)发送至server2/domain2,并临时存储在server2的数据库中,两个站点均为WordPress网站。

可行实现方案(基于cURL + WordPress原生能力)

我会分domain1数据发送端和domain2数据接收存储端两部分给出代码,完全贴合WordPress的开发规范:

1. Domain1(数据发送端):跳转前触发cURL请求

我们可以通过自定义短代码生成跳转链接,在用户点击跳转前,先通过cURL把登录用户的信息发送到domain2的接口:

// 加到domain1的functions.php中
add_shortcode('domain2_redirect', 'domain1_send_user_data_before_redirect');

function domain1_send_user_data_before_redirect($atts) {
    // 仅对登录用户处理数据同步
    if (!is_user_logged_in()) {
        return '<a href="http://my-domain2.com">跳转至Domain2</a>';
    }

    $current_user = wp_get_current_user();
    // 整理需要传递的用户字段(按需调整)
    $user_payload = array(
        'username' => $current_user->user_login,
        'email' => $current_user->user_email,
        'user_id' => $current_user->ID,
        'verify_nonce' => wp_create_nonce('domain1_user_sync_nonce') // 加验证防止伪造请求
    );

    // 初始化cURL请求
    $target_url = 'http://my-domain2.com/wp-json/custom/v1/save-temp-user';
    $ch = curl_init($target_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $user_payload);
    
    // 若domain2是HTTPS站点,测试阶段可临时关闭SSL验证(正式环境建议开启)
    // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    $response = curl_exec($ch);
    $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    // 根据请求状态返回不同的跳转提示
    if ($http_status === 200) {
        return '<a href="http://my-domain2.com">跳转至Domain2</a>';
    } else {
        return '<a href="http://my-domain2.com">跳转至Domain2</a><br><small>(数据同步可能存在问题,若有疑问请联系管理员)</small>';
    }
}

使用时,在domain1的文章/页面中插入短代码[domain2_redirect]即可生成带数据同步的跳转链接。

2. Domain2(数据接收存储端):用REST API接收并临时存储

我们用WordPress的REST API来接收数据,比直接写独立PHP文件更安全:

// 加到domain2的functions.php中
add_action('rest_api_init', function () {
    // 注册自定义REST接口
    register_rest_route('custom/v1', '/save-temp-user', array(
        'methods' => 'POST',
        'callback' => 'domain2_store_temp_user_data',
        'permission_callback' => '__return_true', // 正式环境可添加更严格的IP/域名验证
    ));
});

function domain2_store_temp_user_data($request) {
    $received_data = $request->get_params();
    
    // 验证来自domain1的nonce,防止恶意请求
    if (!wp_verify_nonce($received_data['verify_nonce'], 'domain1_user_sync_nonce')) {
        return new WP_Error('invalid_verify', '无效的验证信息', array('status' => 403));
    }

    // 临时存储数据:用WordPress选项表,添加时间戳区分临时数据
    $temp_key = 'temp_domain1_user_' . $received_data['user_id'] . '_' . time();
    update_option($temp_key, $received_data, false); // false表示不自动加载,适合临时数据

    // 设置1小时后自动删除临时数据(按需调整过期时间)
    wp_schedule_single_event(time() + 3600, 'cleanup_temp_domain1_user', array($temp_key));

    return array('status' => 'success', 'msg' => '用户数据已临时存储');
}

// 注册清理临时数据的钩子
add_action('cleanup_temp_domain1_user', 'cleanup_temp_domain1_user_callback');
function cleanup_temp_domain1_user_callback($temp_key) {
    delete_option($temp_key);
}
针对「cURL调用看似成功但存在问题」的排查方向

如果你的cURL请求看起来成功但实际没效果,可以从这几个点排查:

  • 检查请求真实状态:在domain1的代码中打印$http_status和$response,确认是否真的拿到了200的成功响应,响应内容是否符合预期
  • 排查domain2的拦截机制:如果domain2装了安全插件(比如Wordfence),可能会拦截来自domain1的请求,需要把domain1的IP加入白名单
  • 验证数据存储权限:检查domain2的数据库权限,确认WordPress有写入wp_options表的权限,同时查看domain2的PHP错误日志,是否有数据库操作报错
  • nonce验证是否通过:如果nonce生成和验证的规则不匹配,会直接返回403错误,导致数据无法存储

内容的提问来源于stack exchange,提问作者murcoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:24:10