wp-includes/class-wp-url-pattern-prefixer.php:18Class for prefixing URL patterns.
$contextsarray<string,private$context_string => $base_path pairs.class WP_URL_Pattern_Prefixer { /** * Map of `$context_string => $base_path` pairs. * * @since 6.8.0 * @var array<string, string> */ private $contexts; /** * Constructor. * * @since 6.8.0 * * @param array<string, string> $contexts Optional. Map of `$context_string => $base_path` pairs. Default is the * contexts returned by the * {@see WP_URL_Pattern_Prefixer::get_default_contexts()} method. */ public function __construct( array $contexts = array() ) { if ( count( $contexts ) > 0 ) { $this->contexts = array_map( static function ( string $str ): string { return self::escape_pattern_string( trailingslashit( $str ) ); }, $contexts ); } else { $this->contexts = self::get_default_contexts(); } } /** * Prefixes the given URL path pattern with the base path for the given context. * * This ensures that these path patterns work correctly on WordPress subdirectory sites, for example in a multisite * network, or when WordPress itself is installed in a subdirectory of the hostname. * * The given URL path pattern is only prefixed if it does not already include the expected prefix. * * @since 6.8.0 * * @param string $path_pattern URL pattern starting with the path segment. * @param string $context Optional. Context to use for prefixing the path pattern. Default 'home'. * @return string URL pattern, prefixed as necessary. */ public function prefix_path_pattern( string $path_pattern, string $context = 'home' ): string { // If context path does not exist, the context is invalid. if ( ! isset( $this->contexts[ $context ] ) ) { _doing_it_wrong( __FUNCTION__, esc_html( sprintf( /* translators: %s: context string */ __( 'Invalid URL pattern context %s.' ), $context ) ), '6.8.0' ); return $path_pattern; } /* * In the event that the context path contains a :, ? or # (which can cause the URL pattern parser to switch to * another state, though only the latter two should be percent encoded anyway), it additionally needs to be * enclosed in grouping braces. The final forward slash (trailingslashit ensures there is one) affects the * meaning of the * wildcard, so is left outside the braces. */ $context_path = $this->contexts[ $context ]; $escaped_context_path = $context_path; if ( strcspn( $context_path, ':?#' ) !== strlen( $context_path ) ) { $escaped_context_path = '{' . substr( $context_path, 0, -1 ) . '}/'; } /* * If the path already starts with the context path (including '/'), remove it first * since it is about to be added back. */ if ( str_starts_with( $path_pattern, $context_path ) ) {Introduced in 6.8.0. Unchanged from 6.8.8 through 7.1.0.
Signature, return type and hooks compared across 4 parsed releases.
src/wp-includes/class-wp-url-pattern-prefixer.php, and regenerated for each WordPress release so it tracks the code rather than a snapshot of it.