/** * Prints resource hints to browsers for pre-fetching, pre-rendering * and pre-connecting to web sites. * * 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()); /* * Add DNS prefetch for the Emoji CDN. * The path is removed in the foreach loop below. */ /** This filter is documented in wp-includes/formatting.php */ $hints['dns-prefetch'][] = apply_filters('emoji_svg_url', 'https://s.w.org/images/core/emoji/2.2.1/svg/'); foreach ($hints as $relation_type => $urls) { $unique_urls = array(); /** * Filters domains and URLs for resource hints of relation type. * * @since 4.6.0 * * @param array $urls URLs to print for resource hints. * @param string $relation_type The relation type the URLs are printed for, e.g. 'preconnect' 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'))) { $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"; } } }
/** * Prints resource hints to browsers for pre-fetching, pre-rendering * and pre-connecting to web sites. * * 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()); /* * Add DNS prefetch for the Emoji CDN. * The path is removed in the foreach loop below. */ /** This filter is documented in wp-includes/formatting.php */ $hints['dns-prefetch'][] = apply_filters('emoji_svg_url', 'https://s.w.org/images/core/emoji/2/svg/'); foreach ($hints as $relation_type => $urls) { /** * Filters domains and URLs for resource hints of relation type. * * @since 4.6.0 * * @param array $urls URLs to print for resource hints. * @param string $relation_type The relation type the URLs are printed for, e.g. 'preconnect' or 'prerender'. */ $urls = apply_filters('wp_resource_hints', $urls, $relation_type); foreach ($urls as $key => $url) { $url = esc_url($url, array('http', 'https')); if (!$url) { unset($urls[$key]); continue; } if (in_array($relation_type, array('preconnect', 'dns-prefetch'))) { $parsed = wp_parse_url($url); if (empty($parsed['host'])) { unset($urls[$key]); 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']; } } $urls[$key] = $url; } $urls = array_unique($urls); foreach ($urls as $url) { printf("<link rel='%s' href='%s' />\n", $relation_type, $url); } } }
function fau_remove_default_dns_prefetch($hints, $relation_type) { if ('dns-prefetch' === $relation_type) { return array_diff(wp_dependencies_unique_hosts(), $hints); } return $hints; }