ホームページ制作覚書

WordPress

プラグイン無しでWordPressにreCAPTCHA v3設定

自作フォームにreCAPTCHA v3を設定した時のメモ。

header.php

<script src="https://www.google.com/recaptcha/api.js?render=サイトキー"></script>
<script>
    grecaptcha.ready(function() {
        grecaptcha.execute('サイトキー', {action: 'submit'}).then(function(token) {
            // クラス名が'recaptcha-form'のすべてのフォームを取得
            var forms = document.querySelectorAll('form.recaptcha-form');
            
            // 各フォームにトークンを追加
            forms.forEach(function(form) {
                var recaptchaResponse = document.createElement('input');
                recaptchaResponse.setAttribute('type', 'hidden');
                recaptchaResponse.setAttribute('name', 'g-recaptcha-response');
                recaptchaResponse.setAttribute('value', token);
                form.appendChild(recaptchaResponse);
            });
        });
    });
</script>

全てのフォームに設定する場合は’form.recaptcha-form’からclassを外して’form’に。
フォームがあるページにのみ読み込むようにしたり、ログインしていないユーザーの場合のみにするなどの設定を加える。

functions.php

function verify_recaptcha_v3($token) {
    $recaptcha_secret = 'シークレットキー';
    $response = wp_remote_post(
        'https://www.google.com/recaptcha/api/siteverify',
        array(
            'body' => array(
                'secret' => $recaptcha_secret,
                'response' => $token,
                'remoteip' => $_SERVER['REMOTE_ADDR']
            )
        )
    );
    
    if (is_wp_error($response)) {
        return false;
    }

    $response_body = wp_remote_retrieve_body($response);
    $result = json_decode($response_body, true);

    if (isset($result['success']) && $result['success'] && $result['score'] >= 0.5) {
        return true;
    } else {
        return false;
    }
}

add_action('admin_post_nopriv_custom_form_submission', 'handle_custom_form_submission');
add_action('admin_post_custom_form_submission', 'handle_custom_form_submission');

function handle_custom_form_submission() {
    // nonceのチェック
    if (!isset($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'], 'user_registration_nonce')) {
        wp_die('セキュリティチェックに失敗しました。');
    }

    // reCAPTCHA v3の検証
    if (isset($_POST['g-recaptcha-response'])) {
        $recaptcha_token = sanitize_text_field($_POST['g-recaptcha-response']);
        $recaptcha_success = verify_recaptcha_v3($recaptcha_token);

        if (!$recaptcha_success) {
            wp_die('reCAPTCHA認証に失敗しました。');
        }
    } else {
        wp_die('reCAPTCHAが送信されていません。');
    }
}

CATEGORY : 

Arrival