Ограничить плагин только для загрузки его CSS и JS на выбранных страницах?

9

Я бы хотел, чтобы плагин ограничивал загрузку таблиц стилей CSS и JS-файлов JavaScript только теми страницами, для которых они нужны.

Примером моего вопроса является плагин Contact Form 7, который я использовал для создания формы на одной странице моего сайта ( страница « Свяжитесь со мной »). Однако он добавляет следующие строки на КАЖДУЮ страницу / пост на сайте:

<link rel='stylesheet' id='contact-form-7-css'  href='http://www.r-statistics.com/wp-content/plugins/contact-form-7/styles.css?ver=2.3.1' type='text/css' media='all' /> 

<script type='text/javascript' src='http://www.r-statistics.com/wp-content/plugins/contact-form-7/scripts.js?ver=2.3.1'></script> 

Это заставляет меня подозревать, что этот плагин ухудшает время загрузки моего сайта, поскольку расширение интересует меня только на одной странице сайта.

Таким образом, мой вопрос заключается в том, как я могу удалить эти дополнительные строки со всех страниц, кроме страницы «Свяжитесь со мной», но без деактивации плагина?

Таль Галили
источник

Ответы:

9

Стили и сценарии всегда устанавливаются функциями wp_enqueue_script()и wp_enqueue_style()должны быть привязаны к определенному хуку действий, чтобы функционировать. Я взял быстрый взгляд в форме контактов 7, и похоже , что он использует тег действий из wpcf7_enqueue_scriptsи wpcf7_enqueue_stylesдобавить их к wp_print_scriptsи wp_print_stylesкрючки.

Итак, вам нужно отсоединить скрипты и стили от каждой страницы, кроме вашей страницы контактов. В wp_headпожарах действий перед сценарием и стилей действий, так что вам нужно добавить что - то вроде этого в файл functions.php вашей темы:

function remove_wpcf7_extras() {
    remove_action('wp_print_scripts', 'wpcf7_enqueue_scripts');
    remove_action('wp_print_styles', 'wpcf7_enqueue_styles');
}

if( ! is_page('contact me') ) {
    add_action('wp_head', 'remove_wpcf7_extras');
}

Функция is_page () вернется, trueкогда вы окажетесь на странице контактов (при условии, что имя «contact me») ... вы также можете использовать слаг и идентификатор страницы для фильтра. На всех остальных страницах, то if()условный будет добавить функцию удаления сценария / стиля к wp_headдействию, которое выстреливает как раз перед wp_print_scriptsи wp_print_stylesдействиями.

Это должно удалить лишний код с ваших страниц, и вам не нужно будет деактивировать плагин или редактировать какие-либо основные файлы. Функции и код, которые я перечислил выше, также не повредят вашу тему, если вы удалите контактную форму 7 в будущем, так что ... не нужно беспокоиться о совместимости обновления в будущем.

EAMann
источник
Привет EAMann. Отличное решение - спасибо! Как вы думаете, этот метод может быть включен в плагин, который проверяет, какие хуки используются, а затем позволяет кому-то деактивировать их в соответствии с расположением страницы?
Тал Галили
К сожалению, есть много хуков, которые динамически используются в WordPress. Таким образом, вы не можете надежно определить, какие крючки используются ... но вы, вероятно, могли бы поймать большинство из них таким образом.
EAMann
Круто. Вы только что дали мне идею для нового вопроса: wordpress.stackexchange.com/questions/698/…
Таль Галили
Просто чтобы вы знали, вы также дали мне идею начать разработку этого плагина :-)
EAMann
3
@EAMann и @Tal Galili - на самом деле вы можете захватить все хуки, даже динамические, используя allхук, см. Wordpress.stackexchange.com/questions/307
MikeSchinkel