Если вы пишите WordPress-плагин, который использует шорткоды и для его работы необходим какой-то JavaScript-файл, то у вас возникает соблазн подключить его через хук wp_enqueue_scripts. Поясню, почему так делать не стоит.
Обычный способ
function mihdan_wp_enqueue_scripts() {
wp_enqueue_script( 'script-name', plugins_url( '/js/script.js' , __FILE__ ), array(), '1.0.0', false );
}
add_action( 'wp_enqueue_scripts', 'mihdan_wp_enqueue_scripts' );
С первого взгляда всё работает идеально и соответствует кодексу, но данный пример можно использовать только на этапе разработки, так как ваш JavaScript-файл загружается абсолютно на всех страницах, даже там, где он не нужен и где нет шорткода от плагина.
Это очень неэффективно с точки зрения оптимизации загрузки сайта.
Этот код можно немного оптимизировать, если обернуть его в условные теги и подключать, например, только на страницах архивов:
function mihdan_wp_enqueue_scripts() {
if ( is_archive() ) {
wp_enqueue_script( 'script-name', plugins_url( '/js/script.js' , __FILE__ ), array(), '1.0.0', false );
}
}
add_action( 'wp_enqueue_scripts', 'mihdan_wp_enqueue_scripts' );
Уже лучше, но, всё-равно, скрипт подключается на страницах, где нет вашего шорткода.
Сенсейский метод
Суть его заключается в том, чтобы зарегистрировать ваш JavaScript-файл при возникновении события wp_enqueue_scripts, а подключить только внутри вашего шорткода.
Для начала зарегистрируйте ваш JavaScript-файл без подключения через wp_register_script():
function mihdan_wp_enqueue_scripts() {
wp_register_script( 'script-name', plugins_url( '/js/script.js' , __FILE__ ), array(), '1.0.0', true );
}
add_action( 'wp_enqueue_scripts', 'mihdan_wp_enqueue_scripts' );
Этим вы дадите знать ядру WordPress о существовании вашего файла, но он не будет загружен на страницу.
Последний параметр true в функции wp_register_script() даёт указание движку вставлять ваш файл в подвал сайта, а не его шапку, как это сделано по-умолчанию.
Следующим шагом будет подключение вашего скрипта по требованию, то есть прямо внутри шорткода:
function mihdan_shortcode( $atts ) {
// Код вашего шорткода
...
// Подключение вашего скрипта по требованию
wp_enqueue_script( 'script-name' );
}
add_shortcode( 'mihdan_shortcode', 'mihdan_shortcode' );
Получается, что скрипт подключается в футер только на тех страницах, где он реально необходим и только, если на этих страницах есть ваш шорткод, профит.
Если вам надо, чтобы скрипты в обязательном порядке загрузились в <header>, то этот способ не для вас, так как при данном подходе скрипты убегут в футер.
Ссылки
- По мотивам Sensible script enqueuing for shortcodes
Источник: https://www.kobzarev.com/wordpress/sensible-script-enqueuing-shortcodes/