プラグイン無しでWordPressにreCAPTCHA v3設定
2024.09.19
自作フォームに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 :