在https://core.trac.wordpress.org/changeset/37920 它定义了wp_resource_hints()
WordPress 4.6中添加的函数。
在该页面上,它显示了通用模板的一部分。php文件,其中wp_resource_hints()
定义了函数,还有一个函数wp_resource_hints_scripts_styles()
它“为从外部主机排队的所有脚本和样式添加dns预取。”
我想将所有外部排队脚本和样式的“dns预取”替换为“预连接”。换句话说,我希望wp_resource_hints_scripts_styles()
函数以某种方式使用“预连接”。
有没有办法修改wp_resource_hints()
实现这一点的功能?
我正在查看函数的以下部分,其中“dns预取”指向wp_resource_hints_scripts_styles()
, 我想知道是否可以改为使用“预连接”:
$hints = array(
\'dns-prefetch\' => wp_resource_hints_scripts_styles(),
\'preconnect\' => array( \'s.w.org\' ),
\'prefetch\' => array(),
\'prerender\' => array(),
);
如果我没有用最清晰的方式表达这个问题,我深表歉意!
最合适的回答,由SO网友:GermanKiwi 整理而成
我终于想出了如何让它正常工作,并在每个“预连接”链接中包含正确的方案(http或https)。
我复制了一份wp_dependencies_unique_hosts()
函数(WordPress core的一部分)并对其进行修改,使其同时输出scheme和host,然后将其合并到@jacob peattie在其回答中提供的函数中。结果函数工作得很好,如下所示。(我在这里详细介绍:Change dns-prefetch to preconnect with correct protocol)
function dns_prefetch_to_preconnect( $urls, $relation_type ) {
global $wp_scripts, $wp_styles;
$unique_urls = array();
foreach ( array( $wp_scripts, $wp_styles ) as $dependencies ) {
if ( $dependencies instanceof WP_Dependencies && ! empty( $dependencies->queue ) ) {
foreach ( $dependencies->queue as $handle ) {
if ( ! isset( $dependencies->registered[ $handle ] ) ) {
continue;
}
$dependency = $dependencies->registered[ $handle ];
$parsed = wp_parse_url( $dependency->src );
if ( ! empty( $parsed[\'host\'] ) && ! in_array( $parsed[\'host\'], $unique_urls ) && $parsed[\'host\'] !== $_SERVER[\'SERVER_NAME\'] ) {
$unique_urls[] = $parsed[\'scheme\'] . \'://\' . $parsed[\'host\'];
}
}
}
}
if ( \'dns-prefetch\' === $relation_type ) {
$urls = [];
}
if ( \'preconnect\' === $relation_type ) {
$urls = $unique_urls;
}
return $urls;
}
add_filter( \'wp_resource_hints\', \'dns_prefetch_to_preconnect\', 0, 2 );
SO网友:Jacob Peattie
有一个过滤器,wp_resource_hints
, 但它只单独过滤每个“关系类型”(即预连接、dns预取等),而不是整个$hints
问题中的数组。但是,您可以使用筛选器清空dns-prefetch
和添加wp_resource_hints_scripts_styles()
到preconnect
数组,如下所示:
add_filter(
\'wp_resource_hints\',
function( $urls, $relation_type ) {
if ( \'dns-prefetch\' === $relation_type ) {
$urls = [];
}
if ( \'preconnect\' === $relation_type ) {
$urls = wp_dependencies_unique_hosts();
}
return $urls;
},
0,
2
);
请注意,我使用的优先级为
0
. 这是为了确保手动添加到
dns-prefetch
通过其他插件或主题不会意外地从所有列表中删除,因为我们只能从
wp_dependencies_unique_hosts()
.