【问题标题】:WordPress - Enqueue scripts for only if LT IE 9WordPress - 仅当 LT IE 9 时才将脚本排入队列
【发布时间】:2012-07-18 19:58:52
【问题描述】:

在 WordPress 主题中,如何有条件地包含 ie8 及以下版本的脚本?这主要是为各种 html5/css3 功能应用 polyfill。我看到 wp 有 $is_IE 变量,它可以用作仅包含 IE 脚本的条件。有没有办法只为某些版本的 IE 而不是所有版本添加脚本?这对于一些 HTML 即条件 cmets 来说很简单,但我想将脚本全部包含在我的函数文件中的同一个位置。

HTML 中特定版本的条件:

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

WP 中所有 IE 的条件:

    global $is_IE;

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

我环顾四周,主要是找到有关 wp 后端条件脚本的详细信息。

有什么建议吗?

【问题讨论】:

    标签: php javascript wordpress internet-explorer polyfills


    【解决方案1】:

    适用于 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 将包含在条件 cmets 中的脚本排入队列。这是一个示例实现:

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

    【讨论】:

    • 我通过谷歌找到了这个答案,因为我面临与 OP 相同的问题。这是一个很好的答案,但即使使用匿名函数的示例也不是很好,因为您没有通过 Wordpress 正确加载脚本。根据您使用的插件,这可能会导致问题,因为您可能会两次加载相同的脚本,因此请始终关注 Wordpress 实际打印的 HTML。
    • 我认为这还可以,但实际上并不比在 header.php 文件中硬编码更好,imo。
    • 看起来这将成为 4.2 的一部分! core.trac.wordpress.org/ticket/16024
    • 这是在 4.2 中添加的吗?
    • @ClarusDignus 我添加了一个使用条件 cmets 加载脚本的 WP 4.2+ 版本的示例。这是否清楚,还是您仍有疑问?
    【解决方案2】:
    • 每当您将脚本添加到您的 WP 主题或插件时,您都应该使用 wp_register_script()
    • 服务器端嗅探通常是个坏主意,因为它不确定。
    • 通常您希望针对缺乏某些功能的浏览器,不一定只有 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' );
    

    【讨论】:

    • 这仅适用于$wp_styles。相关票证:#16024.
    • 是的,但这不起作用。检查源输出。脚本周围没有条件注释。
    • 对 Mikael 感到抱歉,但这确实需要被否决,所以人们认为这不是一个可行的解决方案。
    • Aannnnddd... 这终于可以在 WP 4.2 中使用了! core.trac.wordpress.org/ticket/16024
    【解决方案3】:

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

    【讨论】:

    • 我正要自己添加完全相同的东西,但我看到你已经完成了。我已经对此进行了测试,它适用于我的主题 functions.php 中的 get_template_directory_uri().'/js/lib/excanvas.js'
    • 感谢您提供此答案。没有什么比提问者找到答案但懒得为其他人分解更让我恼火的了。
    【解决方案4】:

    从 CDN 加载脚本的 WordPress 4.7.3 更新:

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

    【讨论】:

      【解决方案5】:

      最好的方法是将脚本排入队列,然后使用 wp_style_add_data() 放置条件。这种方法正在被twenty thirteen等官方主题使用

      有一个与此类似的答案,但如果条件错误,他会添加额外内容。

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

      【讨论】:

      • 好收获。您可以针对如此小的更改提出更改或评论类似的答案。
      【解决方案6】:

      由于wordpress是一个PHP脚本,它可以通过$_SERVER访问服务器变量

      然后就可以用PHP搜索检测浏览器了,PHP: If internet explorer 6, 7, 8 , or 9

      【讨论】:

      • 答案不完整。这没有解决如何使用 wp_enqueue_script 实际在脚本周围注入条件,这是将 javascript 添加到主题的规定方式。
      【解决方案7】:

      尝试使用wp_style_add_data()函数(官方在twentythirteentwentyfourteen主题中使用:

      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()
      

      【讨论】:

      • 您是否确认使用wp_style 逻辑添加JavaScript 不会产生意外或负面后果?是否将文件添加为&lt;script&gt; 元素而不是&lt;link&gt; 元素?
      • 此代码生成 HTML 以包含 CSS 文件,而不是 Javascript。
      猜你喜欢
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      相关资源
      最近更新 更多