Snow Monkey Formsはシンプルで使いやすいフォームプラグインですが、送信データの保存機能がありません。「過去にどんなお問い合わせがあったか確認したい」「対応状況を管理したい」という場面で不便に感じたことはないでしょうか。

この記事では、Snow Monkey Formsのフックを使って、フォーム送信時にGoogle Sheetsへ自動で履歴を記録する方法を解説します。私自身このブログのお問い合わせフォームにSnow Monkey Formsを使っているので、同じ環境で実際に動作確認した内容をもとにまとめています。

この記事の環境

今回の実装は以下の環境で動作確認しています。

  • WordPress 6.x
  • Snow Monkey Forms(最新版)
  • PHP 8.0
  • Xserver(SSH接続可能な環境)
  • Composer(サーバーにインストール)

レンタルサーバーにSSH接続してComposerが使える環境が前提です。Xserverの場合はサーバーパネルからSSH接続を有効にできます。

全体の流れ

実装の流れは以下の通りです。

  1. Google Cloud Consoleでサービスアカウントを作成
  2. Google Sheets APIを有効化
  3. 記録用のスプレッドシートを用意
  4. Composerでライブラリをインストール
  5. functions.phpにフック処理を記述

順番に見ていきましょう。

手順1:Google Cloud Consoleでサービスアカウントを作成

Google Sheets APIを利用するには、サービスアカウントが必要です。以下の手順で作成します。

プロジェクトを作成

Google Cloud Consoleにアクセスし、上部の「プロジェクトを選択」から「新しいプロジェクト」をクリックします。プロジェクト名は任意ですが、「contact-form-logger」など用途がわかる名前をつけておくと管理しやすいです。

Google Sheets APIを有効化

左メニューの「APIとサービス」→「ライブラリ」に移動し、「Google Sheets API」を検索して「有効にする」をクリックします。

サービスアカウントキーを発行

「APIとサービス」→「認証情報」→「認証情報を作成」→「サービスアカウント」の順に進みます。サービスアカウント名は任意で設定してください。作成したサービスアカウントの詳細ページに入り、「キー」タブ→「鍵を追加」→「新しい鍵を作成」でJSON形式を選択します。

JSONファイルがダウンロードされるので、大切に保管してください。このファイルにはAPIの認証情報が含まれています。

注意:「OAuth クライアントID」ではなく「サービスアカウント」で作成してください。OAuth クライアントIDで作成したキーでは認証方式が異なるため、この記事のコードでは動作しません。

手順2:スプレッドシートを準備する

Googleドライブでスプレッドシートを新規作成し、1行目にヘッダーを入力します。ヘッダーはフォームの項目に合わせて設定してください。以下は一例です。

A1B1C1D1E1F1
タイムスタンプお問い合わせ項目お名前メールアドレスお問い合わせ内容ステータス

次に、サービスアカウントにスプレッドシートの編集権限を付与します。先ほどダウンロードしたJSONファイルを開くと、client_emailという項目にメールアドレスが記載されています(xxxxx@xxxxx.iam.gserviceaccount.comの形式)。

スプレッドシートの「共有」ボタンから、このメールアドレスを「編集者」として追加してください。これを忘れると書き込み時に権限エラーになります。

また、スプレッドシートのURLからスプレッドシートIDを控えておきます。

https://docs.google.com/spreadsheets/d/【ここがスプレッドシートID】/edit

/d//editの間の文字列がスプレッドシートIDです。後のPHPコードで使用します。

手順3:Composerでライブラリをインストール

Google Sheets APIを使うために、Google APIクライアントライブラリをインストールします。SSHでサーバーに接続し、テーマディレクトリに移動します。

# SSHでサーバーに接続後、テーマディレクトリに移動
cd ~/example.com/public_html/wp-content/themes/your-theme

# Composerがインストールされていない場合は先にインストール
curl -sS https://getcomposer.org/installer | php

# Google APIクライアントライブラリをインストール
php composer.phar require google/apiclient:"^2.15"

インストールが完了すると、テーマディレクトリにvendorフォルダとcomposer.jsonが作成されます。

インストール時にエラーが出る場合

依存パッケージのセキュリティ警告でインストールがブロックされることがあります。その場合は以下のコマンドで警告によるブロックを無効化してから、再度インストールしてください。

php composer.phar config audit.block-insecure false
php composer.phar require google/apiclient:"^2.15" --update-with-dependencies

また、サーバーのPHPバージョンによっては最新版がインストールできないことがあります。PHP 8.0環境の場合はgoogle/apiclient:"^2.15,<2.18.4"のようにバージョンを指定してください。

次に、JSONキーファイルをテーマディレクトリ内にアップロードします。Webからアクセスできないよう、.htaccessで保護しておきましょう。

