如何用Google Sheets或API/Zapier动态填充Contact Form 7下拉字段?
从Google Sheets填充Contact Form 7下拉字段方案
核心思路
利用WordPress自定义代码结合Google Sheets API拉取数据,通过Contact Form 7的钩子替换下拉字段选项;再配合Zapier完成API数据到Sheets的同步,实现多站CF7下拉的统一更新。
步骤1:配置Google Sheets API访问权限
- 登录Google Cloud Console,创建新项目并启用Google Sheets API。
- 创建服务账号,生成JSON格式的密钥文件并保存。
- 打开目标Google Sheets,共享给服务账号的邮箱地址,赋予「查看者」权限。
步骤2:WordPress自定义代码实现数据拉取与下拉填充
将以下代码添加到主题的functions.php文件,或封装为独立自定义插件(推荐后者,便于多站复用):
1. 配置常量(替换为你的实际信息)
// wp-config.php 或主题functions.php顶部添加 define('GOOGLE_SERVICE_ACCOUNT_JSON', '{ "type": "service_account", "project_id": "你的项目ID", "private_key_id": "你的私钥ID", "private_key": "-----BEGIN PRIVATE KEY-----\n你的私钥内容\n-----END PRIVATE KEY-----\n", "client_email": "你的服务账号邮箱", "client_id": "你的客户端ID", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "你的证书URL" }'); define('GOOGLE_SHEETS_SPREADSHEET_ID', '你的表格ID(URL中/d/后的字符串)'); define('GOOGLE_SHEETS_RANGE', 'Sheet1!A2:A'); // 数据所在列,跳过表头
2. 编写数据拉取函数
function get_google_sheets_dropdown_data() { // 优先读取缓存,减少API调用 $cached_data = get_transient('cf7_sheets_dropdown_cache'); if ($cached_data) { return $cached_data; } $service_account = json_decode(GOOGLE_SERVICE_ACCOUNT_JSON, true); $jwt = generate_google_jwt($service_account); $access_token = get_google_access_token($jwt); if (empty($access_token)) { return []; } $api_url = sprintf( 'https://sheets.googleapis.com/v4/spreadsheets/%s/values/%s', GOOGLE_SHEETS_SPREADSHEET_ID, urlencode(GOOGLE_SHEETS_RANGE) ); $response = wp_remote_get($api_url, [ 'headers' => [ 'Authorization' => 'Bearer ' . $access_token, 'Content-Type' => 'application/json' ] ]); if (is_wp_error($response)) { return []; } $body = wp_remote_retrieve_body($response); $data = json_decode($body, true); $items = isset($data['values']) ? array_column($data['values'], 0) : []; $items = array_filter($items); // 过滤空值 // 缓存数据1小时,可根据需求调整 set_transient('cf7_sheets_dropdown_cache', $items, 3600); return $items; } // 生成JWT令牌 function generate_google_jwt($service_account) { $header = json_encode(['alg' => 'RS256', 'typ' => 'JWT']); $payload = json_encode([ 'iss' => $service_account['client_email'], 'scope' => 'https://www.googleapis.com/auth/spreadsheets.readonly', 'aud' => 'https://oauth2.googleapis.com/token', 'exp' => time() + 3600, 'iat' => time() ]); $base64_header = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header)); $base64_payload = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload)); $signature = ''; openssl_sign( $base64_header . '.' . $base64_payload, $signature, $service_account['private_key'], 'SHA256' ); $base64_signature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($signature)); return $base64_header . '.' . $base64_payload . '.' . $base64_signature; } // 获取访问令牌 function get_google_access_token($jwt) { $response = wp_remote_post('https://oauth2.googleapis.com/token', [ 'body' => [ 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', 'assertion' => $jwt ] ]); if (is_wp_error($response)) { return ''; } $body = wp_remote_retrieve_body($response); $data = json_decode($body, true); return isset($data['access_token']) ? $data['access_token'] : ''; }
3. 替换CF7下拉字段选项
function populate_cf7_dropdown_options($tag) { // 替换为你的CF7下拉字段名称(表单中设置的name属性) $target_field = 'product_list'; if ($tag['name'] !== $target_field) { return $tag; } $dropdown_items = get_google_sheets_dropdown_data(); $new_options = []; foreach ($dropdown_items as $item) { $new_options[] = ['text' => $item, 'value' => $item]; } // 保留表单中设置的默认提示项(如"请选择") $default_options = array_filter($tag['options'], function($opt) { return strpos($opt['text'], '请选择') !== false; // 根据实际默认文本调整 }); $tag['options'] = array_merge($default_options, $new_options); return $tag; } add_filter('wpcf7_form_tag', 'populate_cf7_dropdown_options');
步骤3:Zapier实现API数据到Google Sheets的同步
- 创建新Zap,触发条件选择你的数据源API(支持REST Hook或定时轮询)。
- 添加动作步骤,选择Google Sheets,动作类型为「Create Spreadsheet Row」。
- 映射API返回的数据到Sheets的目标列(对应步骤2中
GOOGLE_SHEETS_RANGE配置的列)。 - 设置Zap为自动运行,确保API数据实时/定时同步到Sheets,进而更新所有关联网站的CF7下拉选项。
多站部署注意事项
- 将上述自定义代码封装为独立插件,导出后安装到所有需要同步的网站。
- 确保每个网站的
wp-config.php中配置正确的Sheets ID和服务账号信息(可复用同一个服务账号)。 - 若需要不同网站拉取Sheets中不同范围的数据,修改
GOOGLE_SHEETS_RANGE常量即可。
内容的提问来源于stack exchange,提问作者Ashot Davtyan
相关产品推荐
相关产品推荐

