emove( "wpforms-is-turnstile-invisible" ); }; '; // Captcha callback, used by hCaptcha and checkbox reCaptcha v2. $callback = /** @lang JavaScript */ 'var wpformsRecaptchaCallback = function (el) { var hdn = el.parentNode.querySelector(".wpforms-recaptcha-hidden"); var err = el.parentNode.querySelector("#g-recaptcha-hidden-error"); hdn.value = "1"; wpformsDispatchEvent(hdn, "change", false); hdn.classList.remove("wpforms-error"); err && hdn.parentNode.removeChild(err); }; '; $sync = /** @lang JavaScript */ 'const wpformsRecaptchaSync = ( func ) => { return function() { const context = this; const args = arguments; // Sync with jQuery ready event. jQuery( document ).ready( function() { func.apply( context, args ); } ); } }; '; if ( $captcha_settings['provider'] === 'hcaptcha' ) { $data = $dispatch; $data .= $callback; $data .= /** @lang JavaScript */ 'var wpformsRecaptchaLoad = function () { Array.prototype.forEach.call(document.querySelectorAll(".g-recaptcha"), function (el) { var captchaID = hcaptcha.render(el, { callback: function () { wpformsRecaptchaCallback(el); } }); el.setAttribute("data-recaptcha-id", captchaID); }); wpformsDispatchEvent(document, "wpformsRecaptchaLoaded", true); }; '; return $data; } if ( $captcha_settings['provider'] === 'turnstile' ) { $data = $dispatch; $data .= $callback; $data .= $turnstile_update_class; $data .= /** @lang JavaScript */ 'var wpformsRecaptchaLoad = function () { Array.prototype.forEach.call(document.querySelectorAll(".g-recaptcha"), function (el) { let form = el.closest( "form" ), formId = form.dataset.formid, captchaID = turnstile.render(el, { theme: "' . $captcha_settings['theme'] . '", callback: function () { turnstileUpdateContainer(el); wpformsRecaptchaCallback(el); }, "timeout-callback": function() { turnstileUpdateContainer(el); } }); el.setAttribute("data-recaptcha-id", captchaID); }); wpformsDispatchEvent( document, "wpformsRecaptchaLoaded", true ); }; '; return $data; } if ( $captcha_settings['recaptcha_type'] === 'v3' ) { $data = $dispatch; $data .= /** @lang JavaScript */ 'var wpformsRecaptchaV3Execute = function ( callback ) { grecaptcha.execute( "' . $captcha_settings['site_key'] . '", { action: "wpforms" } ).then( function ( token ) { Array.prototype.forEach.call( document.getElementsByName( "wpforms[recaptcha]" ), function ( el ) { el.value = token; } ); if ( typeof callback === "function" ) { return callback(); } } ); } grecaptcha.ready( function () { wpformsDispatchEvent( document, "wpformsRecaptchaLoaded", true ); } ); '; } elseif ( $captcha_settings['recaptcha_type'] === 'invisible' ) { $data = $polyfills; $data .= $dispatch; $data .= $sync; $data .= /** @lang JavaScript */ 'var wpformsRecaptchaLoad = wpformsRecaptchaSync( function () { Array.prototype.forEach.call(document.querySelectorAll(".g-recaptcha"), function (el) { try { var recaptchaID = grecaptcha.render(el, { "callback": function () { wpformsRecaptchaCallback(el); }, "error-callback": function () { wpformsRecaptchaErrorCallback(el); } }, true); el.closest("form").querySelector("button[type=submit]").recaptchaID = recaptchaID; } catch (error) {} }); wpformsDispatchEvent(document, "wpformsRecaptchaLoaded", true); } ); var wpformsRecaptchaCallback = function (el) { var $form = el.closest("form"); if (typeof wpforms.formSubmit === "function") { wpforms.formSubmit($form); } else { $form.querySelector("button[type=submit]").recaptchaID = false; $form.submit(); } }; var wpformsRecaptchaErrorCallback = function (el) { var $form = el.closest("form"); $form.querySelector("button[type=submit]").dataset.captchaInvalid = true; }; '; } else { $data = $dispatch; $data .= $callback; $data .= /** @lang JavaScript */ 'var wpformsRecaptchaLoad = function () { Array.prototype.forEach.call(document.querySelectorAll(".g-recaptcha"), function (el) { try { var recaptchaID = grecaptcha.render(el, { callback: function () { wpformsRecaptchaCallback(el); } }); el.setAttribute("data-recaptcha-id", recaptchaID); } catch (error) {} }); wpformsDispatchEvent(document, "wpformsRecaptchaLoaded", true); }; '; } return $data; } /** * Cloudflare Turnstile captcha requires defer attribute. * * @since 1.8.1 * * @param string $tag HTML for the script tag. * @param string $handle Handle of script. * @param string $src Src of script. * * @return string */ public function set_defer_attribute( $tag, $handle, $src ) { $captcha_settings = wpforms_get_captcha_settings(); if ( $captcha_settings['provider'] !== 'turnstile' ) { return $tag; } if ( $handle !== 'wpforms-recaptcha' ) { return $tag; } return str_replace( ' src', ' defer src', $tag ); } }