2026年6月26日

2026年6月26日

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

はじめに

Ninja Formsで問い合わせフォームを送信しても管理者にメールが届かない・送信ボタンをクリックしてもフォームが送信されずJavaScriptエラーがコンソールに表示される・PDFやWordファイルのアップロードフィールドで「ファイル形式が許可されていません」エラーが出る・フォームの入力データがデータベースに保存されないといった問題は、メール設定・JavaScriptの競合・サーバーのファイルアップロード設定が原因です。

症状・原因

  • フォーム送信完了のメッセージは表示されるが管理者・送信者ともにメールが届かない
  • 送信ボタンをクリックすると「ninja_forms is not defined」JavaScriptエラーがコンソールに表示される
  • application/pdf形式のファイルをアップロードしようとすると「This file type is not allowed」と表示される
  • フォーム送信のたびにデータベースに保存されないため後から送信内容が確認できない

解決手順

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

# Ninja Formsの設定確認
wp eval "
if (defined('NF_PLUGIN_VERSION')) {
    echo 'Ninja Forms version: ' . NF_PLUGIN_VERSION . PHP_EOL;
}

// フォーム一覧を確認
\$forms = Ninja_Forms()->form()->get_forms();
echo 'Total forms: ' . count(\$forms) . PHP_EOL;

foreach (\$forms as \$form) {
    printf('  Form #%d: %s | Fields: %d' . PHP_EOL,
        \$form->get_id(),
        \$form->get_setting('title'),
        count(\$form->get_fields())
    );
}

// アクション設定を確認
\$form_id = 1; // 確認するフォームID
\$actions = Ninja_Forms()->form(\$form_id)->get_actions();
echo PHP_EOL . 'Actions for form #' . \$form_id . ':' . PHP_EOL;
foreach (\$actions as \$action) {
    printf('  Action: %s | Type: %s | Active: %s' . PHP_EOL,
        \$action->get_setting('label'),
        \$action->get_setting('type'),
        \$action->get_setting('active') ? 'yes' : 'no'
    );
}

// 送信データ数を確認
global \$wpdb;
\$submissions = \$wpdb->get_var(
    \"SELECT COUNT(*) FROM {\$wpdb->prefix}nf3_subs WHERE form_id = \$form_id\"
);
echo 'Submissions for form #' . \$form_id . ': ' . \$submissions . PHP_EOL;
"

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

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

// ① 送信完了後にカスタム処理を実行
add_action('ninja_forms_after_submission', function(array $form_data): void {
    $form_id    = $form_data['form_id'] ?? 0;
    $fields     = $form_data['fields'] ?? [];
    $field_data = [];

    // フィールドデータを連想配列に変換
    foreach ($fields as $field) {
        $key              = $field['key'] ?? '';
        $value            = $field['value'] ?? '';
        $field_data[$key] = $value;
    }

    // カスタムメタとして保存
    $sub_id = $form_data['actions']['save']['sub_id'] ?? 0;
    if ($sub_id) {
        update_option('_nf_last_sub_' . $form_id, [
            'sub_id'     => $sub_id,
            'email'      => $field_data['email'] ?? '',
            'submitted'  => current_time('mysql'),
        ]);
    }

    error_log(sprintf('[NF] Form #%d submitted, sub_id=%d', $form_id, $sub_id));
});

// ② 特定フォームの送信後にカスタムリダイレクト
add_filter('ninja_forms_submission_actions', function(array $actions, array $form_data): array {
    $form_id = $form_data['form_id'] ?? 0;
    if ($form_id !== 1) return $actions; // フォームIDが1の場合のみ

    foreach ($actions as &$action) {
        if ($action['settings']['type'] === 'success_message') {
            $action['settings']['success_msg'] = '<p>送信ありがとうございます。<a href="/thanks">こちら</a>からお礼ページへ</p>';
        }
    }
    return $actions;
}, 10, 2);

ステップ3:メール送信を修正する

// functions.php: メール設定修正

// ① Ninja Formsのメールアクションを上書き
add_filter('ninja_forms_action_email_args', function(array $args, array $action_settings, array $form_data): array {
    // 送信者アドレスをサイトドメインに統一
    $site_domain          = parse_url(get_site_url(), PHP_URL_HOST);
    $args['from_address'] = 'noreply@' . $site_domain;
    $args['from_name']    = get_bloginfo('name');

    // Reply-Toをフォーム入力のメールアドレスに設定
    foreach ($form_data['fields'] as $field) {
        if (($field['type'] ?? '') === 'email' && !empty($field['value'])) {
            $args['reply_to'] = $field['value'];
            break;
        }
    }

    return $args;
}, 10, 3);

