WordPress — Ставить скрипты в очередь, только если LT IE 9

Как условно включить в тему WordPress скрипты для ie8 и ниже? Это в первую очередь для применения полифиллов для различных функций html5/css3. Я вижу, что в wp есть переменная $is_IE, которую можно использовать как условное условие для включения только скриптов для IE. Есть ли способ добавить скрипт только для определенных версий IE, а не для всех? Это просто с некоторыми HTML, т.е. условными комментариями, но я хотел бы включить все скрипты в одно и то же место в моем файле функций.

Условное для определенных версий в HTML:

<!--[if lt IE 9]> <script src="iepolyfill.min.js"></script> <![endif]-->

Условно для всех IE в WP:

    global $is_IE;

    if ( $is_IE ) {
        wp_enqueue_script( 'iepolyfill', bloginfo('stylesheet_directory').'/js/iepolyfill.min.js' );
    }

Я осмотрелся и в основном нашел информацию об условных скриптах только для бэкэнда wp.

Какие-либо предложения?


person circlecube    schedule 19.07.2012    source источник


Ответы (7)


Поскольку wordpress — это PHP-скрипт, он может обращаться к серверной переменной через $_SERVER.

Затем вы можете выполнить поиск для обнаружения браузера с помощью PHP, PHP: если Интернет проводник 6, 7, 8 или 9

person Trinh Hoang Nhu    schedule 19.07.2012
comment
Неполный ответ. Это не касается того, как на самом деле внедрить условное выражение вокруг скрипта, используя wp_enqueue_script, предписанный способ добавления javascript в вашу тему. - person Mulan; 13.05.2014

Для WordPress 4.2+

Используйте wp_script_add_data, чтобы заключить скрипт в условный комментарий:

wp_enqueue_script( 'html5shiv', '//cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv.js' );
wp_script_add_data( 'html5shiv', 'conditional', 'lt IE 9' );

wp_enqueue_script( 'respond', get_template_directory_uri() . '/js/respond.min.js' );
wp_script_add_data( 'respond', 'conditional', 'lt IE 9' );

Просто убедитесь, что вы зарегистрировали скрипт перед вызовом wp_script_add_data (регистрация обрабатывается wp_enqueue_script выше), и что первый аргумент, который вы передаете wp_script_add_data, совпадает с первым аргументом, который вы передали при регистрации скрипта.


Для WordPress 4.1

Сегодня вы можете использовать script_loader_tag filter, чтобы ставить в очередь скрипты, заключенные в условные комментарии. Вот пример реализации:

wp_enqueue_script( 'html5shiv', '//cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv.js', array(), '3.7.2', false );
add_filter( 'script_loader_tag', function( $tag, $handle ) {
    if ( $handle === 'html5shiv' ) {
        $tag = "<!--[if lt IE 9]>$tag<![endif]-->";
    }
    return $tag;
}, 10, 2 );

И если вы хотите включить более одного скрипта таким же образом, вы можете использовать что-то вроде:

// Conditional polyfills
$conditional_scripts = array(
    'html5shiv'           => '//cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv.js',
    'html5shiv-printshiv' => '//cdn.jsdelivr.net/html5shiv/3.7.2/html5shiv-printshiv.js',
    'respond'             => '//cdn.jsdelivr.net/respond/1.4.2/respond.min.js'
);
foreach ( $conditional_scripts as $handle => $src ) {
    wp_enqueue_script( $handle, $src, array(), '', false );
}
add_filter( 'script_loader_tag', function( $tag, $handle ) use ( $conditional_scripts ) {
    if ( array_key_exists( $handle, $conditional_scripts ) ) {
        $tag = "<!--[if lt IE 9]>$tag<![endif]-->";
    }
    return $tag;
}, 10, 2 );
person Andrew Patton    schedule 25.04.2013
comment
Я нашел этот ответ через Google, так как столкнулся с той же проблемой, что и ОП. Это отличный ответ, но даже пример с использованием анонимной функции не так уж хорош, потому что вы неправильно загружаете скрипт через Wordpress. В зависимости от плагинов, которые вы используете, это может привести к проблемам, потому что, возможно, вы загружаете один и тот же сценарий дважды, поэтому всегда следите за HTML-кодом, который Wordpress фактически печатает. - person Sven; 20.09.2013
comment
Я думаю, что это нормально, но на самом деле это не лучше, чем просто жестко закодировать их в файле header.php, imo. - person Mulan; 13.05.2014
comment
@naomik Это зависит от того, как вы хотите структурировать свою тему. Если вы не используете wp_enqueue_script или wp_enqueue_style в своей теме и у вас есть только один файл header.php, то имеет смысл сгруппировать ваши script/css в header.php. Но если, например, вы используете функции постановки в очередь для управления включениями, очень полезно централизовать включения сценариев/стилей в одном месте. Такой подход этому способствует. - person Andrew Patton; 14.05.2014
comment
@BramVanroy Абсолютно. - person Andrew Patton; 10.02.2015
comment
Похоже, это будет частью 4.2! core.trac.wordpress.org/ticket/16024 - person Kyle Ridolfo; 06.03.2015
comment
Это было добавлено в 4.2? - person Neil; 14.05.2015
comment
@Neil script_loader_tag был добавлен в 4.1. Поддержка $wp_scripts->add_data( 'html5shiv', 'conditional', 'lt IE 9' ); была добавлена ​​в 4.2. - person Andrew Patton; 14.05.2015
comment
Может ли кто-нибудь сильно тупить и предоставить полный пример рабочего кода того, как я должен реализовать все, что поддерживает 4.2? - person Clarus Dignus; 23.01.2016
comment
@ClarusDignus Я добавил пример загрузки скриптов версии WP 4.2+ с условными комментариями. Это понятно или у вас остались вопросы? - person Andrew Patton; 24.01.2016
comment
@AndrewPatton Редактирование ясно и понятно. Спасибо, что нашли время применить правку. - person Clarus Dignus; 24.01.2016

  • Вы должны использовать wp_register_script() всякий раз, когда добавляете скрипты в свои темы или плагины WP.
  • Обнюхивание на стороне сервера, как правило, плохая идея, потому что это ненадежно.
  • Обычно вы хотите настроить таргетинг на браузеры, в которых отсутствуют определенные функции, не обязательно только на браузер IE. Modernzr — хороший скрипт для этого.

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

