Регистрировать и ставить в очередь условные (специфичные для браузера) файлы javascript?

8

WP.SE сообщество всегда рекомендуется использовать wp_register_scriptи wp_enqueue_scriptдля добавления сценариев в тему / шаблон (а также, wp_register_styleи wp_enqueue_styleдля таблиц стилей).


Вот так я регистрирую и ставлю в очередь свои скрипты ...

Сначала я добавляю что-то вроде этого в functions.php

add_action('init','wpse54189_register_script');
function wpse54189_register_script(){

    //Register scripts
    wp_enqueue_script( 'jquery' );
    wp_register_script( 'aahan_bootstrap_transition', get_template_directory_uri().'/js/bootstrap-transition.js');
    wp_register_script( 'aahan_bootstrap_carousel', get_template_directory_uri().'/js/bootstrap-carousel.js', array('aahan_bootstrap_transition'));    
    wp_register_script( 'wpse54189_ajax_comment', get_template_directory_uri().'/js/no-reload-comments.js');
}

затем вызвать его в файле шаблона (скажем, header.php), как это

<?php wp_enqueue_script( 'aahan_bootstrap_carousel' ); ?>
<?php wp_enqueue_script( 'wpse54189_ajax_comment' ); ?>

А теперь, если перейти к вопросу, как мне зарегистрировать и поставить в очередь «условные файлы JavaScript», которые должны распознаваться определенными браузерами? Например:

<!--[if lt IE 9]>
<script src="<?php echo get_template_directory_uri(); ?>/js/html5.js" type="text/javascript"></script>
<![endif]-->

Как мне зарегистрироваться и поставить в очередь это правильно?

PS: я использую тему Reddle , разработанную специалистами по теме в Automattic. И в header.php темы непосредственно используется только что упомянутый код, то есть он не помещен в очередь. Так значит ли это, что это единственный способ сделать это?

это я
источник
Хотя ему почти год, этот же вопрос задавался и раньше . Я не сталкивался с этим, когда искал раньше.
its_me

Ответы:

13

WP_Scriptsи WP_Stylesклассы позади wp_enqueue_scriptи wp_enqueue_styleфункции. Если вы посмотрите на реализацию классов ( скрипты и стили ), то увидите, что WP_Scriptsкласс не поддерживает никаких условных скриптов, но! Вы можете видеть, что WP_Stylesделает! Проблема в том, что wp_enqueue_styleне позволяет настроить условие.

Итак, мы должны сделать небольшой взлом:

add_filter( 'wp_enqueue_scripts', 'wpse2345_enqueue_scripts' );
function wpse2345_enqueue_scripts() {
    wp_enqueue_style( 'mystyle', 'url/of/my/style.css', array(), '1.0.0' );

    global $wp_styles;
    $wp_styles->registered['mystyle']->add_data( 'conditional', 'lt IE 9' );
}

Такой взлом становится возможным, потому что все зарегистрированные стили хранятся в registeredполе WP_Stylesкласса. Каждый из зарегистрированных стилей является объектом _WP_Dependencyкласса, который позволяет добавлять дополнительные данные.

К сожалению, этот хак не работает для скриптов.

Дополнительная информация: вчера
я на самом деле просматривал код в «Сущности темы» Аарона Кэмпбелла и заметил, что он вызывал условный скрипт и стиль браузера.

/**
 * @var WP_Scripts
 */
global $wp_scripts;
// Conditionally load this only for IE < 9
$wp_scripts->add_data( 'html5', 'conditional', 'lt IE 9' );

/**
 * @var WP_Styles
 */
global $wp_styles;
// Conditionally load this only for IE < 8
$wp_styles->add_data( 'blueprint-ie', 'conditional', 'lt IE 8' );

Существует также билет и патч, но он еще не в ядре . Очевидно, что условный скрипт не будет работать без патча, но следует отметить, что вы можете использовать метод add_data непосредственно внутри своей функции, которая присоединена к wp_enqueue_scriptsдействию.

Евгений Мануйлов
источник
1
Unfortunately this hack is not working for scripts.Ох ... это отстой! Похоже, единственный путь - это так. Кстати, спасибо за взлом. :)
its_me
Похоже, у нас есть условные скрипты, начиная с 4.2 core.trac.wordpress.org/changeset/31223
lkraav