Почему wp_register_style() важен, когда я использую полный wp_enqueue_style()?

25 нояб. 2013 г., 08:29:18
Просмотры: 30.3K
Голосов: 24

В настоящее время я работаю над темой и подключаю некоторые стили и скрипты. При подключении скриптов я сначала использовал 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()?

0
Все ответы на вопрос 1
4
41

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

Основное отличие между функциями 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 можно использовать в теле страницы (типичное использование — в шорткоде), и скрипт будет помещён в подвал.

25 нояб. 2013 г. 13:31:25
Комментарии

Отличный ответ, G.M. - очень тщательно и всесторонне рассмотрел вопрос. Браво за ваши усилия. :)

Mayeenul Islam Mayeenul Islam
25 нояб. 2013 г. 13:38:36

Спасибо @MayeenulIslam, я начал отвечать до того, как toscho пометил вопрос как дубликат. Рад, что ответ оказался полезным для вас, надеюсь, он поможет и другим :)

gmazzap gmazzap
25 нояб. 2013 г. 13:48:29

@gmazzap Невероятно полезный ответ! Искал информацию по wp_register_style vs wp_enqueue_style, и ваш ответ помог мне полностью разобраться в вопросе.

lowtechsun lowtechsun
15 нояб. 2016 г. 20:13:41

Отличный ответ, спасибо.

EmSixTeen EmSixTeen
2 дек. 2020 г. 20:41:50