Как добавить JavaScript и CSS в свои темы и плагины WordPress

Дизайнерам и разработчикам очень важно знать, как правильно добавлять JavaScript и CSS файлы в свои темы и плагины WordPress. Если вы не будете придерживаться правильных методов, то вы рискуете помешать работе других продуктов.

Эта статья послужит вам руководством, в котором будут описаны лучшие методы, позволяющие добиться лучшего результата.

Лучшие методы для каждого

Если вы когда-либо разрабатывали тему или плагин WordPress, вы, вероятно, сталкивались с несколькими различными способами добавления JavaScript и CSS. Есть много методов, которые, казалось бы, работают в определённых обстоятельствах. Но есть один первичный метод, рекомендуемый в Кодексе WordPress. Это предпочтительный способ, и он гарантирует, что ваша тема или плагин будет работать в любом случае, если, конечно, везде использован правильный код.

Однако в Кодексе, возможно, есть некоторые непонятные моменты. В них мы и постараемся внести ясность.

Что в комплекте?

Когда вы загружаете WordPress, набор общих библиотек JavaScript уже включён в комплект, и вы можете использовать их в своих JavaScript-разработках. Список включённых библиотек вы можете найти в статье wp_enqueue_script Кодекса WordPress.

Все эти библиотеки установлены, но WordPress загружает только те из них, которые ему нужны, и которые указаны в разделе администрации. Если вы пишете JavaScript программу, которая использует одну из этих библиотек, вам нужно указать WordPress, что вашему скрипту нужна определённая библиотека.

Укажите WordPress свои скрипты и что им необходимо для работы

Когда вы пишете JavaScript-код для WordPress, стоит подумать о следующих вещах:

  • Есть ли включённая библиотека, которую я могу использовать?
  • Могу ли я использовать именно ту версию библиотеки, которая входит в комплект?
  • Нужно ли мне загружать скрипт на страницах сайта или в разделе администрации?
  • На каких страницах сайта и страницах администрации мне нужно загружать скрипт?

Ответы на эти вопросы помогут вам узнать, что нужно сделать для регистрации и загрузки вашего скрипта. Всё это реализуется при помощи функции wp_register_script, вот пример её использования согласно Кодексу WordPress:

Итак, что за переменные мы здесь использовали, и всегда ли они нам нужны? (Это описывается в Кодексе, поэтому мы не будем вдаваться в подробности)

  • $handle – название скрипта, которое вам потребуется, чтобы обратиться к нему, когда вам нужно поставить его в очередь; это обязательная переменная
  • $src – путь к исходному файлу скрипта
  • $deps – массив, содержащий $handle всех скриптов, от которых зависит ваш скрипт (т.е. «зависимость»)
  • $ver – номер версии, используется для получения правильной версии скрипта, независимо от кэширования. По умолчанию устанавливается на номер версии WordPress
  • $in_footer – используется для загрузки скрипта в футере. Возможные значения — true или false. По умолчанию установлено false, и скрипт загружается вместе с wp_head(), а если значение true скрипт будет загружен в футере, вместе с wp_footer()

Немного о кэшировании

Браузеры помнят, какие скрипты и таблицы стилей они загружали для определённого сайта на основе URL скрипта или таблицы стилей. Если вы изменяете URL, даже просто добавляя строку запроса, браузер предполагает, что это новый файл и заново загружает его. Это можно использовать, когда вы вносите изменения в свой скрипт. При этом следует изменить номер версии скрипта, чтобы браузер клиента загрузил его с сервера, а не из кэша.

Теперь несколько примеров

Вот самый простой пример загрузки пользовательского скрипта:

Во-первых, мы регистрируем скрипт, чтобы WordPress мог определить, о чём идёт речь. Есть разные способы указания пути для JavaScript файла в зависимости от того, создаёте ли вы плагин или тему, здесь указаны оба примера. Затем мы ставим скрипт в очередь на добавление его в HTML код страницы, когда он будет сгенерирован, по умолчанию скрипты добавляются в раздел <head>, где расположена функция wp_head().

