WordPress Version: 6.5
/**
* Prints resource hints to browsers for pre-fetching, pre-rendering
* and pre-connecting to websites.
*
* Gives hints to browsers to prefetch specific pages or render them
* in the background, to perform DNS lookups or to begin the connection
* handshake (DNS, TCP, TLS) in the background.
*
* These performance improving indicators work by using `<link rel"…">`.
*
* @since 4.6.0
*/
function wp_resource_hints()
{
$hints = array('dns-prefetch' => wp_dependencies_unique_hosts(), 'preconnect' => array(), 'prefetch' => array(), 'prerender' => array());
foreach ($hints as $relation_type => $urls) {
$unique_urls = array();
/**
* Filters domains and URLs for resource hints of the given relation type.
*
* @since 4.6.0
* @since 4.7.0 The `$urls` parameter accepts arrays of specific HTML attributes
* as its child elements.
*
* @param array $urls {
* Array of resources and their attributes, or URLs to print for resource hints.
*
* @type array|string ...$0 {
* Array of resource attributes, or a URL string.
*
* @type string $href URL to include in resource hints. Required.
* @type string $as How the browser should treat the resource
* (`script`, `style`, `image`, `document`, etc).
* @type string $crossorigin Indicates the CORS policy of the specified resource.
* @type float $pr Expected probability that the resource hint will be used.
* @type string $type Type of the resource (`text/html`, `text/css`, etc).
* }
* }
* @param string $relation_type The relation type the URLs are printed for. One of
* 'dns-prefetch', 'preconnect', 'prefetch', or 'prerender'.
*/
$urls = apply_filters('wp_resource_hints', $urls, $relation_type);
foreach ($urls as $key => $url) {
$atts = array();
if (is_array($url)) {
if (isset($url['href'])) {
$atts = $url;
$url = $url['href'];
} else {
continue;
}
}
$url = esc_url($url, array('http', 'https'));
if (!$url) {
continue;
}
if (isset($unique_urls[$url])) {
continue;
}
if (in_array($relation_type, array('preconnect', 'dns-prefetch'), true)) {
$parsed = wp_parse_url($url);
if (empty($parsed['host'])) {
continue;
}
if ('preconnect' === $relation_type && !empty($parsed['scheme'])) {
$url = $parsed['scheme'] . '://' . $parsed['host'];
} else {
// Use protocol-relative URLs for dns-prefetch or if scheme is missing.
$url = '//' . $parsed['host'];
}
}
$atts['rel'] = $relation_type;
$atts['href'] = $url;
$unique_urls[$url] = $atts;
}
foreach ($unique_urls as $atts) {
$html = '';
foreach ($atts as $attr => $value) {
if (!is_scalar($value) || !in_array($attr, array('as', 'crossorigin', 'href', 'pr', 'rel', 'type'), true) && !is_numeric($attr)) {
continue;
}
$value = ('href' === $attr) ? esc_url($value) : esc_attr($value);
if (!is_string($attr)) {
$html .= " {$value}";
} else {
$html .= " {$attr}='{$value}'";
}
}
$html = trim($html);
echo "<link {$html} />\n";
}
}
}