2026年7月13日

2026年7月13日

Gravity Formsのエラーを解決する方法

はじめに

Gravity Formsでフォームを送信すると「申し訳ありませんが、フォームの処理中にエラーが発生しました」と表示される・通知メールが管理者に届かない・ドロップダウンの選択に応じてフィールドが表示される条件付きロジックが動かない・ファイルアップロードフィールドで許可拡張子以外が拒否されるといった問題は、PHPエラー・メールサーバー設定・JavaScriptコンフリクトが原因です。

症状・原因

  • 送信ボタンを押してもページが変わらず「処理中」の表示が続く
  • 管理画面の「フォーム → エントリー」には記録されているがメールが届かない
  • セレクトボックスの選択を変えても関連フィールドが表示/非表示にならない
  • PDFやWordファイルをアップロードすると「ファイルタイプが許可されていません」になる

解決手順

ステップ1:Gravity Formsの状態を確認する

# Gravity Formsの設定とエントリーを確認
wp eval "
// バージョン確認
if (class_exists('GFCommon')) {
    echo 'Gravity Forms version: ' . GFCommon::$version . PHP_EOL;
}

// 登録済みフォームを確認
\$forms = GFAPI::get_forms();
echo 'Total forms: ' . count(\$forms) . PHP_EOL;

foreach (\$forms as \$form) {
    \$count = GFAPI::count_entries(\$form['id']);
    printf('  Form #%d | %s | Entries: %d | Active: %s' . PHP_EOL,
        \$form['id'], \$form['title'], \$count, \$form['is_active'] ? 'yes' : 'no');
}

// Gravity Formsのログを確認
\$log_setting = get_option('gform_enable_logging', false);
echo 'Logging enabled: ' . (\$log_setting ? 'yes' : 'no') . PHP_EOL;

// メール設定確認
\$settings = get_option('gravityformsaddon_gravityformsemailmarketing_settings', []);
echo 'SMTP configured: ' . (get_option('gform_smtp_settings') ? 'yes' : 'no') . PHP_EOL;
"

ステップ2:フォーム送信処理をカスタマイズする

// functions.php: Gravity Forms送信処理

// ① 送信後にカスタム処理
add_action('gform_after_submission', function(array $entry, array $form): void {
    $form_id = $form['id'];

    // フォームID 3 のみ処理
    if ($form_id !== 3) return;

    // フィールド値を取得(フィールドIDを指定)
    $name    = rgar($entry, '1');   // フィールドID 1
    $email   = rgar($entry, '2');   // フィールドID 2
    $message = rgar($entry, '3');   // フィールドID 3

    error_log(sprintf('[GF] Form %d submitted: %s <%s>', $form_id, $name, $email));

    // 外部APIへ送信
    wp_remote_post('https://api.example.com/leads', [
        'body'    => compact('name', 'email', 'message'),
        'timeout' => 10,
    ]);
}, 10, 2);

// ② 送信前バリデーション
add_filter('gform_validation', function(array $validation_result): array {
    $form  = $validation_result['form'];
    $entry = GFFormsModel::get_current_lead();

    // フォームID 3 のみバリデーション
    if ($form['id'] !== 3) return $validation_result;

    // 郵便番号フィールド(ID 5)の形式チェック
    $zip = rgpost('input_5');
    if ($zip && !preg_match('/^\d{3}-?\d{4}$/', $zip)) {
        $validation_result['is_valid'] = false;
        foreach ($form['fields'] as &$field) {
            if ($field->id === 5) {
                $field->failed_validation  = true;
                $field->validation_message = '郵便番号は「123-4567」形式で入力してください';
            }
        }
        $validation_result['form'] = $form;
    }

    return $validation_result;
});

// ③ エントリーIDをページに表示
add_filter('gform_confirmation', function(mixed $confirmation, array $form, array $entry): mixed {
    if ($form['id'] !== 3) return $confirmation;
    if (!is_array($confirmation)) return $confirmation;

    $confirmation['message'] = str_replace(
        '{entry_id}',
        $entry['id'],
        $confirmation['message']
    );
    return $confirmation;
}, 10, 3);

ステップ3:メール通知を修正する

// functions.php: Gravity Formsメール設定

// ① 通知メールの差出人を固定
add_filter('gform_notification', function(array $notification, array $form, array $entry): array {
    // 差出人をサイトドメインに固定(スパム判定対策)
    $notification['from']      = 'noreply@' . parse_url(home_url(), PHP_URL_HOST);
    $notification['fromName']  = get_bloginfo('name');

    // HTMLメールとして送信
    $notification['message'] = nl2br($notification['message']);
    return $notification;
}, 10, 3);

// ② 条件に基づいて通知先を変更
add_filter('gform_notification', function(array $notification, array $form, array $entry): array {
    // フォームID 5 の「問い合わせ種別」フィールド(ID 3)で分岐
    if ($form['id'] !== 5) return $notification;

    $inquiry_type = rgar($entry, '3');
    $routing      = [
        '技術サポート' => 'support@example.com',
        '営業'         => 'sales@example.com',
        '一般'         => 'info@example.com',
    ];

    if (isset($routing[$inquiry_type])) {
        $notification['to'] = $routing[$inquiry_type];
    }
    return $notification;
}, 10, 3);