# テーマディレクトリ内にキーファイル用のディレクトリを作成
mkdir google-credentials

# .htaccessでWebからのアクセスを禁止
echo "Deny from all" > google-credentials/.htaccess

# パーミッションを設定
chmod 600 google-credentials/your-key-file.json

JSONキーファイルをgoogle-credentials/ディレクトリ内にFTPなどでアップロードします。

手順4:functions.phpにフック処理を記述

いよいよ本題です。Snow Monkey Formsのsnow_monkey_forms/administrator_mailer/after_sendフックを使って、メール送信後にGoogle Sheetsへデータを書き込みます。

テーマのfunctions.php(またはfunctions.phpからインクルードしている別ファイル)に以下のコードを追加してください。

重要:vendorフォルダとJSONキーファイルの配置が完了してからコードを追加してください。先にコードだけ追加すると、require_onceの時点でファイルが見つからずサイト全体がエラーになります。

/**
 * Snow Monkey Forms 送信データをGoogle Sheetsに記録
 */

// Composerのオートローダーを読み込み
require_once get_theme_file_path('/vendor/autoload.php');

/**
 * Google Sheets APIクライアントを取得
 */
function get_google_sheets_service() {
    $client = new Google_Client();
    $client->setApplicationName('Contact Form Logger');
    $client->setScopes([Google_Service_Sheets::SPREADSHEETS]);
    // ★ JSONキーファイルのパスを設定
    $client->setAuthConfig(get_theme_file_path('/google-credentials/your-key-file.json'));
    $client->setAccessType('offline');

    return new Google_Service_Sheets($client);
}

/**
 * スプレッドシートにデータを追加
 */
function add_contact_to_spreadsheet($data) {
    $service = get_google_sheets_service();

    // ★ スプレッドシートIDを設定
    $spreadsheet_id = 'your-spreadsheet-id';
    $range = 'シート1!A:F';

    $timestamp = (new DateTime('now', new DateTimeZone('Asia/Tokyo')))->format('Y-m-d H:i:s');

    // ★ スプレッドシートのヘッダーに合わせて配列を構成
    $values = [[
        $timestamp,
        $data['item'],
        $data['fullname'],
        $data['email'],
        $data['message'],
        '未対応',
    ]];

    $body = new Google_Service_Sheets_ValueRange([
        'values' => $values,
    ]);

    $params = [
        'valueInputOption' => 'RAW',
    ];

    try {
        $service->spreadsheets_values->append(
            $spreadsheet_id,
            $range,
            $body,
            $params
        );
    } catch (Exception $e) {
        error_log('[Google Sheets API] ' . $e->getMessage());
    }
}

/**
 * Snow Monkey Formsのメール送信後にGoogle Sheetsへ記録
 */
add_action(
    'snow_monkey_forms/administrator_mailer/after_send',
    function ($is_sended, $responser, $setting, $mail_parser) {
        // メール送信が成功した場合のみ記録
        if (!$is_sended) {
            return;
        }

        // ★ フォームの各フィールドからname属性の値で取得
        $data = [
            'item'     => $responser->get('item'),
            'fullname' => $responser->get('fullname'),
            'email'    => $responser->get('email'),
            'message'  => $responser->get('message'),
        ];

        add_contact_to_spreadsheet($data);
    },
    10,
    4
);

コードのポイント

フックの引数について

snow_monkey_forms/administrator_mailer/after_sendは管理者宛メール送信後に発火するアクションフックです。4つの引数を受け取ります。

  • $is_sended:メール送信が成功したかどうか(boolean)
  • $responser:フォームの送信データを持つオブジェクト
  • $setting:フォームの設定情報
  • $mail_parser:メールのパーサー

フォームデータの取得方法

$responser->get('name属性の値')で各フィールドの送信データを取得できます。Snow Monkey Formsのブロックエディターで各入力欄に設定したname属性の値を指定してください。

自分のフォームのname属性がわからない場合は、Snow Monkey Formsの編集画面で各フィールドブロックをクリックすると、サイドバーに「NAME」の項目が表示されるので確認できます。

手順5:動作確認

実装が完了したら、フォームからテスト送信してみましょう。確認するポイントは以下の通りです。

  1. フォームからテストデータを送信
  2. 管理者宛メールが正常に届くことを確認
  3. Googleスプレッドシートに行が追加されているか確認
  4. 各列のデータが正しく記録されているか確認

スプレッドシートにデータが記録されていれば成功です。

トラブルシューティング

私が実際に実装した際に遭遇したエラーと対処法をまとめます。

サイトが真っ白になる / フォーム送信が失敗する

vendorフォルダやJSONキーファイルが存在しない状態でコードを追加すると、require_onceの時点でPHP Fatal Errorが発生し、サイト全体が動かなくなります。

