Вопрос или проблема
Форма контактов 7 загружает скрипты reCaptcha v3 на всех страницах сайтов, из-за чего сайт работает медленно.
Раньше я использовал скрипт ниже, который работал нормально, но теперь он перестал работать и загружает ещё больше скриптов. Почему это может происходить?
Я не хочу использовать дополнительные плагины.
function contactform_dequeue_scripts() {
$load_scripts = false;
if( is_singular() ) {
$post = get_post();
if( has_shortcode($post->post_content, 'contact-form-7') ) {
$load_scripts = true;
}
}
if( ! $load_scripts ) {
wp_dequeue_script( 'contact-form-7' );
wp_dequeue_script('google-recaptcha');
wp_dequeue_style( 'contact-form-7' );
}
}
add_action( 'wp_enqueue_scripts', 'contactform_dequeue_scripts', 99 );
Я бы поместил операторы dequeue внутрь ‘if’, заменив строку $loadscripts. Нет необходимости устанавливать флаг и затем проверять его, чтобы выполнить dequeue. Это может упростить код для дальнейшей отладки.
Отредактировано: предложенные исправления кода:
function contactform_dequeue_scripts() {
if (is_singular()) {
$post = get_post();
if (has_shortcode($post->post_content, 'contact-form-7')) {
wp_dequeue_script('contact-form-7');
wp_dequeue_script('google-recaptcha');
wp_dequeue_style('contact-form-7');
}
}
}
add_action('wp_enqueue_scripts', 'contactform_dequeue_scripts', 99);
Это удаляет скрипты только если есть шорткод для CF7, и если это одиночная страница. В противном случае все выполняется нормально. Проще читать код и понимать, что происходит.
Это работает для меня.
function contactform_dequeue_scripts() {
$load_scripts = false;
if( is_singular() ) {
$post = get_post();
if( has_shortcode($post->post_content, 'contact-form-7') ) {
$load_scripts = true;
}
}
if( ! $load_scripts ) {
wp_dequeue_script( 'contact-form-7' );
wp_dequeue_script( 'google-recaptcha' );
wp_dequeue_script( 'wpcf7-recaptcha' );
wp_dequeue_style( 'wpcf7-recaptcha' );
wp_dequeue_style( 'contact-form-7' );
}
}
add_action( 'wp_enqueue_scripts', 'contactform_dequeue_scripts', 99 );
Более аккуратная версия:
function wpcf7_dequeue_redundant_scripts() {
$post = get_post();
if ( is_singular() && !has_shortcode( $post->post_content, 'contact-form-7' ) ) {
wp_dequeue_script( 'contact-form-7' );
wp_dequeue_style( 'contact-form-7' );
wp_dequeue_script( 'wpcf7-recaptcha' );
wp_dequeue_style( 'wpcf7-recaptcha' );
wp_dequeue_script( 'google-recaptcha' );
}
}
add_action( 'wp_enqueue_scripts', 'wpcf7_dequeue_redundant_scripts', 99 );
Я использую блок редактора и блок формы контактов 7, и это очень элегантное решение для этого требования:
/**
* Удалить reCaptcha формы контактов 7 из каждой страницы, загружать только когда блок существует - работает на версии 5.5.6
*/
add_action( 'wp_enqueue_scripts', function() {
if ( ! has_block( 'contact-form-7/contact-form-selector' ) ) {
wp_dequeue_script( 'contact-form-7' );
wp_dequeue_script( 'google-recaptcha' );
wp_dequeue_script( 'wpcf7-recaptcha' );
wp_dequeue_style( 'contact-form-7' );
}
}, 101 );
Пожалуйста, обратите внимание, что автор утверждает, что это не лучшая идея.
У меня такая же проблема с загрузкой на https://cadres-et-cordes.fr/
можете подтвердить, что я должен попробовать скопировать и вставить этот код в конец файла functions.php?
Ответ или решение
Для решения проблемы с загрузкой reCaptcha v3 на всех страницах сайта, кроме тех, где расположена форма Contact Form 7 (CF7), вам необходимо использовать подход, который отключает скрипты и стили, связанные с CF7, на страницах, где они не требуются. Это не только улучшит производительность вашего веб-сайта, но и будет особенно полезно для пользователей, которым не нужны функции, обеспечиваемые этой формой, на других страницах.
Шаги для отключения reCaptcha v3
-
Создайте резервную копию вашей темы: Перед внесением изменений в файл
functions.php
, обязательно создайте резервную копию вашей темы, чтобы предотвратить возможные негативные последствия. -
Редактируйте файл functions.php: Добавьте следующий код в конец файла
functions.php
вашей активной темы. Это удалит загрузку скриптов и стилей CF7, если на странице не используется шорткод для этой формы:
function wpcf7_dequeue_redundant_scripts() {
if ( ! ( is_singular() && has_shortcode( get_post()->post_content, 'contact-form-7' ) ) ) {
wp_dequeue_script( 'contact-form-7' );
wp_dequeue_script( 'google-recaptcha' );
wp_dequeue_script( 'wpcf7-recaptcha' );
wp_dequeue_style( 'contact-form-7' );
wp_dequeue_style( 'wpcf7-recaptcha' );
}
}
add_action( 'wp_enqueue_scripts', 'wpcf7_dequeue_redundant_scripts', 99 );
Объяснение кода
- Функция
is_singular()
: Эта функция проверяет, является ли текущая страница индивидуальным постом, страницей или вложением. - Функция
has_shortcode()
: Проверяет, содержит ли контент текущего поста шорткод'contact-form-7'
. Если шорткод не найден и страница индивидуальна, то скрипты и стили, относящиеся к CF7, будут удалены (dequeue
). wp_dequeue_script()
иwp_dequeue_style()
: Эти функции отключают загрузку указанных скриптов и стилей.
Оптимизация производительности
Удаление ненужных скриптов и стилей поможет уменьшить время загрузки страниц вашего сайта и улучшить пользовательский опыт. Это особенно важно для мобильных устройств и пользователей с медленным интернет-соединением.
Примечание
Обратите внимание на то, что отключение reCaptcha может снизить защиту от спама на ваших формах CF7. Убедитесь, что у вас есть альтернативные меры для защиты от нежелательных сообщений.
Заключение
Внесение предложенных изменений позволит вам улучшить производительность сайта, исключив избыточную загрузку скриптов, связанных с Contact Form 7, на страницах, где они не нужны. Рекомендуется периодически проверять работу вашего сайта и делать необходимые корректировки, так как обновления плагинов могут влиять на функциональность.