global $wp_scripts;
wp_register_script( 
    'html5shiv', 
    get_bloginfo('template_url').'/assets/js/html5shiv.js', 
    array(), 
    '3.6.2'
    );
$wp_scripts->add_data( 'html5shiv', 'conditional', 'lt IE 9' );
person Mikael Korpela    schedule 16.01.2013
comment
Это работает только для $wp_styles. Связанный билет: #16024. - person brasofilo; 21.09.2013
comment
Да, это не работает. Проверьте исходный вывод. Никаких условных комментариев вокруг скриптов. - person Mulan; 13.05.2014
comment
Извините перед Микаэлем, но за это действительно нужно проголосовать, чтобы люди не думали, что это работоспособное решение. - person MatthewLee; 28.10.2014
comment
Аннннддд… наконец-то это будет работать в WP 4.2! core.trac.wordpress.org/ticket/16024 - person Andrew Patton; 26.02.2015

Решение для WordPress 4.2 и выше

Правильным способом было бы применить wp_enqueue_script, поскольку здесь используется JavaScript, а не стили css. Кроме того, лучше использовать get_bloginfo('stylesheet_url'), чтобы убедиться, что это также работает в дочерних темах.

/**
 * IE Fallbacks
 */

function load_IE_fallback() {
    wp_register_script( 'ie_html5shiv', get_bloginfo('stylesheet_url'). '/js/html5shiv.min.js', __FILE__, false, '3.7.2' );
    wp_enqueue_script( 'ie_html5shiv');
    wp_script_add_data( 'ie_html5shiv', 'conditional', 'lt IE 9' );

    wp_register_script( 'ie_respond', get_bloginfo('stylesheet_url'). '/js/respond.min.js', __FILE__, false, '1.4.2' );
    wp_enqueue_script( 'ie_respond');
    wp_script_add_data( 'ie_respond', 'conditional', 'lt IE 9' );
}
add_action( 'wp_enqueue_scripts', 'load_IE_fallback' ); 
person Daniel Klose    schedule 11.06.2015
comment
Я сам собирался добавить то же самое, но вижу, вы уже это сделали. Я тестировал это, и у меня это работает с get_template_directory_uri().'/js/lib/excanvas.js' в файле functions.php моей темы. - person vahanpwns; 31.07.2015
comment
Спасибо за этот ответ. Ничто меня не раздражает больше, чем когда спрашивающий находит ответ, но не удосуживается объяснить его другим. - person Clarus Dignus; 23.01.2016

Обновление для WordPress 4.7.3 с загрузкой скриптов из CDN:

    add_action( 'wp_enqueue_scripts', 'load_IE_fallback' );
function load_IE_fallback() {
    wp_register_script( 'ie_html5shiv', 'https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js', '', '3.7.3', false );
    wp_register_script( 'ie_respond', 'https://oss.maxcdn.com/respond/1.4.2/respond.min.js', '', '1.4.2', false );

    wp_enqueue_script( 'ie_html5shiv');
    wp_enqueue_script( 'ie_respond');

    wp_script_add_data( 'ie_html5shiv', 'conditional', 'lt IE 9' );    
    wp_script_add_data( 'ie_respond', 'conditional', 'lt IE 9' );
}
person Masimba Rodgers    schedule 26.03.2017

Лучший способ сделать это — поставить скрипты в очередь, а затем использовать wp_style_add_data() для добавления условия. Этот метод используется официальными темами, такими как двадцать тринадцать

Есть ответ, похожий на этот, но он добавляет дополнительный, если условие неверно.

wp_register_style( 'ie_html5shiv', get_template_directory_uri() . '/js/html5shiv.js' );
    wp_enqueue_style( 'ie_html5shiv');
    wp_style_add_data( 'ie_html5shiv', 'conditional', 'lt IE 9' );

    wp_register_style( 'ie_respond', get_template_directory_uri() . '/js/respond.min.js' );
    wp_enqueue_style( 'ie_respond');
    wp_style_add_data( 'ie_respond', 'conditional', 'lt IE 9' );
person Ahmad Awais    schedule 27.02.2015
comment
Хороший улов. Вы можете предложить изменение или прокомментировать аналогичный ответ для такого небольшого изменения. - person Bryan Willis; 10.01.2016

Попробуйте использовать функцию wp_style_add_data() (официально используется в двадцать тринадцать и twentyfourteen:

wp_enqueue_style( 'iepolyfill', bloginfo( 'stylesheet_directory' ) . '/js/iepolyfill.min.js' );
wp_style_add_data( 'iepolyfill', 'conditional', 'if lt IE 9' );

Обновление: начиная с версии WordPress >= 4.2.0 есть функция, которая используется таким же образом. Это называется:

wp_script_add_data()
person Flow    schedule 11.08.2014
comment
Вы подтвердили отсутствие непреднамеренных или негативных последствий использования логики wp_style для добавления JavaScript? Добавляет ли он файл как элемент <script>, а не как элемент <link>? - person Andrew Patton; 03.09.2014
comment
Этот код генерирует HTML для включения файла CSS, а не Javascript. - person Maxime; 28.12.2014