プラグイン無しで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 :