在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
相关产品推荐
相关产品推荐

