Amazon11/12まで!スマイルSale開催中! セール会場へ

Snow Monkey Forms│メールアドレスのダブルチェック確認の実装方法

ブロックエディタで作成できるSnow Monkey Forms。

メールアドレスを2回入力してもらい、入力の食い違いに気づけるようにする方法です。

そこでJavaScriptを使って実装してみましたので本記事でも紹介いたします。

Snow Monkey Formsでメールアドレスのダブルチェック確認を実装する例。

Snow Monkey Forms の設定・カスタマイズ方法はこちらにまとめています。

目次

著者

WEB制作をしているデジタルノマド
WordPressのカスタマイズが好きで、色々と自作しています。

WordPressのカスタマイズに困ったらご相談ください!

Snow Monkey Formsのメールアドレスのダブルチェック確認の実装方法

JavaScriptで入力中の不一致を知らせ、PHPで確認・送信時の2欄の一致を検査します。

メールの到達や所有確認は別途必要です。

お問い合わせフォームの作成

まずは事前準備です。

NAME属性の設定

2つのメールアドレスの項目を作成。

入力欄のNAME属性に名前をつけておきます。

NAME属性
Eメールemail
Eメール(確認用)confirm-email
フォームのEメールおよび確認用Eメールの項目にNAME属性を設定している画面。

IDの確認

検証から対象のお問い合わせフォームのIDを調べておきましょう。

snow-monkey-form-115

ブラウザの検証機能でお問い合わせフォームのIDを確認している様子。

ダブルチェック確認のコードを追加

以下を対象ページで読み込むJavaScriptファイルへ1回だけ追加してください。

子テーマから読み込む場合は wp_enqueue_script を使います。

両方のメール欄を必須のメール型に設定し、確認用欄のNAMEを confirm-email にしてください。

先ほどメモしたフォームのIDも変更しておきます。

const form = document.getElementById('snow-monkey-form-115');

(() => {
  const formId = 'snow-monkey-form-115'; // 対象フォームのIDへ変更
  const inspect = (form, showEmpty = false) => {
    const first = form.querySelector('input[name="email"]');
    const second = form.querySelector('input[name="confirm-email"]');
    if (!first || !second) return null;
    let message = form.querySelector('.waza-email-match-error');
    if (!message) {
      message = document.createElement('p');
      message.className = 'waza-email-match-error';
      message.id = formId + '-email-match-error';
      message.setAttribute('aria-live', 'polite');
      second.insertAdjacentElement('afterend', message);
      const ids = new Set((second.getAttribute('aria-describedby') || '').split(/\s+/).filter(Boolean));
      ids.add(message.id);
      second.setAttribute('aria-describedby', [...ids].join(' '));
    }
    const mismatch = first.value !== second.value;
    message.textContent = mismatch && (showEmpty || second.value !== '')
      ? 'メールアドレスが一致しません。2つの入力欄を確認してください。' : '';
    return { mismatch, second };
  };
  ['input', 'change'].forEach(type => document.addEventListener(type, event => {
    const target = event.target;
    if (!(target instanceof HTMLInputElement)) return;
    const form = target.form;
    if (form && form.id === formId && ['email', 'confirm-email'].includes(target.name)) inspect(form);
  }));
  document.addEventListener('submit', event => {
    const form = event.target;
    if (!(form instanceof HTMLFormElement) || form.id !== formId) return;
    if (event.submitter?.getAttribute('data-action') === 'back') return;
    const result = inspect(form, true);
    if (result?.mismatch) {
      event.preventDefault();
      event.stopImmediatePropagation();
      result.second.focus();
    }
  }, true);
})();

エラー文の位置調整

見た目も少し調整します。