Так мы должны получить следующий результат:

Теперь если наш скрипт полагается на одну из библиотек, включённых в WordPress, таких как jQuery, вы можете сделать достаточно простое изменение в коде:

Примечание: По умолчанию, jQuery загружается в режиме noConflict для предотвращения конфликтов с другими библиотеками (такими как Prototype). Просмотрите раздел noConflict Кодекса, если вы раньше не имели с этим дело.

Теперь разберём, что мы здесь сделали. Сначала добавляем массив с дескриптором ‘jquery’ в качестве значения переменной $deps. Массив используется потому, что ваш скрипт может зависеть от нескольких библиотек. Если ваш скрипт использует jQuery и jQuery UI, то вы добавляете jQuery UI в массив вот так: array( 'jquery', 'jquery-ui-core' )

Изменения вступили в силу и вы можете видеть, что jQuery также был добавлен в раздел <head> страницы:

Давайте посмотрим на пример, в котором использованы все параметры:

OK, так мы добавили версию и определили, что скрипт должен загружаться в футере. В качестве версии мы выбрали сегодняшнюю дату, потому что так легче следить за версиями, но вы можете использовать любую нумерацию. Теперь у нас немного другой результат: jQuery выведен в <head>, а наш скрипт наряду с jQuery UI подключается прямо перед закрывающимся тегом </body>:

Устанавливаем приоритеты

Некоторые люди предпочтут отказаться от использования таких методов, поскольку они чувствуют, что в таком случае у них гораздо меньше контроля над тем, в каком порядке загружаются их скрипты. К примеру, в теме, которую использует modernizr, автору нужно было убедиться, что modernizr загружается в первую очередь.

Ранее мы не упоминали многих деталей того, как работает функция add_action, а с её помощью мы можем влиять на порядок выполнения. Вот использование этой функции согласно Кодексу WordPress:

Обратите внимание, что очень часто используются только параметры $tag и $function_to_add. Параметр $priority по умолчанию установлен на 10, а параметр $accepted_args — на 1. Если мы хотим, чтобы наши скрипты ставились в очередь раньше, мы просто понижаем значение $priority. Например:

Вывод скрипта будет таким же, как и раньше, но в HTML коде он произойдёт раньше.

Отмена стандартных библиотек и использование CDN (сетей доставки контента)

Возможно когда-нибудь вы захотите использовать другую версию библиотеки, в отличие от той, что включена в WordPress. Возможно вы захотите использовать самую современную версию или не захотите ждать следующего выпуска WordPress, прежде чем использовать последнюю версию jQuery. Или же вы захотите воспользоваться Google CDN версией библиотеки.

Важно, чтобы это использовалось только в плагинах или темах для сайтов, которые вы будете лично поддерживать. Плагины или темы, которые вы выпускаете для общественного использования должны использовать библиотеки, включённые в WordPress.

Почему? По той простой причине, что вы не управляете этими сайтами. Вы не знаете, какие другие плагины или темы могут использовать ваши клиенты, и вы не знаете, как часто они будут обновлять ваш продукт. Использование библиотек, входящих в комплект WordPress — самый безопасный вариант.

Но если вы хотите сделать это на своём сайте, вот, как это возможно:

Прежде всего мы удаляем из списка библиотек включённую версию библиотеки, иначе у нас были бы конфликты между различными версиями библиотек. Затем регистрируем свою версию, используя тот же самый дескриптор, определяем пустое значение в качестве версии (она уже в URL) и определяем, что она не в футере. Остальной код остаётся без изменений, потому что у нас есть зависимость от любого скрипта, использующего дескриптор ‘jquery’. Вот, что у нас должно получится:

Примечание: Одна из причин, по которым лучше не использовать это в плагине или теме для публичного использования, заключается в том, что все плагины и темы используемые на этом сайте теперь должны будут использовать указанную здесь версию jQuery. Кроме того, у недавно зарегистрированной версии jQuery нет noConflict, поэтому, если другие темы или плагины используют, к примеру, Prototype, это всё испортит.

