wp_build_state_selector()WP 7.1.0

Builds a scoped selector from a block selector and optional pseudo-state.

No Hooks.

Returns

string. Scoped selector.

Usage

wp_build_state_selector( $base_selector, $block_selector, $state );
$base_selector(string) (required)
Block-instance scoping selector.
$block_selector(string|null) (required)
Block or feature selector from metadata.
$state(string) (required)
Pseudo-state selector.

Changelog

Since 7.1.0 Introduced.

wp_build_state_selector() code WP 7.1

function wp_build_state_selector( $base_selector, $block_selector, $state ) {
	if ( ! is_string( $block_selector ) || '' === trim( $block_selector ) ) {
		return $base_selector . $state;
	}

	$selectors        = wp_split_selector_list( $block_selector );
	$scoped_selectors = array();

	foreach ( $selectors as $selector ) {
		$selector = trim( $selector );
		if ( '' === $selector ) {
			continue;
		}

		/*
		 * Replace only the leading block selector part (e.g. class name,
		 * attribute selector, ID, or tag name) with the block instance selector.
		 * Preserve anything after that prefix, including modifier classes on the
		 * same element and combinators without spaces.
		 */
		if ( preg_match( '/^([.#]?[-_a-zA-Z0-9]+|\[[^\]]+\])/', $selector, $matches ) ) {
			$scoped_selectors[] = $base_selector . substr( $selector, strlen( $matches[0] ) ) . $state;
			continue;
		}

		$scoped_selectors[] = $base_selector . $state;
	}

	return empty( $scoped_selectors )
		? $base_selector . $state
		: implode( ', ', $scoped_selectors );
}