问题是,我非常确定无法检查是否通过PHP将CSS有效地添加到了页面:CSS是由浏览器解析的,因此是客户端,对服务器端完全没有影响。
当然,在PHP中可以检查CDN是否响应。
选项1
发送一个请求,如果它以HTTP状态200响应,请使用它。就像是:
function font_awesome_css() {
$url = 'http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css';
$cdn = wp_remote_get( $url );
if ( (int) wp_remote_retrieve_response_code( $cdn) !== 200 ) {
$url = get_template_directory_uri() . '/css/font-awesome/css/font-awesome.min.css';
}
wp_enqueue_style( 'font-awesome', $url, false );
}
导致2个HTTP请求,一个用于检查,第二个用于嵌入式CSS:真的很差。
选项2
function font_awesome_css() {
$url = 'http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css';
$cdn = wp_remote_get( $url );
if ( (int) wp_remote_retrieve_response_code( $cdn ) === 200 ) {
$css = wp_remote_retrieve_body( $cdn );
add_action( 'wp_head', function() use( $css ) {
$absolute = "//netdna.bootstrapcdn.com/font-awesome/4.0.3/fonts/";
$css = str_replace( "../fonts/", $absolute, $css );
echo '<style type="text/css">' . $css . '</style>';
} );
} else {
$url = get_template_directory_uri() . '/css/font-awesome/css/font-awesome.min.css';
wp_enqueue_style( 'font-awesome', $url, false );
}
}
这甚至更糟:
- 它破坏了
wp_enqueue_style
工作流程:如果插件添加了Font Awesome,它将被添加2次。
- HTTP请求的数量是相同的,但是通常2个请求并行运行,因此以这种方式,页面的PHP生成速度变慢,因为它需要等待第一个请求响应。
- 这也可以防止浏览器缓存CSS,因此,如果在不同页面中使用相同样式,则会在访问的每个页面上强制执行CDN请求。使用常规工作流程时,第一个CSS之后的页面将从缓存中获取。
所以,真的,不要在家中这样做。
真正重要的是,使用PHP可以检查CDN请求,但不能验证CSS,因此所有努力最终都会导致性能变差,而不是更好。
真诚的,如果您的主题是公共主题,建议您仅使用本地副本,为用户提供选择CDN的方法:
if ( ! function_exists( 'font_awesome_css' ) ) {
function font_awesome_css() {
$_url = get_template_directory_uri() . '/css/font-awesome/css/font-awesome.min.css';
$url = apply_filters( 'font_awesome_css_url', $_url );
wp_enqueue_style( 'font-awesome', $url, false );
}
}
因此,用户可以使用子主题完全覆盖该功能,还可以使用'font_awesome css_url'
过滤器更改URL。
还应考虑到一些高端托管服务提供商会自动将本地资产转换为CDN资产,并且有一些插件可以让CDN拥有一切。这就是公共主题完全不应使用CDN的原因。
如果主题适合您自己,则进行选择。考虑到大多数著名的CDN的停机时间都非常短(根据cdnperf.com,bootstrapcdn是最可靠的停机之一)。我很确定您的主机的停机时间比bootstrapcdn大,因此与带有破损图标的网站相比,人们更有可能根本看不到您的网站。
肮脏的方式
如前所述,PHP无法检查CSS,因为CSS渲染发生在客户端,但是您可以使用客户端检查:JavaScript。
首先使用CDN嵌入CSS:
function font_awesome_css() {
$url = '//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css';
wp_enqueue_style( 'font-awesome', $url, false );
}
之后,在页脚中添加一些JavaScript:
/*
Normally the JS should be properly enqueued and the URL
passed via wp_enqueue_script, but this is a proof of concept,
more than real code.
*/
add_action( 'wp_footer', function() {
$cssurl = get_template_directory_uri() . '/css/';
?>
<span id="facheck" data-cssuri="<?php echo $cssurl; ?>" class="fa" style="display:none">
</span>
<script>
jQuery(document).ready(function($) {
var $check = $('#facheck');
if ( $check.css('fontFamily') !== 'FontAwesome' ) {
// Font Awesome not loaded!
// Remove current CSS link
$('#font-awesome-css').remove;
// Add the local version
var local = '<link rel="stylesheet" type="text/css" href="' +
$check.data('cssuri') + // This is the theme CSS folder URL
'font-awesome/css/font-awesome.min.css" />';
$('head').append( local );
}
});
</script>
<?php
});
此代码在页面加载时运行,并检查添加到类为“ fa”的页脚的不可见范围是否将font-family属性设置为“ FontAwesome”。这是由Font Awesome设置的,因此,如果不正确,则表示未加载CSS。如果发生这种情况,代码将使用JavaScript将本地CSS附加到head。
(要测试此代码,您可以通过wp_enqueue_style
错误的CDN URL 进行嵌入,然后查看会发生什么情况)
因此,在极少数情况下无法使用CDN的情况下,所有样式都会按预期显示(在几毫秒内,用户会看到“残破的” CSS图标,因为在页面加载后添加了CSS)。
现在,考虑到CDN非常可靠,对于不到1%会看到图标破损的人来说,值得这样做吗?回答这个问题留给您。
is_readable($cdnPath)
呢?