/>
/>
add( 'invalid_recaptcha', __( 'Registration failed', 'rcp' ), 'register' ); return; } // Skip on validation step (to ensure we only do this once). if ( ! empty( $data['validate_only'] ) ) { return; } $verify = wp_safe_remote_post( 'https://www.google.com/recaptcha/api/siteverify', array( 'body' => array( 'secret' => trim( $rcp_options['recaptcha_private_key'] ), 'response' => $data['g-recaptcha-response'], 'remoteip' => $data['g-recaptcha-remoteip'] ) ) ); $verify = json_decode( wp_remote_retrieve_body( $verify ) ); if ( 2 === rcp_get_recaptcha_version() ) { /** * Validate reCAPTCHA v2 response */ if ( empty( $verify->success ) || true !== $verify->success ) { rcp_errors()->add( 'invalid_recaptcha', __( 'Registration failed', 'rcp' ), 'register' ); } return; } else { /** * Validate reCAPTCHA v3 response */ /** * Filters the score threshold. Scores lower than this will be rejected. */ $score_threshold = apply_filters( 'rcp_recaptcha_score_threshold', 0.5 ); $score = ! empty( $verify->score ) ? $verify->score : 0; rcp_log( sprintf( 'reCAPTCHA score: %s / %s', $score, $score_threshold ) ); if ( empty( $verify->success ) || true !== $verify->success || empty( $verify->action ) || 'register' !== $verify->action || $score < $score_threshold ) { rcp_errors()->add( 'invalid_recaptcha', __( 'Registration failed', 'rcp' ), 'register' ); if ( isset( $verify->{'error-codes'} ) ) { rcp_log( sprintf( 'reCAPTCHA errors: %s', var_export( $verify->{'error-codes'}, true ) ), true ); } } } } add_action( 'rcp_form_errors', 'rcp_validate_captcha' );