Особенности подключения JS скриптов в WordPress

Владимир | | JavaScript, PHP, Web разработка, WordPress.

wordpress scripts

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

Один из таких примеров – подключение JavaScript кода в WordPress.

Этот движок предоставляет удобную функцию wp_enqueue_script. С её помощью можно обеспечить необходимый порядок подключения скриптов и, при этом, гарантируется, что один и тот же скрипт будет подключён только один раз.

Кстати, аналогичные возможности есть и в различных фреймворках, например, Yii.

Но разница между фреймворком и WordPress в том, что с помощью последнего можно создать сайт, не читая документацию, во всяком случае, ту часть, которая касается API. В этом нет ничего плохого, но можно столкнуться с некоторыми нюансами. О них речь пойдет ниже.

Основные проблемы и причины их появления


Возьмем самую распространённую ситуацию. Есть сайт на WP, и есть готовый JS скрипт, который нужно к этому сайту подключить.

Что написано в инструкции по установке скрипта?

«Вставьте тег <script…> в заголовок страницы (между <head> и </head>)».

Тут все правильно. Разработчик пишет инструкцию на общий случай, а не конкретно под WP.

Следующий вопрос. Где находятся теги <head> и </head> в WP?

Обычно в файле header.php текущей темы.

Т.е. если делать строго по инструкции, то нужно добавить теги <script…> в header.php.

Именно здесь и возникают проблемы.

Точнее, если ваш JS скрипт не зависит ни от каких библиотек, и не используется никакими плагинами, то всё будет в порядке, но в противном случае ситуация сложнее.

Проблема 1. Многократная загрузка JS файлов.

Возникает если подключить JS скрипт в файле темы, а затем использовать плагин, которому нужен этот же скрипт. Чаще всего такое происходит с JavaScript библиотеками.

Разработчики плагинов доступа к файлам вашей темы не имеют, но должны гарантировать подключение необходимых скриптов. Поэтому для них единственным вариантом будет использование wp_enqueue_script.

В результате один раз JavaScript файл подключается вашим тегом, второй – тегом, который добавит плагин. Это приводит к увеличению веса страницы, времени её загрузки, росту трафика сервера.

Проблема 2. «Неработающие» плагины.

Вытекает из первой.

Рассмотрим небольшой пример. Допустим скрипты подключены в header.php следующим образом.

<head>
	...
	<script src="...jquery.js" ...></script>
	<script src="...jquery.my-plugin.js" ...></script>
	<?php wp_head(); ?>
</head>

Что произойдет если какой-то из плагинов WP подключит jQuery?

Функция wp_enqueue_script добавит теги script там, где находится вызов wp_head(). А это, помимо повторной загрузки jquery, означает, что и объект jQuery будет создан заново. И он будет использоваться вместо первого объекта, к которому подключили плагин.

В принципе, проблему можно решить так.

<head>
	...
	<?php wp_head(); ?>
	<script src="...jquery.my-plugin.js" ...></script>
</head>

Но если вы в админке WP отключите плагин, который использует jQuery, то my-plugin.js также перестанет работать. Т.к. jQuery будет не подключена.

Как избежать этих проблем?

Просто не трогайте header.php. В папке с темой есть файл functions.php в который нужно добавить следующий код.

<?php
if ( !is_admin() ) {
	function register_my_js() {
		wp_enqueue_script( 'my-script', get_bloginfo( 'template_directory' ).'/my-script.js', array( 'jquery' ), '1.0', true );
	}
	add_action('init', 'register_my_js');
}
?>

Этот код подключит скрипт на всех страницах сайта, кроме админки. Если нужно подключать скрипт только на части страниц, можно в условие проверки добавить is_single(), is_home() и т.д.

Кроме того, библиотеку jQuery явно подключать не нужно, т.к. она указана в массиве зависимостей (третий параметр wp_enqueue_script). WordPress подключит её сам до вашего плагина.

Для справки

Функция wp_enqueue_script подключает JS файл если он не был подключен ранее. Т.е. можно вызвать её несколько раз для одного и того же скрипта и, при этом, скрипт будет вставлен только один раз.

Параметры.

wp_enqueue_script( $handle, $src, $deps, $ver, $in_footer );

$handle – название скрипта, должно быть уникальным.

$src – URL скрипта. Если скрипт был предварительно зарегистрирован с помощью wp_register_script, то его указывать не обязательно.

$deps – массив зависимостей (нужно перечислить названия JS скриптов, которые должны быть загружены перед данным).

$ver – версия скрипта (необязательный).

$in_footer – если равен true, скрипт будет подключен в конце страницы, там где находится wp_footer(). Обычно в файле footer.php перед </body>.

Заключение

Очень советую почитать статью Function Reference/wp enqueue script. Она небольшая, но в ней вы найдёте несколько интересных примеров. Например, объясняющих как заменить версию библиотеки jQuery, которая идёт в дистрибутиве WP.

Интересное в сети.

Возможно, самый оригинальный подарок:фруктовые корзины с доставкой по Москве.

Технология кейс-стади: отлично работает при продаже услуг.