Не будьте жадными

Пока мы ничего не упоминали о том, как сделать всё это в панели администрирования, только на front-end-страницах сайта. Главное различие здесь — это какое действие использовать. Вместо add_action( 'wp_enqueue_scripts', 'wptuts_scripts_basic' );, которое мы использовали для внешней части сайта, для панели администрирования используется действие add_action( 'admin_enqueue_scripts', 'wptuts_scripts_basic' );

То, что важно сделать как для внешней части, так и для раздела администрирования — это определить, на каких страницах вы используете свои скрипты. Если в вашем плагине или теме есть скрипт, который делает что-то на внешней странице или на странице администрирования, например, на странице опций темы, или странице с определённым виджетом, вам нужно загрузить скрипт только на этой странице. Нет никакого смысла загружать скрипт там, где он не используется!

В Кодексе WordPress есть отличный пример того, как загрузить скрипты только на страницах плагина. Т.к. плагины и темы могут сильно отличатся тем, как они построены, мы не будем вдаваться в подробности, как правильно загрузить плагины только для одной страницы, но об этом нужно было упомянуть, чтобы вы это учитывали во время разработки.

Теперь о стилях

Процесс работы со стилями очень похож на работу со скриптами. Он осуществляется с помощью функции wp_register_style. Здесь представлено её использование согласно Кодексу WordPress:

Отметьте, что отличие между wp_register_script и wp_register_style состоит лишь в том, что вместо параметра $in_footer у нас параметр $media. Его можно установить следующим образом: 'all', 'screen', 'handheld', 'print', или любым другим типом медиа-контента, признанным W3C.

Т.е. мы можем добавить стили следующим образом:

Это довольно всесторонний пример, использующий большинство параметров, результат будет такой:

Почему не все используют данный метод?

Вы, возможно задаётесь вопросом: “Почему этот метод ‘правильный’, а не просто ваше предпочтение?”. Если по существу — потому что этот метод рекомендуется WordPress. Это гарантирует, что любая комбинация плагинов и тем должна правильно функционировать без конфликтов.

В некоторых темах для загрузки скриптов используются теги <script></script> и <link /> в файлах header.php, и даже footer.php. Нет никакого смысла так поступать. Выше мы уже демонстрировали, что расположить скрипты и стили по приоритетам и определить, где они загружаются, вполне возможно в functions.php. Так ваша тема/фреймворк будет работать с гораздо большим количеством плагинов/тем.

К примеру, jQuery можно загрузить, используя теги <script></script>. На первый взгляд всё работает прекрасно, но так jQuery фактически может быть загружен дважды! Ведь подобная загрузка не помешает WordPress загрузить свою версию jQuery для других плагинов, поскольку версия от WordPress по умолчанию находится в режиме noConflict, а плагин может определить это как зависимость. Так у вас будет jQuery, как работающий в режиме noConflict, так и $, кроме того вы вероятно нарушите работу плагинов, использующих библиотеку Prototype.

Выводы

WordPress — фантастическая, очень продуманная система. Если есть механизм, позволяющий сделать что-либо, всегда стоит им воспользоваться. При разработке плагинов или тем старайтесь продумывать свой код, чтобы в дальнейшем у других не возникало с ним проблем.

А что вы думаете об использовании wp_enqueue_script и связанных с этим функциях и действиях? Знаете ли вы примеры, где это реализовано неправильно? Знаете ли вы какие-либо причины не следовать нашим советам? Поделитесь своими мыслями в комментариях.


4 комментарий на “Как добавить JavaScript и CSS в свои темы и плагины WordPress

  1. Че то фигня какая-то получается... вернее совсем ничего не получается, даже фигни)) Эти коды где прописывать надо? В плагине? В том файле где происходит инициализация плагина? ... прописал... и ничего... ничего не появилось... щас буду экспериментировать))

  2. возможно ли сделать так чтобы стиль шаблона не прикасался к плагину? Например чтобы сделанный мною чат имел свой стиль не взирая на смену шаблона

Оставить комментарий