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スキップする手順で解決します。

お気軽にご相談ください

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