我在客户的网站上使用脚本tarteaucitron.js来管理第三方cookie和脚本。该网站是WordPress驱动的。
我们有一个使用ContactForm7扩展创建的联系表单和集成的reCAPTCHA。
我想让TarteAuCitron处理reCAPTCHA脚本而不是ContactForm7加载它。我知道TarteAuCitron能够加载reCAPTCHA,但我不知道如何将它与ContactForm7设置和WordPress脚本系统结合使用。
我找到了办法。在WordPress操作挂钩(wp_footer
)中,我将联系表单7排队的reCAPTCHA脚本出列。然后插入自定义TarteAuCitron服务和服务调用(对于reCAPTCHA v2和v3不同),然后是Contact Form 7引导脚本:
// remove recaptcha script
wp_dequeue_script('google-recaptcha');
// enqueue recaptcha service
// $service contains the definition script of the TarteAuCitron service named 'recaptchacf7'
wp_add_inline_script('tarteaucitron', $service, 'after');
// enqueue service call
wp_add_inline_script('tarteaucitron', '(tarteaucitron.job = tarteaucitron.job || []).push("recaptchacf7");', 'after');
使用reCAPCHA v3,棘手的部分是检索Contact Form 7引导脚本,该脚本没有以标准方式排队,而只是在wp_footer
动作期间编写。我们需要阻止其立即插入,并将其插入服务定义脚本中,以便以后激活,如果网站用户选择启用它。我在ob_start()
和ob_get_clean()
PHP函数的帮助下做到了这一点:
if (function_exists('wpcf7_recaptcha_onload_script')) {
array_push(wp_scripts()->done, 'google-recaptcha');
ob_start();
wpcf7_recaptcha_onload_script();
$bootstrap = preg_replace('/<\/?script[^>]*>/', '', ob_get_clean());
array_pop(wp_scripts()->done);
}
我将代码包装在一个WordPress插件中,可以在这里找到:cf7-tac-recaptcha。它包括reCAPTCHA v2和v3的服务定义脚本。没有更多的配置。