MW WP Form用のスパム対策プラグインが更新停止していたり、動作が不安定だったりする場合、functions.phpとフォーム設定に直接記述を加えることで、確実かつ軽量にreCAPTCHA v3を実装できます。
まずは公式サイトから、v3用の「サイトキー」と「シークレットキー」を取得してください。
送信時に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);
MW WP Formの管理画面(フォーム編集)にて、トークンを保持するフィールドと実行用のスクリプトを設置します。
送信ボタンの前などに、以下のショートコードを挿入します。これがGoogleから発行されたトークンを運ぶ「箱」になります。
[mwform_hidden name="recaptcha-token" id="recaptcha-token"]
同じくフォームの編集画面、またはテーマの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フィールドがトークンを引き継ぐため問題なく動作します。