Подтвердить что ты не робот

WordPress - Скрипты Enqueue только для LT IE 9

В теме WordPress, как вы условно включаете скрипты для ie8 и ниже? Это прежде всего применение полиполнений для различных функций html5/css3. Я вижу, что wp имеет переменную $is_IE, которая может использоваться как условная, чтобы включать только сценарии для IE. Есть ли способ добавить script только для определенных версий 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-сервера.

Любые предложения?

4b9b3361

Ответ 1

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

Затем вы можете искать обнаружение браузера с PHP, PHP: если Internet Explorer 6, 7, 8 или 9

Ответ 2

Для WordPress 4.2 +

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

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' );

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


Для 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 );

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

// 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 );

Ответ 3

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

Для IE условные теги работают очень хорошо. Здесь вы можете добавить условные теги в script, например, для 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' );

Ответ 4

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

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

/**
 * 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' ); 

Ответ 5

Обновление для 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' );
}

Ответ 6

Лучший способ сделать это - вставить сценарии в очередь, а затем использовать 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' );

Ответ 7

Это причудливый кошмар. Я просто хочу поспать сегодня вечером, хорошо?

Это не работает

$wp_styles->add_data("foo", "conditional", "lt IE 9"); 

Учитывая все остальное, предлагаемое здесь, это просто взломать, я закончил их hardcoding в моем шаблоне.

header.php

<head>
  <!-- ... -->

  <!--[if lt IE 9]>
    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7/html5shiv.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/es5-shim/2.3.0/es5-shim.js"></script>
  <![endif]-->

  <?php wp_head(); ?>
</head>

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

Ответ 8

Попробуйте использовать функцию wp_style_add_data() (официально используемую в twentythirteen и 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()