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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:17:57