// ② デバッグ用:すべてのNF送信メールをログ
add_filter('ninja_forms_action_email_message', function(string $message, array $action_settings): string {
    error_log(sprintf('[NF] Sending email to: %s | Subject: %s',
        $action_settings['to'] ?? 'unknown',
        $action_settings['email_subject'] ?? 'no subject'
    ));
    return $message;
}, 10, 2);

ステップ4:ファイルアップロード設定を修正する

// functions.php: ファイルアップロード設定

// ① 許可するファイル形式を追加
add_filter('ninja_forms_field_upload_allowed_extension', function(array $extensions): array {
    // PDF・Word・Excelファイルを追加
    $extensions[] = 'pdf';
    $extensions[] = 'doc';
    $extensions[] = 'docx';
    $extensions[] = 'xls';
    $extensions[] = 'xlsx';
    return $extensions;
});

// ② MIMEタイプの許可リストを拡張
add_filter('ninja_forms_field_upload_allowed_mime_types', function(array $mime_types): array {
    $mime_types['pdf']  = 'application/pdf';
    $mime_types['doc']  = 'application/msword';
    $mime_types['docx'] = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
    return $mime_types;
});

// ③ アップロードされたファイルをカスタムディレクトリに移動
add_filter('ninja_forms_upload_dir', function(array $dir): array {
    $custom_path = WP_CONTENT_DIR . '/uploads/ninja-forms-uploads/' . date('Y/m');
    $custom_url  = WP_CONTENT_URL . '/uploads/ninja-forms-uploads/' . date('Y/m');

    if (!is_dir($custom_path)) {
        wp_mkdir_p($custom_path);
        // .htaccessで直接アクセスをブロック
        file_put_contents($custom_path . '/.htaccess', 'deny from all');
    }

    $dir['path'] = $custom_path;
    $dir['url']  = $custom_url;
    return $dir;
});

ステップ5:フィールドバリデーションをカスタマイズする

# Ninja Formsデータのデバッグ
wp eval "
// 最近の送信データを確認
global \$wpdb;
\$subs = \$wpdb->get_results(
    \"SELECT s.id, s.form_id, s.date_updated, s.seq_num
     FROM {\$wpdb->prefix}nf3_subs s
     ORDER BY s.date_updated DESC LIMIT 5\",
    ARRAY_A
);

echo 'Recent submissions: ' . count(\$subs) . PHP_EOL;

foreach (\$subs as \$sub) {
    echo 'Sub #' . \$sub['id'] . ' (Form #' . \$sub['form_id'] . ') at ' . \$sub['date_updated'] . PHP_EOL;

    \$field_values = \$wpdb->get_results(
        \$wpdb->prepare(
            \"SELECT fv.field_id, fv.value FROM {\$wpdb->prefix}nf3_sub_meta fv WHERE fv.parent_id = %d LIMIT 10\",
            \$sub['id']
        ),
        ARRAY_A
    );

    foreach (\$field_values as \$fv) {
        printf('  Field #%s: %s' . PHP_EOL, \$fv['field_id'], substr(\$fv['value'], 0, 50));
    }
}
"

注意事項

  • Ninja FormsのJavaScriptエラーが発生する場合は、テーマのfunctions.phpでjQueryがnoConflictモードになっていることを確認してください。$の代わりにjQueryを使うか、(function($){...})(jQuery)でラップする必要があります
  • ファイルアップロードフィールドで「ファイル形式が許可されていません」エラーが出る場合は、WordPressのデフォルトMIMEタイプリストも確認してください。upload_mimesフィルターで許可されていないMIMEタイプはNinja Formsでも拒否されます
  • 大量のフォーム送信データはデータベースを圧迫します。「Ninja Forms → 送信データ」から定期的に古いデータをエクスポート・削除することをお勧めします

まとめ

Ninja Forms修復は①Ninja_Forms()->form()->get_forms()でフォーム一覧・アクション設定・送信数を確認、②ninja_forms_after_submissionフックでフィールドデータをメタ保存・ninja_forms_submission_actionsフィルターで成功メッセージをカスタマイズ、③ninja_forms_action_email_argsフィルターで送信元アドレスをサイトドメインに統一・Reply-Toをフォーム入力メールに設定、④ninja_forms_field_upload_allowed_extensionフィルターでPDF・Word・Excel形式を追加・ninja_forms_upload_dirフィルターで安全なカスタムディレクトリに移動、⑤nf3_sub_metaテーブルで送信データの保存状態を確認する手順で解決します。

お気軽にご相談ください

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