.waza-email-match-error { color: #a30000; margin: .5em 0; }

確認

2つのメールアドレスの入力欄に異なる情報を入れるとエラーが発生します。

2つのメールアドレス入力欄に異なる内容を入力した際にエラーが表示され、送信できない状態。

両メール欄の変更を監視し、不一致で確認・送信操作をすると確認用欄へフォーカスを移します。

確認・送信時にPHPでも一致を検査する

JavaScriptだけでは、直接リクエストによる不一致を防げません。

以下を子テーマのfunctions.phpのPHP内、またはCode SnippetsのPHPスニペットへ追加します。

フォームIDの115をJavaScript側と同じ対象フォームIDへ変更し、2欄のNAMEをemail・confirm-emailに揃えます。

両欄の必須・メール型設定はSMF側でも有効にしてください。

add_filter( 'snow_monkey_forms/spam/validate', function ( $valid, $responser, $setting ) {
    // 既存のスパム判定を維持します。
    if ( is_wp_error( $valid ) || ! $valid ) {
        return $valid;
    }
    if ( 115 !== (int) $setting->get( 'form_id' ) ) { // 対象フォームIDへ変更
        return $valid;
    }
    $method = \Snow_Monkey\Plugin\Forms\App\Model\Meta::get_method();
    if ( ! in_array( $method, array( 'confirm', 'complete' ), true ) ) {
        return $valid;
    }
    $email = $responser->get( 'email' );
    $confirm = $responser->get( 'confirm-email' );
    if ( ! is_string( $email ) || ! is_string( $confirm ) ||
        '' === $email || '' === $confirm || $email !== $confirm ) {
        return new WP_Error( 'waza_email_mismatch',
            'メールアドレスが一致しません。ページを再読み込みして、2つの入力欄を確認してください。' );
    }
    return $valid;
}, 20, 3 );

確認・送信時に2欄が一致しなければ、SMFのspam/validateフックからWP_Errorを返してメール処理の前に止めます。

既存のスパム判定がfalseやWP_Errorなら、その判定を維持します。

このサーバー検査で不一致になった場合は、SMFのシステムエラー画面になります。

画面の指示どおりページを再読み込みし、入力し直してください。

通常の入力画面では前述のJavaScriptが先に不一致を知らせます。

戻る操作と他フォームはこの一致検査の対象外です。

通常のCSRF処理を使った実HTTP通信でも、追加JavaScriptを読み込まない検証フォームの不一致をPHP側で拒否できました。

戻す場合は、このadd_filter全体をCode Snippetsで無効化するか子テーマから取り除き、キャッシュを消します。

JavaScriptとSMF側の必須設定は別に管理します。

スポンサーリンク

確認画面から戻った後のメール変更を確認する

2つのメール欄へ同じ架空の値を入力し、他の必須項目を満たして確認画面へ進みます。

「戻る」で入力画面へ戻り、最初のメール欄だけを変更します。

確認ボタンをEnterで操作すると、不一致の文言が表示され、確認用欄へフォーカスが移ります。

確認用欄も同じ値へ修正してから、再び確認画面へ進めることを確認します。

PHP側のシステムエラー画面からは、ページを再読み込みして入力し直します。

1280px・375px相当の幅で、確認・戻る・元欄変更後の再判定を確認しました。

検証環境ではメール処理を配送直前に捕捉しており、メール受信と外部スパム対策の併用は導入先で確認してください。

メール確認欄へフォーカスが移り不一致が表示された実フォーム
2026年10月2日撮影。WordPress 7.1.2・SWELL 2.19.0・Snow Monkey Forms 13.0.0の隔離環境。元の欄と確認用欄が異なる場合の表示です。
PHP側のメール一致検査で表示されたシステムエラー
2026年10月2日撮影。WordPress 7.1.2・SWELL 2.19.0・Snow Monkey Forms 13.0.0の隔離環境。追加JavaScriptを読み込まないフォームを使い、サーバー側の不一致拒否を確認した画面です。
スポンサーリンク

まとめ

一致していてもアドレスが正しいとは限りません。

確認メールを受信できるかのテストは別途必要です。

今回のカスタマイズもよく使うと思うので、参考にしてください。

送信しない入力見本

以下は表示・入力判定だけの見本です。

メールは送信せず保存もしません。

a@example.com など架空の値で、一致→元の欄だけ変更→一致への修正を試せます。

実フォームの通信処理は含みません。

元に戻す場合は追加したJavaScriptとCSSを削除し、キャッシュを消して確認します。

表示専用見本で元のメール欄だけを変更し、確認用欄に不一致エラーが表示されたスマホ画面
2026年10月1日、表示専用見本を幅390pxで確認。メール送信機能は含みません。

よくある質問:Snow Monkey Formsでメールアドレスのダブルチェックを実装するとき

このダブルチェックは、何をする仕組みですか?

記事では、メールアドレスを2回入力してもらい、入力の食い違いに気づけるようにする方法です。

JavaScriptで入力中の不一致を知らせ、PHPで確認・送信時の2欄の一致を検査します。

2つのメール欄に、事前に設定するものはありますか?

記事では、2つのメールアドレスの項目を作成し、入力欄のNAME属性に名前をつけます。

記事の例では、Eメールがemail、Eメール(確認用)がconfirm-emailです。

両方のメール欄を必須のメール型に設定し、対象のお問い合わせフォームのIDも調べておきます。

JavaScriptを入れるだけで十分ですか?

十分ではありません。

記事では、JavaScriptだけでは直接リクエストによる不一致を防げないため、確認・送信時にPHPでも一致を検査するとしています。

追加JavaScriptを読み込まない検証フォームでも、不一致をPHP側で拒否できることを実HTTP通信で確認したとしています。

PHPの検査でエラーになった場合は、どうなりますか?

記事では、SMFのシステムエラー画面になります。

画面の指示どおりページを再読み込みし、入力し直します。

通常の入力画面では、JavaScriptが先に不一致を知らせます。

戻る操作と他フォームは、この一致検査の対象外です。

確認画面から戻って、メール欄を変えたときはどうなりますか?

記事では、「戻る」で入力画面へ戻って最初のメール欄だけを変更し、確認ボタンをEnterで操作すると、不一致の文言が表示され、確認用欄へフォーカスが移ります。

確認用欄も同じ値へ修正してから、再び確認画面へ進めることを確認します。

2つのメールアドレスが一致していれば、アドレスは正しいといえますか?

いえません。

記事では、一致していてもアドレスが正しいとは限らず、確認メールを受信できるかのテストは別途必要としています。

メールの到達や所有確認も別途必要です。

元に戻したいときは、どうしますか?

記事では、このadd_filter全体をCode Snippetsで無効化するか子テーマから取り除き、キャッシュを消します。

JavaScriptとSMF側の必須設定は別に管理します。

メールの受信や、ほかのスパム対策との併用は確認されていますか?

記事では、検証環境ではメール処理を配送直前に捕捉しており、メール受信と外部スパム対策の併用は導入先で確認してくださいとしています。

  • URLをコピーしました!

プラグインの設定でお困りなら

プラグインの導入・カスタマイズ代行

プラグインの選定から設定、競合の解消、動作に合わせた追加実装まで承ります。1時間 ¥8,000〜(税込)。

WAZAの有料記事のサブスクリプションも開始しました。

サービス

Service

WordPressサイトのカスタマイズのサービスに関心がありましたら、ぜひ詳細をご覧ください。

目次