如何为wp_Register_style添加交叉配准和完整性?(字体令人敬畏5)

时间:2018-10-18 作者:Pipo

我正在将Font Awesome 4升级到版本5,该版本在<link rel="stylesheet"> 加成

目前,我正在使用:

wp_register_style(\'FontAwesome\', \'https://example.com/font-awesome.min.css\', array(), null, \'all\' );
wp_enqueue_style(\'FontAwesome\');
输出为:

<link rel="stylesheet" id="FontAwesome-css" href="https://example.com/font-awesome.min.css" type="text/css" media="all" />
通过Font Aweome 5,它引入了两个新的属性和值(integritycrossorigin) e、 g:

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
因此,我需要找出如何将完整性和交叉源添加到wp\\u register\\u样式中,我已经尝试使用wp_style_add_data 如果失败,则此方法似乎只支持conditional, rtlsuffix, alttitle.

2 个回复
最合适的回答,由SO网友:Remzi Cavdar 整理而成

style_loader_taghttps://developer.wordpress.org/reference/hooks/style_loader_tag/

apply_filters( \'style_loader_tag\', $html, $handle, $href, $media )
过滤排队样式的HTML链接标记。


首先将样式表排队,请参阅文档:https://developer.wordpress.org/reference/functions/wp_enqueue_style/

wp_enqueue_style( \'font-awesome-5\', \'https://use.fontawesome.com/releases/v5.5.0/css/all.css\', array(), null );
The$handle\'font-awesome-5\'<我知道null 所以没有版本号。这样它就会被缓存

Simple str_replace
一个简单的str\\u替换就足以实现您想要的,请参见下面的示例

function add_font_awesome_5_cdn_attributes( $html, $handle ) {
    if ( \'font-awesome-5\' === $handle ) {
        return str_replace( "media=\'all\'", "media=\'all\' integrity=\'sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU\' crossorigin=\'anonymous\'", $html );
    }
    return $html;
}
add_filter( \'style_loader_tag\', \'add_font_awesome_5_cdn_attributes\', 10, 2 );

Add different atributes
下面是一个向(多个)不同样式表添加不同属性的示例

function add_style_attributes( $html, $handle ) {

    if ( \'font-awesome-5\' === $handle ) {
        return str_replace( "media=\'all\'", "media=\'all\' integrity=\'sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU\' crossorigin=\'anonymous\'", $html );
    }

    if ( \'another-style\' === $handle ) {
        return str_replace( "media=\'all\'", "media=\'all\' integrity=\'blajbsf\' example", $html );
    }

    if ( \'bootstrap-css\' === $handle ) {
        return str_replace( "media=\'all\'", "media=\'all\' integrity=\'something-different\' crossorigin=\'anonymous\'", $html );
    }

    return $html;
}
add_filter( \'style_loader_tag\', \'add_style_attributes\', 10, 2 );

Add attributes to all styles
下面是一个向多个样式表添加相同属性的示例

function add_attributes_to_all_styles( $html, $handle ) {

        // add style handles to the array below
        $styles = array(
            \'font-awesome-5\',
            \'another-style\',
            \'bootstrap-css\'
        );

        foreach ( $styles as $style ) {
            if ( $style === $handle ) {
                return str_replace( "media=\'all\'", "media=\'all\' integrity=\'sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU\' crossorigin=\'anonymous\'", $html );
            }
        }

        return $html;
}
add_filter( \'style_loader_tag\', \'add_attributes_to_all_styles\', 10, 2 );



script_loader_tag
我还想解释script\\u loader\\u标记,因为这也很方便,但此API与wp_enqueue_script.

script\\u loader\\u tag API几乎相同,只有一些小的区别,请参阅文档:https://developer.wordpress.org/reference/hooks/script_loader_tag/

apply_filters( \'script_loader_tag\', $tag, $handle, $src )
过滤排队脚本的HTML脚本标记。


下面是一个延迟单个脚本的示例

function add_defer_jquery( $tag, $handle ) {
    if ( \'jquery\' === $handle ) {
        return str_replace( "src", "defer src", $tag );
    }
    return $tag;
}
add_filter( \'script_loader_tag\', \'add_defer_jquery\', 10, 2 );
下面是一个延迟多个脚本的示例

function add_defer_attribute( $tag, $handle ) {

    // add script handles to the array below
    $scripts_to_defer = array(
        \'jquery\',
        \'jquery-migrate\',
        \'bootstrap-bundle-js\'
    );

    foreach ( $scripts_to_defer as $defer_script ) {
        if ( $defer_script === $handle ) {
            return str_replace( "src", "defer src", $tag );
        }
    }

    return $tag;
}
add_filter( \'script_loader_tag\', \'add_defer_attribute\', 10, 2 );
所以我已经解释了两个APIstyle_loader_tagscript_loader_tag. 我给了两个API的一些例子,我希望这对很多人都有用。我对这两种API都有经验

UPDATE
@CKMacLeod感谢您的更新,这澄清了问题。我们基本上意见一致。正如我所说,我是WordPress开发人员,如果你想在https://wordpress.org 你基本上被迫遵守“WordPress Coding Standards“或者他们会简单地拒绝你的主题和/或插件。这就是为什么我鼓励开发人员使用“WordPress方式”“。我知道有时候没有什么不同,但也很方便。正如你自己所说,你可以下载Font Awesome并将其包含在主题和/或插件中,这样你只需删除style\\u loader\\u标记函数并修改wp\\u enqueue\\u样式函数。

还有最后一件事,在过去(5年前)一些缓存、组合和缩小插件都不起作用,大多数时候,我会发现为什么那些制作主题的开发人员只是简单地把东西放在主题的头部和/或附和它们。大多数缓存插件(大多数时候)也提供组合、缩小和延迟脚本执行的选项,它们在检测错误代码和处理错误代码方面变得更聪明、更好。但这不是首选。这就是为什么我鼓励人们在编写代码时牢记标准/惯例

作为一名开发人员,您始终需要考虑人们可以对您的代码做些什么,并考虑到兼容性。因此,不是简单的解决方案,而是最佳的解决方案。我希望我已经澄清了我的观点。

EDIT
@CKMacLeod感谢您的(技术)辩论,我希望您认识到这是多么重要(在您自己的开发中使用WordPress API)。同样,我一直在四处寻找,即使是现在,如果我查看最受欢迎的minify插件的常见问题,我通常会看到这样或那样的情况,例如:

Question: 为什么一些CSS和JS文件没有合并
Answer: 该插件仅处理使用官方WordPress API方法排队的JS和CSS文件–https://developer.wordpress.org/themes/basics/including-css-javascript/ -以及来自同一域的文件(除非在设置中指定)。

请参阅常见问题:https://wordpress.org/plugins/fast-velocity-minify/

SO网友:CK MacLeod

@Remzi Cavdar对script\\u和style\\u loader\\u标记的评论很有趣,但是,冒着引发一些愤怒的风险,希望有人能提醒我在这种情况下使用WP队列的好处,我建议采取简单的方法,通过钩子加载Fontawesome的样式表。

/* ADD FONTAWESOME 5.5.0 via action hook */
add_action( \'wp_head\', \'sewpd_add_fontawesome\' );

function sewpd_add_fontawesome() {

echo \'
<!--FONTAWESOME 5.5.0 added via functions.php -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
<!--END FONTAWESOME -->
\'; 

}
有些人甚至可能会争辩说,如果你只对主题页脚或帖子中的一些图标使用FA,你应该将其添加到页面正文的下方,因为这样它就不会出现渲染阻塞,但我承认我从来没有这样做过。。。我不建议将其直接添加到标题中。php或其他模板文件。那就错了

UPDATE

Remzi Cavdar很友好地回复了我的请求,提醒我为什么仅仅通过wp\\u head()钩子添加Fontawesome或类似的标记可能不如使用WordPress队列。他通常提到最佳实践的概念,更具体地说,缓存插件可能需要能够通过队列访问样式表。

在我详细讨论之前,我要说,虽然我实际上不知道有什么重要的特殊理由,但这是一种“WordPress方式”,我喜欢卡夫达尔同志的方法,将来可能会自己使用它。

然而,他的其他主张对我来说没有说服力。也许他或其他人可以加入其中。如果是这样,我洗耳恭听。一句话,据我所知,在Pingdom和GTMetrix上运行了20多个测试,比较了测试博客上的“通过队列添加”和“通过头部添加”之后,这两种方法在分级性能、页面请求总数或加载时间(例如,GTMetrix上的“第一次绘制”、“第一次内容绘制”和“OnLoad”)方面没有显著和一致的差异。

特别是关于缓存,缓存插件不能对外部托管的文件做太多的处理,无论它们是否添加到WP队列。文件本身不会受到影响,您的页面仍会为每个文件生成请求。

更一般地说,我看到了加载脚本和样式的各种不同方法。其中一些将部分或全部绕过WP队列。当然可以想象,在某些情况下,如果将Fontawesome或其他第三方标记加入队列,那么会有一些实例(例如,一个利用样式句柄数组同时防止在特定页面上加载样式句柄的函数)会非常有用,而且,最初部署两个功能(排队和过滤)实际上比简单地加载一个更为节约。

对于FA,样式表已经缩小,并通过FA自己的CDN加载。它对性能的内在影响将是最小的,尽管如此,无论是通过wp\\u head()加载还是通过队列加载,它仍然会在性能评分器的多个点上记录错误-相同的点,如Google Page Speed Insights和前面提到的GTMetrix和Pingdom,这将为您提供一个性能点,使您在重新优化一个或另一个图像文件时不需要保存几个字节(甚至不需要千字节)。

通过wp\\u head而不是队列加载可能会导致“脚本和样式的正确顺序”检查失败(即使其他人会在加载本地托管文件之后对您的外部托管文件进行更高的评分),但是,如果您真的担心以最适合您站点的方式加载FA,那么您应该尝试locally hosting its files and sub-files, 它的样式和样式表通过@font-face调用的字体。在这种情况下,您可以像其他任何本地文件一样将样式表排队,通过优化插件或直接“手动”连接和组合样式表您甚至可以对Fontawesome进行自己的精彩修改,并将其与主题样式表和结构集成。或者(如前所述),您可以尝试一些更奇特的性能优化策略,比如在特定页面的结构中需要CSS之前添加CSS内联。

无论如何,你不必担心新的“完整性”和“跨来源”标签,你也不必担心Fontawesome是否有一天忘记支付CDN账单。

或者,您可能正在一个已经是一团糟的网站上工作,到处都加载了样式表和脚本,只需将最新添加的内容放在功能的顶部就可以了。php文件,以便您或下一位开发人员可以轻松地再次找到它。。。

结束

相关推荐

基于主题和html属性更新Body类

我刚开始使用wordpress。现在,我正在尝试为我编写的静态网页创建一个主题。对于该网页,我使用的是barbajs,这就是为什么我有一个带有自定义数据名称空间属性的html标记(在我的例子中是一个节标记)。我还为每个页面使用body类。因此,页面基本上是这样的:<body class=\"page-about\"> <main> <section data-namespace=\"about\"> </sec