Почему wp_register_style() важен, когда я использую полный wp_enqueue_style()?
В настоящее время я работаю над темой и подключаю некоторые стили и скрипты. При подключении скриптов я сначала использовал wp_register_script(), а затем подключал их с помощью wp_enqueue_script() - потому что я понял, что это правильный способ подключения скриптов. Но при подключении стилей я использовал только wp_enqueue_style() со всеми его параметрами. Однако только что я получил ответ от s_ha_dum, говорящий, что использование wp_register_style() сделает тему дружественной к дочерним темам - я задаюсь вопросом, без wp_register_style() я использую только wp_enqueue_style(), и моя тема отлично работает с подключенными стилями. Я подключил их так:
add_action( 'wp_enqueue_scripts', 'wpse20131025_styles' );
function wpse20131025_styles(){
// Подключаем основные стили сайта
wp_enqueue_style( 'site-styles', get_template_directory_uri() . '/style.css', '', '', 'screen' );
// Подключаем стили меню для больших экранов
wp_enqueue_style( 'menu-styles', get_template_directory_uri() . '/css/menu.css', '', '', 'screen and (min-device-width: 800px)' );
// Подключаем стили мобильного меню
wp_enqueue_style( 'mobile-menu-styles', get_template_directory_uri() . '/css/mobile-menu.css', '', '', 'screen and (max-device-width: 799px)' );
}
Если wp_enqueue_style() имеет все параметры, которые присутствуют в wp_register_style() ($handle, $src, $deps, $ver, $media), тогда зачем мне их повторять? Или в чем именно заключается цель wp_register_style() помимо wp_enqueue_style()?
Прежде всего, скажем, что в отношении этих функций то, что справедливо для стилей, в точности справедливо и для скриптов, но есть некоторые исключения, о которых будет рассказано далее.
Основное отличие между функциями wp_enqueue_* и соответствующими wp_register_* заключается в том, что первые добавляют скрипты/стили в очередь, а вторые подготавливают скрипты/стили к добавлению.
Возможно, вы уже знаете, но есть и второе отличие: wp_register_* можно использовать в любом хуке, даже в раннем, таком как init, а wp_enqueue_* следует использовать на хуке wp_enqueue_scripts (или admin_enqueue_scripts для админки) 1.
Типичный сценарий использования обеих функций — когда вы хотите зарегистрировать скрипты/стили при инициализации темы, а затем условно подключать их на определённых страницах, например:
add_action('init', 'my_register_styles');
function my_register_styles() {
wp_register_style( 'style1', get_template_directory_uri() . '/style1.css' );
wp_register_style( 'style2', get_template_directory_uri() . '/style2.css' );
wp_register_style( 'style3', get_template_directory_uri() . '/style3.css' );
}
add_action( 'wp_enqueue_scripts', 'my_enqueue_styles' );
function my_enqueue_styles() {
if ( is_front_page() ) {
wp_enqueue_style( 'style3' );
} elseif ( is_page_template( 'special.php' ) ) {
wp_enqueue_style( 'style1' );
wp_enqueue_style( 'style2' );
} else {
wp_enqueue_style( 'style1' );
}
}
Таким образом условное подключение становится более читаемым и менее многословным.
Кроме того, если вы хотите подключить один или несколько зарегистрированных стилей/скриптов также в админке, вы можете использовать зарегистрированный handle в функции, подключённой к хуку admin_enqueue_scripts, без необходимости снова передавать все параметры.
Конечно, это более полезно для скриптов, благодаря wp_localize_script, который в данном сценарии можно вызвать один раз после регистрации скрипта, а затем при условном подключении просто вызывать скрипт, даже если он используется несколько раз: это делает код проще и соответствует принципу DRY.
Когда вы регистрируете скрипт/стиль и сразу же подключаете его, это просто лишняя операция, которую можно полностью избежать:
wp_register_style( 'style1', get_template_directory_uri() . '/style1.css' );
wp_enqueue_style( 'style1' );
Нет никакого преимущества в подключении стиля (или скрипта) таким образом, просто используйте wp_enqueue_style со всеми параметрами, и дело сделано.
Предыдущее утверждение также верно в отношении дружелюбия к дочерним темам. Чтобы переопределить стиль в дочерней теме, когда родительская тема использует wp_register_style с последующим wp_enqueue_style, вам придётся отменить регистрацию стиля и зарегистрировать его снова с другим URL. Если родительская тема использует только wp_enqueue_style, в дочерней теме можно использовать wp_dequeue_style и подключить новый стиль, так что в обоих случаях в дочерней теме потребуется 2 строки кода.
Однако, что действительно дружелюбно к дочерним темам — это оборачивание функций, которые подключают и/или регистрируют стили и скрипты, в условие if ( ! function_exists( ... Таким образом, дочерняя тема может переопределить стили и скрипты родительской темы в одном месте:
if ( ! function_exists( 'my_register_styles' ) ) {
function my_register_styles() {
wp_register_style( 'style1', get_template_directory_uri() . '/style1.css' );
wp_register_style( 'style2', get_template_directory_uri() . '/style2.css' );
wp_register_style( 'style3', get_template_directory_uri() . '/style3.css' );
}
}
if ( ! function_exists( 'my_enqueue_styles ') ) {
function my_enqueue_styles() {
if ( is_front_page() ) {
wp_enqueue_style( 'style3' );
} elseif ( is_page_template( 'special.php' ) ) {
wp_enqueue_style( 'style1' );
wp_enqueue_style( 'style2' );
} else {
wp_enqueue_style( 'style1' );
}
}
}
Теперь в дочерней теме можно написать другую функцию my_register_styles и/или my_enqueue_styles и изменить все стили (если нужно, конечно) без необходимости отменять регистрацию/подключение стилей по одному.
1 Вот ещё одно отличие скриптов от стилей: wp_enqueue_script можно использовать в теле страницы (типичное использование — в шорткоде), и скрипт будет помещён в подвал.
Отличный ответ, G.M. - очень тщательно и всесторонне рассмотрел вопрос. Браво за ваши усилия. :)
Mayeenul Islam
Спасибо @MayeenulIslam, я начал отвечать до того, как toscho пометил вопрос как дубликат. Рад, что ответ оказался полезным для вас, надеюсь, он поможет и другим :)
gmazzap
@gmazzap Невероятно полезный ответ! Искал информацию по wp_register_style vs wp_enqueue_style, и ваш ответ помог мне полностью разобраться в вопросе.
lowtechsun