// ③ 通知メールの送信失敗をログ
add_action('gform_after_email', function(array $email_service, bool $is_success, array $notification, array $entry): void {
    if (!$is_success) {
        error_log(sprintf('[GF] Notification failed for entry %d: %s',
            $entry['id'], $notification['name']));
    }
}, 10, 4);

ステップ4:ファイルアップロードと許可拡張子

// functions.php: Gravity Formsアップロード設定

// ① 許可するファイル拡張子を追加
add_filter('gform_upload_whitelist', function(array $whitelist): array {
    $whitelist[] = 'pdf';
    $whitelist[] = 'doc';
    $whitelist[] = 'docx';
    $whitelist[] = 'xlsx';
    $whitelist[] = 'pptx';
    return $whitelist;
});

// ② アップロードファイルサイズ制限を変更
add_filter('gform_max_file_size', function(int $size, string $form_id, string $field_id): int {
    return 20 * 1024 * 1024; // 20MB
}, 10, 3);

// ③ アップロードディレクトリをカスタマイズ
add_filter('gform_upload_path', function(array $path_info, int $form_id): array {
    // フォームIDごとにサブディレクトリを分ける
    $path_info['path'] = WP_CONTENT_DIR . '/uploads/gf-uploads/form-' . $form_id . '/';
    $path_info['url']  = WP_CONTENT_URL . '/uploads/gf-uploads/form-' . $form_id . '/';
    wp_mkdir_p($path_info['path']);
    return $path_info;
}, 10, 2);

ステップ5:エントリーの一括操作とエクスポート

# Gravity Formsのエントリーを確認
wp eval "
// フォーム一覧とエントリー数
\$forms = GFAPI::get_forms();
foreach (\$forms as \$form) {
    \$entries = GFAPI::get_entries(\$form['id'], [], null, ['offset' => 0, 'page_size' => 3]);
    printf('Form #%d (%s):' . PHP_EOL, \$form['id'], \$form['title']);
    foreach (\$entries as \$entry) {
        printf('  Entry #%d | %s | %s' . PHP_EOL,
            \$entry['id'], \$entry['date_created'], \$entry['ip']);
    }
}
"
// functions.php: エントリーのカスタム処理

// ① エントリーをプログラムで取得・フィルタリング
function get_form_entries_by_email(int $form_id, string $email): array {
    $search = [
        'field_filters' => [
            ['key' => '2', 'value' => $email], // フィールドID 2 = メール
        ],
    ];
    return GFAPI::get_entries($form_id, $search);
}

// ② エントリーをCSVにエクスポート
add_action('wp_ajax_export_gf_entries', function(): void {
    if (!current_user_can('gravityforms_view_entries')) {
        wp_die('Unauthorized');
    }

    $form_id = absint($_GET['form_id'] ?? 0);
    if (!$form_id) wp_die('Invalid form ID');

    $entries = GFAPI::get_entries($form_id, [], null, ['page_size' => 500]);

    header('Content-Type: text/csv; charset=UTF-8');
    header('Content-Disposition: attachment; filename="gf-entries-' . $form_id . '.csv"');
    echo "\xEF\xBB\xBF";

    $out = fopen('php://output', 'w');
    fputcsv($out, ['Entry ID', '送信日', 'IP', '名前', 'メール']);
    foreach ($entries as $entry) {
        fputcsv($out, [
            $entry['id'],
            $entry['date_created'],
            $entry['ip'],
            rgar($entry, '1'),
            rgar($entry, '2'),
        ]);
    }
    fclose($out);
    exit;
});

注意事項

  • Gravity Formsのメール通知が届かない場合、まず「フォーム → 設定 → メール」で「Gravity Forms SMTPアドオン」を設定するか、WP Mail SMTPプラグインでSMTP送信に変更してください。PHPのmail()関数経由のメールはスパムフォルダに入りやすいです
  • 条件付きロジックが動作しない場合、テーマまたはプラグインのJavaScriptエラーが原因のことが多くあります。ブラウザの開発者ツール(F12 → コンソール)でエラーを確認し、「Gravity Forms → 設定 → 一般」の「ログを有効にする」をオンにして詳細ログを確認してください
  • GFAPI::get_entries()で大量のエントリーを取得する際はpage_sizeを適切に設定してください。全件取得(-1)はメモリ不足の原因になります

まとめ

Gravity Forms修復は①GFAPI::get_forms()GFAPI::count_entries()でフォームとエントリーの状態確認、②gform_after_submissionフックで外部API連携・gform_validationフィルターでサーバー側バリデーション・gform_confirmationフィルターでエントリーIDを確認メッセージに挿入、③gform_notificationフィルターで差出人固定・問い合わせ種別による通知先ルーティング・gform_after_emailフックで送信失敗ログ、④gform_upload_whitelistフィルターでPDF/Word許可・gform_upload_pathでフォーム別ディレクトリ分離、⑤GFAPI::get_entries()でエントリー取得・CSVエクスポートで管理する手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