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エクスポートで管理する手順で解決します。