/**
 * 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";
        }
    }
}
예제 #2
0
/**
 * 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);
        }
    }
}
예제 #3
0
function fau_remove_default_dns_prefetch($hints, $relation_type)
{
    if ('dns-prefetch' === $relation_type) {
        return array_diff(wp_dependencies_unique_hosts(), $hints);
    }
    return $hints;
}