wp_resource_hints()

Prints resource hints to browsers for pre-fetching, pre-rendering and pre-connecting to web sites.

Description

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"…">.

Source

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 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,
		 *                              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' ), 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";
		}
	}
}

Hooks

apply_filters( ‘wp_resource_hints’, array $urls, string $relation_type )

Filters domains and URLs for resource hints of relation type.

Changelog

VersionDescription
4.6.0Introduced.

User Contributed Notes

  1. Skip to note 3 content

    Sometimes, you may see this, removing the entire action in order to remove the reference to w.org:

    remove_action( 'wp_head', 'wp_resource_hints', 2 ); // removes dns-prefetch for w.org

    However, that eliminates the benefit of having dns-prefetch automatically added for external scripts.

    An alternative is just to remove the hard-coded reference, and keep dns-prefetch for performance gains:

    add_filter( 'wp_resource_hints', function( $urls ) {
    
        foreach ($urls as $key => $url) {
            // Remove dns-prefetch for w.org (we really don't need it)
            // See https://core.trac.wordpress.org/ticket/40426 for details 
            if ( 'https://s.w.org/images/core/emoji/13.0.0/svg/' === $url ) {
                unset( $urls[ $key ] );
            }
        }
    
        return $urls;
    } );
  2. Skip to note 4 content

    The newer way to remove (or alter) the DNS prefetch for s.w.org is to use the emoji_svg_url filter introduced in 4.6.0.

    // Remove WP Emoji DNS prefetch from document head
    add_filter( 'emoji_svg_url', '__return_false' );

    See https://core.trac.wordpress.org/attachment/ticket/40426/40426.diff

You must log in before being able to contribute a note or feedback.