2026.01.23MW WP FORMにreCAPTCHA v3を導入する方法TECH BLOG

MW WP FormにreCAPTCHA v3をプラグインなしで導入する方法

MW WP Form用のスパム対策プラグインが更新停止していたり、動作が不安定だったりする場合、functions.phpとフォーム設定に直接記述を加えることで、確実かつ軽量にreCAPTCHA v3を実装できます。


1. Google reCAPTCHAのキーを取得

まずは公式サイトから、v3用の「サイトキー」と「シークレットキー」を取得してください。

2. functions.phpへの記述

送信時にGoogleのAPIへ問い合わせを行い、スパム判定(スコア検証)を行うロジックを追加します。「mw-wp-form-xxx」の部分は、作成したフォームの識別子IDに書き換えてください。

/**
 * MW WP Form reCAPTCHA v3 判定ロジック
 */
function my_custom_recaptcha_validation($validation, $data) {
    $secret_key = 'ここにシークレットキーを入力';
    $token = isset($_POST['recaptcha-token']) ? sanitize_text_field($_POST['recaptcha-token']) : '';

    // トークンがない場合はエラー
    if (empty($token)) {
        $validation->set_rule('recaptcha-token', 'no_token', array('message' => 'セキュリティ検証に失敗しました。'));
        return $validation;
    }

    // Google APIへの検証リクエスト
    $request = wp_safe_remote_post('https://www.google.com/recaptcha/api/siteverify', array(
        'body' => array(
            'secret'   => $secret_key,
            'response' => $token,
            'remoteip' => $_SERVER['REMOTE_ADDR']
        )
    ));

    $response_body = wp_remote_retrieve_body($request);
    $result = json_decode($response_body);

    // 判定:成功フラグがfalse、またはスコアが0.5未満ならスパムとみなす
    if (!$result->success || $result->score < 0.5) {
        $validation->set_rule('recaptcha-token', 'spam_detected', array('message' => 'スパムの疑いがあります。'));
    }

    return $validation;
}
// フィルターフックの末尾「xxx」を使用するフォームIDに変更
add_filter('mwform_validation_mw-wp-form-xxx', 'my_custom_recaptcha_validation', 10, 2);

3. フォーム編集画面への記述

MW WP Formの管理画面(フォーム編集)にて、トークンを保持するフィールドと実行用のスクリプトを設置します。

① Hiddenフィールドの追加

送信ボタンの前などに、以下のショートコードを挿入します。これがGoogleから発行されたトークンを運ぶ「箱」になります。

[mwform_hidden name="recaptcha-token" id="recaptcha-token"]

② JavaScriptの追加

同じくフォームの編集画面、またはテーマのfooter.phpなどに以下のスクリプトを記述します。

<script src="https://www.google.com/recaptcha/api.js?render=ここにサイトキーを入力"></script>
<script>
(function() {
    grecaptcha.ready(function() {
        grecaptcha.execute('ここにサイトキーを入力', {action: 'submit'}).then(function(token) {
            var tokenField = document.getElementById('recaptcha-token');
            if (tokenField) {
                tokenField.value = token;
            }
        });
    });
})();
</script>

まとめ

この実装方法は、特定の項目に対してバリデーションをかけるのではなく、フォーム全体の検証プロセスにreCAPTCHAの判定を組み込んでいるため、より堅牢な作りになっています。確認画面を挟む構成でも、hiddenフィールドがトークンを引き継ぐため問題なく動作します。