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テーブルで送信データの保存状態を確認する手順で解決します。