対処法:必ずComposerのインストールとJSONキーファイルの配置を先に済ませてから、functions.phpにコードを追加してください。もしサイトが表示されなくなった場合は、FTPで追加したコードを削除すれば復旧します。

Invalid client secret JSON file

google/apiclientのバージョンが古い(v1系)と、setAuthConfig()の仕様が異なりこのエラーが出ます。

対処法:composer.jsonを確認し、バージョンが^1.xになっている場合は^2.15以上にアップデートしてください。

php composer.phar require google/apiclient:"^2.15" --update-with-dependencies

Composerインストール時にセキュリティ警告でブロックされる

依存パッケージ(firebase/php-jwt)にセキュリティアドバイザリがあり、インストールがブロックされることがあります。

対処法:以下のコマンドでブロックを無効化してからインストールします。

php composer.phar config audit.block-insecure false
php composer.phar require google/apiclient:"^2.15" --update-with-dependencies

PHPバージョンの互換性エラー

google/apiclientのv2.18.4以降はPHP 8.1以上が必要です。サーバーのPHPが8.0の場合は、バージョンを指定してインストールしてください。

# PHP 8.0環境の場合
php composer.phar require google/apiclient:"^2.15,<2.18.4" --update-with-dependencies

The caller does not have permission

スプレッドシートにサービスアカウントのメールアドレスが共有されていない場合に発生します。JSONキーファイル内のclient_emailのメールアドレスを、スプレッドシートの共有設定で「編集者」として追加してください。

name属性の不一致

スプレッドシートにデータは追加されるが、一部のセルが空になる場合は、$responser->get()に渡しているname属性の値がフォームの設定と一致していない可能性があります。Snow Monkey Formsの編集画面で各フィールドの「NAME」を確認してください。

SSHでの動作確認方法

原因の切り分けに困ったら、SSH接続してテーマディレクトリ上で直接PHPを実行すると、エラーメッセージが確認できます。

# テーマディレクトリに移動した状態で実行
php -r "
require_once 'vendor/autoload.php';
\$client = new Google_Client();
\$client->setAuthConfig('google-credentials/your-key-file.json');
echo 'Auth OK';
"

Auth OKと表示されれば、Composerのインストールと認証ファイルは正常です。エラーが出たらメッセージの内容から原因を特定できます。

応用:フォームの項目を増やしたい場合

電話番号やお問い合わせ種別など、記録したいフィールドを増やす場合は、フック内の$responser->get()で対象のフィールドを追加し、$values配列に含めるだけです。スプレッドシート側のヘッダー行と$rangeも合わせて更新してください。

他のフォームプラグインでも使える?

この記事ではSnow Monkey Formsを例に解説しましたが、Google Sheets APIとの連携部分はどのフォームプラグインでも同じです。違うのはフック(メール送信後の処理を追加する方法)だけです。

主要なプラグインのフックは以下の通りです。

  • Contact Form 7wpcf7_mail_sent
  • MW WP Formmwform_after_send_{form_key}

フック内でフォームデータを取得する方法はプラグインごとに異なりますが、Google Sheetsへの書き込み処理(add_contact_to_spreadsheet()の部分)はそのまま流用できます。

セキュリティ上の注意点

本番環境で運用する際は、以下の点に注意してください。

JSONキーファイルの保護

サービスアカウントのキーファイルには認証情報が含まれています。前述の.htaccessによる保護に加えて、ファイルパーミッションも600(所有者のみ読み取り可)に設定しておくとより安全です。

vendorディレクトリの扱い

Gitで管理している場合、vendorディレクトリは.gitignoreに追加しましょう。デプロイ時にサーバー上でcomposer installを実行する運用がおすすめです。

APIの使用量

Google Sheets APIの利用は無料です。レート制限として1分あたり60リクエストの上限がありますが、一般的なお問い合わせフォームであればまず上限に達することはありません。

まとめ

Snow Monkey Formsのafter_sendフックを使うことで、既存のフォームに手を加えることなく、Google Sheetsへの自動記録を実現できました。

ポイントをまとめると以下の通りです。

  • Snow Monkey Formsのsnow_monkey_forms/administrator_mailer/after_sendフックでメール送信後に処理を追加
  • $responser->get('name属性')でフォームデータを取得
  • Google Sheets APIのサービスアカウントを使って認証
  • JSONキーファイルはWebアクセス不可の場所に配置して保護
  • vendorフォルダとJSONキーファイルの配置が先、コード追加は最後

管理画面を別途作る必要がなく、Googleスプレッドシートのフィルタやソート、共有機能をそのまま活用できるのが大きなメリットです。クライアント案件でも「お問い合わせ一覧をスプレッドシートで確認したい」という要望は多いので、覚えておくと役立つ場面があるはずです。