无需插件实现Typeform表单数据通过Webhook同步至WordPress
Typeform Webhook 同步数据到WordPress(无插件实现)
1. 配置Typeform Webhook
登录Typeform后台,找到目标表单的「Webhooks」设置,添加新Webhook,将URL设为你的WordPress自定义API端点,示例:https://你的域名/wp-json/typeform/v1/submit
2. 在WordPress中创建自定义REST端点
将以下代码添加到主题的functions.php文件,或创建一个极简自定义插件:
// 注册Typeform提交的REST路由 add_action('rest_api_init', function () { register_rest_route('typeform/v1', '/submit', array( 'methods' => 'POST', 'callback' => 'handle_typeform_submission', 'permission_callback' => '__return_true', // 生产环境建议替换为IP白名单/签名验证等严格权限逻辑 )); }); // 处理Typeform提交的核心回调 function handle_typeform_submission(WP_REST_Request $request) { // 验证Typeform签名(防止恶意请求,建议开启) $typeform_secret = '你的Typeform Webhook密钥'; // 在Typeform Webhook设置页获取 $signature = $request->get_header('Typeform-Signature'); $raw_payload = $request->get_body(); if (!verify_typeform_signature($signature, $raw_payload, $typeform_secret)) { return new WP_REST_Response('无效请求', 403); } // 解析提交数据 $submission = json_decode($raw_payload, true); if (empty($submission)) { return new WP_REST_Response('数据解析失败', 400); } // 提取表单字段值(根据你的表单字段类型调整) $form_data = []; foreach ($submission['form_response']['answers'] as $answer) { switch ($answer['type']) { case 'text': $form_data[$answer['field']['ref']] = $answer['text']; break; case 'choice': $form_data[$answer['field']['ref']] = $answer['choice']['label']; break; case 'email': $form_data[$answer['field']['ref']] = $answer['email']; break; case 'number': $form_data[$answer['field']['ref']] = $answer['number']; break; // 按需添加更多字段类型的处理逻辑 } } // 将数据存储为WordPress自定义文章(示例) $post_args = array( 'post_title' => 'Typeform提交: ' . ($form_data['username'] ?? '匿名用户'), 'post_content' => json_encode($form_data, JSON_PRETTY_PRINT), 'post_status' => 'publish', 'post_type' => 'typeform_submission', // 需提前注册该自定义文章类型 ); $post_id = wp_insert_post($post_args); if (is_wp_error($post_id)) { return new WP_REST_Response('存储失败: ' . $post_id->get_error_message(), 500); } // 可选:将字段单独存储为文章元数据 foreach ($form_data as $key => $value) { update_post_meta($post_id, 'tf_' . $key, $value); } return new WP_REST_Response('提交同步成功', 200); } // Typeform签名验证工具函数 function verify_typeform_signature($signature, $payload, $secret) { if (empty($signature)) return false; list($timestamp_str, $hash_str) = explode(',', $signature); $timestamp = str_replace('t=', '', $timestamp_str); $received_hash = str_replace('v1=', '', $hash_str); // 防止重放攻击:验证时间戳在5分钟内 if (time() - $timestamp > 300) { return false; } $expected_hash = hash_hmac('sha256', $timestamp . '.' . $payload, $secret); return hash_equals($expected_hash, $received_hash); }
3. 补充配置
如果没有typeform_submission自定义文章类型,添加以下代码到functions.php注册:
add_action('init', function() { register_post_type('typeform_submission', array( 'labels' => array('name' => 'Typeform提交记录'), 'public' => true, 'show_in_rest' => true, 'supports' => array('title', 'content'), 'menu_icon' => 'dashicons-forms', )); });
内容的提问来源于stack exchange,提问作者Kannanmon s
相关产品推荐
相关产品推荐

