2026年10月27日
2026年10月27日
WPFormsのエラーを解決する方法
はじめに
WPFormsでフォームを送信しても確認メッセージが表示されない・通知メールが管理者に届かない・条件付きロジックで特定フィールドが表示/非表示にならない・ファイルアップロードフィールドで「ファイルタイプが許可されていません」エラーが出る問題は、メールのSPF/DKIM設定・JavaScriptコンフリクト・アップロードサイズ制限が原因です。
症状・原因
- フォームを送信すると「フォームを処理中にエラーが発生しました」と表示される
- 送信は成功しているのに管理者へのメール通知が届かない
- 条件付きロジックを設定したが選択肢を変えてもフィールドが切り替わらない
- ファイルアップロードでPDFやWordを添付すると拒否される
解決手順
ステップ1:WPFormsの状態を確認する
# WPFormsの設定と送信状況を確認
wp eval "
// WPFormsバージョン確認
if (defined('WPFORMS_VERSION')) {
echo 'WPForms version: ' . WPFORMS_VERSION . PHP_EOL;
echo 'WPForms Pro: ' . (defined('WPFORMS_PRO') ? 'yes' : 'no') . PHP_EOL;
}
// 登録済みフォームを確認
\$forms = wpforms()->form->get('', ['fields' => 'ids']);
echo 'Total forms: ' . count(\$forms) . PHP_EOL;
// 最近の送信ログを確認(WPForms Pro)
if (class_exists('WPForms_Entries_Table')) {
global \$wpdb;
\$count = \$wpdb->get_var(\"SELECT COUNT(*) FROM {\$wpdb->prefix}wpforms_entries\");
echo 'Total entries: ' . \$count . PHP_EOL;
\$recent = \$wpdb->get_results(\"
SELECT entry_id, form_id, date_created, status
FROM {\$wpdb->prefix}wpforms_entries
ORDER BY date_created DESC LIMIT 5
\");
foreach (\$recent as \$entry) {
printf(' #%d | Form:%d | %s | %s' . PHP_EOL,
\$entry->entry_id, \$entry->form_id, \$entry->date_created, \$entry->status);
}
}
// メール設定確認
\$settings = get_option('wpforms_settings', []);
echo 'Email from: ' . (\$settings['email-from-address'] ?? 'default') . PHP_EOL;
"
ステップ2:フォーム送信処理をカスタマイズする
// functions.php: WPFormsの送信処理カスタマイズ
// ① 送信前バリデーション(カスタムエラー追加)
add_action('wpforms_process', function(array $fields, array $entry, array $form_data): void {
// 郵便番号フィールドのカスタムバリデーション
$zip_field_id = 5; // フィールドIDを確認して設定
if (isset($fields[$zip_field_id])) {
$zip = $fields[$zip_field_id]['value'];
if (!preg_match('/^\d{3}-?\d{4}$/', $zip)) {
wpforms()->process->errors[$form_data['id']][$zip_field_id]
= '郵便番号は「123-4567」形式で入力してください';
}
}
}, 10, 3);
// ② 送信完了後の処理
add_action('wpforms_process_complete', function(array $fields, array $entry, array $form_data, int $entry_id): void {
$form_id = $form_data['id'];
// 特定フォームの送信後にカスタム処理
if ($form_id === 3) {
$email = $fields[1]['value'] ?? ''; // フィールドID 1 = メールアドレス
$name = $fields[2]['value'] ?? ''; // フィールドID 2 = 名前
// CRMや外部APIに送信
wp_remote_post('https://api.example.com/contact', [
'body' => ['email' => $email, 'name' => $name],
'timeout' => 10,
]);
error_log(sprintf('[WPForms] Form %d submitted by %s <%s> (entry %d)',
$form_id, $name, $email, $entry_id));
}
}, 10, 4);
// ③ フォーム送信エラーをログ
add_action('wpforms_process_before', function(array $entry, array $form_data): void {
error_log(sprintf('[WPForms] Processing form %d', $form_data['id']));
}, 10, 2);
ステップ3:メール通知を修正する
// functions.php: WPFormsメール設定
// ① 差出人アドレスをドメインに固定(スパム判定対策)
add_filter('wpforms_emails_from_address', function(string $from, array $form_data): string {
return 'noreply@' . parse_url(home_url(), PHP_URL_HOST);
}, 10, 2);
// ② 通知メールの件名をカスタマイズ
add_filter('wpforms_emails_subject', function(string $subject, array $form_data): string {
$site = get_bloginfo('name');
return sprintf('[%s] %s', $site, $subject);
}, 10, 2);
// ③ スマートタグを追加(カスタム値)
add_filter('wpforms_smart_tags', function(array $tags): array {
$tags['current_year'] = '現在の年';
$tags['site_phone'] = 'サイト電話番号';
return $tags;
});
add_filter('wpforms_smart_tag_process', function(string $content, array $form_data, array $fields, int $entry_id, string $tag): string {
if ($tag === 'current_year') return (string) date('Y');
if ($tag === 'site_phone') return get_option('site_phone', '');
return $content;
}, 10, 5);
// ④ HTML形式で通知メールを送信
add_filter('wpforms_emails_html', function(bool $html, array $form_data): bool {
return true; // 常にHTMLメール
}, 10, 2);
ステップ4:ファイルアップロードを設定する
// functions.php: WPFormsファイルアップロード設定
// ① 許可する拡張子を追加
add_filter('wpforms_upload_allowed_file_extensions', function(array $extensions): array {
$extensions[] = 'pdf';
$extensions[] = 'doc';
$extensions[] = 'docx';
$extensions[] = 'xlsx';
return $extensions;
});
// ② アップロード上限サイズを変更(MB単位)
add_filter('wpforms_field_file_upload_max_size', function(int $size): int {
return 20; // 20MB
});
// ③ アップロードディレクトリをカスタマイズ
add_filter('wpforms_upload_root', function(string $path): string {
// /wp-content/wpforms-uploads/ に変更
return WP_CONTENT_DIR . '/wpforms-uploads';
});
// ④ ファイルアップロード完了時の処理
add_action('wpforms_process_complete', function(array $fields, array $entry, array $form_data, int $entry_id): void {
foreach ($fields as $field) {
if ($field['type'] !== 'file-upload') continue;
$file_url = $field['value'] ?? '';
if ($file_url) {
error_log(sprintf('[WPForms] File uploaded for entry %d: %s', $entry_id, $file_url));
}
}
}, 10, 4);
ステップ5:条件付きロジックとパフォーマンスを最適化する
// functions.php: WPFormsパフォーマンス最適化
// ① フォームが存在しないページでスクリプトを読み込まない
add_action('wp_enqueue_scripts', function(): void {
if (!is_singular()) return;
global $post;
$content = $post->post_content ?? '';
// WPFormsショートコードまたはブロックがない場合はスクリプト除外
$has_wpforms = has_shortcode($content, 'wpforms')
|| str_contains($content, '<!-- wp:wpforms');
if (!$has_wpforms) {
wp_dequeue_script('wpforms');
wp_dequeue_script('wpforms-modern');
wp_dequeue_style('wpforms-full');
}
}, 20);
// ② WPFormsのAJAX URLをカスタマイズ
add_filter('wpforms_ajax_url', function(string $url): string {
return admin_url('admin-ajax.php');
});
// ③ reCAPTCHAをスキップする条件を設定
add_filter('wpforms_process_bypass_captcha', function(bool $bypass, array $form_data): bool {
// ログインユーザーはreCAPTCHAをスキップ
if (is_user_logged_in()) return true;
return $bypass;
}, 10, 2);
注意事項
- WPFormsの通知メールが届かない場合の最初の確認はメールサーバーの設定です。WordPressのデフォルトのPHP
mail()関数はスパム判定されやすいため、WP Mail SMTPプラグインを使用してSMTP送信に変更することを強く推奨します - 条件付きロジックが動作しない場合は、テーマやプラグインのJavaScriptとの競合が原因のことがあります。ブラウザの開発者ツール(F12)のコンソールタブでJavaScriptエラーが出ていないか確認してください
- ファイルアップロードのサイズ制限はWPFormsの設定に加えて、
php.iniのupload_max_filesizeとpost_max_size、さらにNginxを使用している場合はclient_max_body_sizeもすべて一致させる必要があります
まとめ
WPForms修復は①wpforms()->form->get()でフォーム一覧・エントリーテーブル確認、②wpforms_processフックでカスタムバリデーション追加・wpforms_process_completeで送信後の外部API連携、③wpforms_emails_from_addressフィルターで差出人をドメイン固定・wpforms_smart_tagsフィルターでスマートタグ追加、④wpforms_upload_allowed_file_extensionsフィルターでPDF/Word許可・wpforms_field_file_upload_max_sizeで上限を20MBに拡張、⑤has_shortcode()でフォーム未掲載ページのスクリプト除外・wpforms_process_bypass_captchaでログイン済みユーザーのreCAPTCHAスキップする手順で解決します。