如何将WordPress中Gravity Form数据传至Laravel或嵌入Laravel表单?
问题1:Gravity Form提交后传递数据到Laravel
核心原因
直接用Gravity Forms的默认重定向会以GET方式跳转,数据要么丢失要么暴露在URL中,且Laravel与WordPress的session相互隔离,无法直接接收POST数据。推荐通过钩子主动发送数据到Laravel接口,再处理重定向。
解决方案:使用Gravity Forms钩子发送POST请求到Laravel
在WordPress的
functions.php中添加钩子
替换FORMID为你的Gravity Form ID,字段ID(如1、2)对应表单实际字段:add_action('gform_after_submission_FORMID', 'send_gform_data_to_laravel', 10, 2); function send_gform_data_to_laravel($entry, $form) { // 整理表单数据 $form_data = [ 'full_name' => rgar($entry, '1'), 'email' => rgar($entry, '2'), 'message' => rgar($entry, '3'), // 按需添加其他字段 ]; // Laravel接收数据的API端点(替换为你的实际路由) $laravel_endpoint = get_site_url() . '/api/gform-submit'; // 发送POST请求,添加密钥验证防止恶意请求 $response = wp_remote_post($laravel_endpoint, [ 'body' => $form_data, 'headers' => [ 'Content-Type' => 'application/x-www-form-urlencoded', 'X-API-KEY' => 'your-custom-secret-key' // 两边保持一致 ], 'timeout' => 10 ]); // 日志记录请求状态(可选) if (is_wp_error($response)) { error_log('GForm to Laravel failed: ' . $response->get_error_message()); } // 重定向到Laravel的感谢页或其他页面 wp_redirect(get_site_url() . '/thank-you'); exit; }Laravel端配置接收接口
- 在
routes/api.php添加路由:use App\Http\Controllers\GformController; Route::post('/gform-submit', [GformController::class, 'handleSubmission']); - 创建
GformController处理数据:namespace App\Http\Controllers; use Illuminate\Http\Request; class GformController extends Controller { public function handleSubmission(Request $request) { // 验证数据(按需调整规则) $validated = $request->validate([ 'full_name' => 'required|string|max:255', 'email' => 'required|email', 'message' => 'required|string' ]); // 处理数据:存入数据库、发送邮件等 // Example: \App\Models\GformSubmission::create($validated); return response()->json(['status' => 'success'], 200); } } - (可选)添加中间件验证API密钥:
创建中间件VerifyApiKey,在路由中引用,确保只有合法请求能提交数据。
- 在
问题2:将Laravel Blade表单嵌入WordPress页面
有两种可行方案,根据你的需求选择:
方案1:HTTP请求拉取表单HTML(无缝嵌入)
通过WordPress短代码调用Laravel生成的表单HTML,适合需要和WordPress页面样式整合的场景。
Laravel端配置表单路由
在routes/web.php添加路由返回Blade视图:Route::get('/embeddable-contact-form', function () { return view('forms.contact'); // 你的Blade表单视图路径 });Blade视图示例(
resources/views/forms/contact.blade.php):<form method="POST" action="{{ route('contact.submit') }}"> @csrf <div> <label>姓名</label> <input type="text" name="name" required> </div> <div> <label>邮箱</label> <input type="email" name="email" required> </div> <button type="submit">提交</button> </form>WordPress端注册短代码
在functions.php中添加:add_shortcode('laravel_contact_form', 'embed_laravel_form'); function embed_laravel_form() { $form_url = get_site_url() . '/embeddable-contact-form'; $response = wp_remote_get($form_url); if (is_wp_error($response)) { return '<p>表单加载失败,请稍后重试。</p>'; } return wp_remote_retrieve_body($response); }之后在WordPress页面编辑器中插入短代码
[laravel_contact_form]即可。注意:CSRF令牌有效性依赖同域名session,由于Laravel和WordPress共享主域名,表单提交时Laravel会自动验证CSRF令牌,无需额外配置。
方案2:iframe嵌入(最简单)
如果不需要深度样式整合,直接用iframe嵌入Laravel表单页面:
<iframe src="/embeddable-contact-form" width="100%" height="600px" frameborder="0" title="联系表单"></iframe>
优点:无需处理CSRF和数据传递问题,表单完全由Laravel控制;缺点:样式独立,需要额外调整iframe内的CSS适配WordPress页面。
内容的提问来源于stack exchange,提问作者swhitlow
相关产品推荐
相关产品推荐

