更改dns-prefetch以使用正确的协议进行预连接

时间:2020-01-04 作者:GermanKiwi

我的函数中有这个函数。php文件:

function dns_prefetch_to_preconnect( $urls, $relation_type ) {
    if ( \'dns-prefetch\' === $relation_type ) {
        $urls = [];
    }

    if ( \'preconnect\' === $relation_type ) {
        $urls = wp_dependencies_unique_hosts();
    }

    return $urls;
}
add_filter( \'wp_resource_hints\', \'dns_prefetch_to_preconnect\', 0, 2 );
它采用中定义的URLwp_dependencies_unique_hosts() – 默认情况下,哪个WordPress分配给dns-prefetch 链接标记–并将其重新分配给preconnect 链接标记。此处为我提供了该功能:

Change dns-prefetch to preconnect for external enqueued resources

但是,此功能不能完全正常工作。它添加了preconnect 使用http而不是https的URL。

示例:当我不使用上述功能时,WordPress会将此链接添加到我的标题:

<link rel=\'dns-prefetch\' href=\'//fonts.googleapis.com\' />
当我启用上述功能时,它会将该链接替换为该链接:

<link rel=\'preconnect\' href=\'http://fonts.googleapis.com\' />
当然,问题是它应该是https,而不是http。

有人能帮我修改我的函数,以便它给我https链接吗?

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

我现在终于可以工作了,如下所示:

首先我找到了原件wp_dependencies_unique_hosts() 来自WordPress代码的函数(它位于一个名为general template.php的文件中),我复制了它,但给它起了一个新名称:wp_dependencies_unique_urls().

我观察到此函数正在使用wp_parse_url() 从脚本和样式列表中获取每个URL的主机部分。换句话说,它放弃了这个计划,这就是我遇到问题的原因。

因此,我修改了函数以包含该方案-这里是其整体:

function wp_dependencies_unique_urls() {
    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\'];
                }
            }
        }
    }

    return $unique_urls;
}
如你所见,我改变的主要内容是:

$unique_urls[] = $parsed[\'scheme\'] . \'://\' . $parsed[\'host\'];
我希望这是将方案添加到每个URL开头的最佳方式。

接下来,我修改了我的原始函数(来自上面的原始问题),所以它调用了我创建的这个新函数:

function dns_prefetch_to_preconnect( $urls, $relation_type ) {

    if ( \'dns-prefetch\' === $relation_type ) {
        $urls = [];
    }

    if ( \'preconnect\' === $relation_type ) {
        $urls = wp_dependencies_unique_urls();
    }

    return $urls;
}
add_filter( \'wp_resource_hints\', \'dns_prefetch_to_preconnect\', 0, 2 );
哎哟,真管用!现在,我的页面标题中有了有效的“预连接”链接,这些链接使用与原始排队脚本和样式相同的方案-http或https!

如果我愿意,我可以将我的两个函数合并为一个大函数以简化:

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网友:Tom J Nowell

问题不在于您使用的函数添加了http:, 问题是它根本没有添加URL模式!

因此,WP需要添加URL模式来将主机转换为URL,因此它使用http://. 它无法知道原始版本是什么,或者主机是否支持HTTPS,所以http:// 是安全的赌注。

但是,如果您传递添加了URL架构的数组,那么它将被传递而不会出现问题。

像这样的事情可能会奏效:

$hosts = wp_dependencies_unique_hosts();
$urls = array_map( function( $host ) {
    return set_url_scheme( $host, \'https\' );
}, $hosts );
但从长远来看,最好是获取实际的URL并从中提取出主机URL,而不是依赖于wp_dependencies_unique_hosts 如果你想保存httphttps