Подключаем стили и cкрипты в WordPress ( wp_enqueue_scripts )
Как правильно подключать стили и скрипты в WordPress?
На хук wp_enqueue_scripts
(который срабатывает в момент хука wp_head
с приоритетом 1) принято вешать функции wp_enqueue_style()
и wp_enqueue_script()
, которые подключают соответственно стили и скрипты.
Для работы этого хука необходима функция wp_head()
в файле header.php.
Простой способ подключения:
add_action( 'wp_enqueue_scripts', 'custom_theme_scripts' );
function custom_theme_scripts() {
// подключаем css файл темы
wp_enqueue_style( 'main-style', get_stylesheet_uri() );
// подключаем js файл темы
wp_enqueue_script( 'main-script', get_template_directory_uri() .'/assets/js/example.min.js', array( 'jquery' ), '1.0', true );
}
Если в функции присутствует префикс get_template_
, то будет подключен файл из родительской темы, если же префикс get_stylesheet_
, то — из дочерней темы, если дочерняя тема активирована (если не активирована — из родительской).
Как сделать подключение скриптов по условию
При подключении скриптов и стилей на хуке wp_enqueue_scripts
глобальные переменные уже определены, поэтому все условные теги вида is_home()
, is_front_page()
, is_archive()
, is_page()
и подобные будут работать.
Ниже мы подключаем на главную одни стили (slyle-home.min.css
), а на страницу категорий другие (slyle-cats.min.css
). Общий файл стилей будет подключен на все страницы сайта (slyle-common.min.css
).
add_action( 'wp_enqueue_scripts', 'custom_theme_scripts' );
function custom_theme_scripts() {
wp_enqueue_style( 'slyle-common', get_theme_file_uri( 'assets/css/slyle-common.min.css' ) );
if ( is_home() || is_front_page() ) {
wp_enqueue_style( 'slyle-home', get_theme_file_uri( 'assets/css/slyle-home.min.css' ) );
}
if ( is_category() ) {
wp_enqueue_style( 'slyle-cats', get_theme_file_uri( 'assets/css/slyle-cats.min.css' ) );
}
}
Подключаем стили и скрипт, только на одну страницу
add_action('wp', 'add_my_script');
function add_my_script(){
if( is_page(77) )
add_action( 'wp_enqueue_scripts', 'calc_scripts' );
}
function calc_scripts() {
wp_enqueue_style( 'calc_styles', get_stylesheet_directory_uri() . '/calc/style.css' );
wp_enqueue_script( 'calc_scripts', get_stylesheet_directory_uri() . '/calc/script.js', array( 'jquery' ) );
}
Где is_page(77)
— проверка нужной страницы (id = 77).
По аналогии можно делать любые другие проверки…
Как сделать обновление скриптов в кеше браузера
Один из часто задаваемых вопросов звучит примерно так: «Почему я изменяю css файл, но эти изменения не видны на сайте?».
Ответ: при первом посещении сайта браузер скачивает файлы стилей, скриптов, изображения и т.д. себе в кеш. При каждом последующем посещении браузер уже не будет скачивать их заново, а возьмет из своего локального хранилища (кеша). Это работает в целях оптимизации посещения интернет-ресурсов.
Но есть отличный способ динамически сообщать браузеру об изменениях в ваших файлах — указывать их версии. Это удобно делать с помощью функции filemtime()
.
Теперь браузер будет проверять, изменилась ли версия (время последнего изменения) файла и только в случае положительного ответа скачивать файл заново.
К тому же, в одной из последних версий добавили функцию get_theme_file_uri()
, которая проверяет наличие файла в дочерней теме перед подключением, это довольно удобно.
Если мы применим эти советы, то получим примерно следующее:
add_action( 'wp_enqueue_scripts', 'custom_theme_scripts' );
function custom_theme_scripts() {
// подключаем css файл темы
wp_enqueue_style( 'main-style', get_stylesheet_uri(), array(), filemtime( get_theme_file_path( '/style.css' ) ) );
// подключаем js файл темы
wp_enqueue_script( 'main-script', get_theme_file_uri( 'assets/js/example.min.js' ), array( 'jquery' ), filemtime( get_theme_file_path( '/assets/js/example.min.js' ) ) );
}
_S_VERSION
, предварительно определив ее define( '_S_VERSION', '1.0.0' )
. Как вы понимаете, версия не будет меняться динамически при таком подходе и ее указание довольно бессмысленно.Обновление скриптов в кеше браузера (второй способ)
Обновление скриптов в кеше браузера с помощью функции filemtime()
иногда может быть невозможно из-за настроек сервера в котором эта функция отключена.
В этом случае можно прописывать динамически версию файла, которая будет меняться при каждом обращении к скачиваемому файлу, с помощью time()
add_action( 'wp_enqueue_scripts', 'rufri_child_style' );
function rufri_child_style() {
$d = time();
wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css', array(), $d);
wp_enqueue_style( 'rufri-style', get_stylesheet_directory_uri() . '/rufri.css', array(), $d);
}
Пример выше лучше использовать только при разработке тем и т.п. при частом изменении файлов.
Как добавить один скрипт после другого
Еще, при работе со скриптами полезно знать, что в третьем параметре функции wp_enqueue_script()
можно указать зависимость этого скрипта от других. Например, если вы укажите array('jquery')
(где jquery
имя скрипта из первого параметра wp_enqueue_script()
этого скрипта), то скрипт example.min.js
будет подключен после скрипта jquery.min.js
.
Кроме того, существует полезная функция wp_add_inline_script()
, которая позволит вам добавить скрипт прямо в html документ, после указанного. Аналогично для стилей будет работать функция wp_add_inline_style()
. Рассмотрим пример подключения slick-слайдера:
add_action( 'wp_slick_scripts', 'enqueue_slick_scripts' );
function enqueue_slick_scripts() {
wp_enqueue_style( 'slick-style', get_stylesheet_directory_uri() . '/assets/libs/slick/slick.min.css' );
wp_enqueue_style( 'slick-theme', get_stylesheet_directory_uri() . '/assets/libs/slick/slick-theme.min.css' );
wp_enqueue_script( 'slick-scripts', get_stylesheet_directory_uri() . '/assets/libs/slick/slick.min.js', array( 'jquery' ) );
$slick_init = 'jQuery(function($) {
$(".slick-container").slick({
infinite: true,
slidesToShow: 3,
slidesToScroll: 3
});
});';
wp_add_inline_script( 'slick-scripts', $slick_init );
}
Как видите, сначала нужные файлы подключаются с помощью функций wp_enqueue_style()
и wp_enqueue_script()
, после чего скрипт инициализации слайдера вставляется с помощью wp_add_inline_script()
после основного slick.min.js
.
Как сделать предварительную регистрацию скриптов
Еще одной важной особенностью работы со скриптами является то, что скрипт можно только зарегистрировать c помощью функции wp_register_script()
, а выполнять подключение уже в любом другом месте проекта по необходимым условиям. Рассмотрим на примере:
add_action( 'wp_enqueue_scripts', 'enqueue_masonry_scripts' );
function enqueue_masonry_scripts() {
wp_register_style( 'masonry-styles', get_stylesheet_directory_uri() . '/assets/libs/masonry/masonry.min.css' );
wp_register_script( 'masonry-scripts', get_stylesheet_directory_uri() . '/assets/libs/masonry/masonry.min.js', array( 'jquery' ) );
}
Сначала мы регистрируем скрипты библиотеки masonry для того, чтобы сделать красивые фото-галереи у нас на сайте. Эти скрипты не будут подключены в html-документ до тех пор, пока вы не используете функцию wp_enqueue_style()
или wp_enqueue_script()
.
Сами фото-галереи выводятся с помощью шорткодов и мы можем прямо здесь выполнить их подключение. Таким образом эти скрипты будут подключены в html-документе только в том случае, если на странице будет использован этот шорткод.
add_shortcode( 'masonry-gallery', 'masonry_gallery' );
function masonry_gallery( $atts ) {
//<...>
wp_enqueue_style( 'masonry-styles' );
wp_enqueue_script( 'masonry-scripts' );
$masonry_init = 'jQuery(function($) {
var $container = $(".masonry");
$container.imagesLoaded( function() {
$container.masonry({
columnWidth: ".masonry__item",
itemSelector: ".masonry__item"
});
});
});';
wp_add_inline_script( 'masonry-scripts', $masonry_init );
}