将外部入队资源的dns-prefetch更改为预连接

时间:2019-08-20 作者:GermanKiwi

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(),
);
如果我没有用最清晰的方式表达这个问题,我深表歉意!

2 个回复
最合适的回答,由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().

相关推荐