register_block_style_handle( array $metadata, string $field_name, int $index ): string|false

Finds a style handle for the block metadata field. It detects when a path to file was provided and registers the style under automatically generated handle name. It returns unprocessed style handle otherwise.


Parameters

$metadata array Required
Block metadata.
$field_name string Required
Field name to pick from metadata.
$index int Optional
Index of the style to register when multiple items passed.
Default 0.

Top ↑

Return

string|false Style handle provided directly or created through style's registration, or false on failure.


Top ↑

Source

File: wp-includes/blocks.php. View all references

function register_block_style_handle( $metadata, $field_name, $index = 0 ) {
	if ( empty( $metadata[ $field_name ] ) ) {
		return false;
	}

	$style_handle = $metadata[ $field_name ];
	if ( is_array( $style_handle ) ) {
		if ( empty( $style_handle[ $index ] ) ) {
			return false;
		}
		$style_handle = $style_handle[ $index ];
	}

	$style_handle_name = generate_block_asset_handle( $metadata['name'], $field_name, $index );
	// If the style handle is already registered, skip re-registering.
	if ( wp_style_is( $style_handle_name, 'registered' ) ) {
		return $style_handle_name;
	}

	static $wpinc_path_norm = '';
	if ( ! $wpinc_path_norm ) {
		$wpinc_path_norm = wp_normalize_path( realpath( ABSPATH . WPINC ) );
	}

	$is_core_block = isset( $metadata['file'] ) && str_starts_with( $metadata['file'], $wpinc_path_norm );
	// Skip registering individual styles for each core block when a bundled version provided.
	if ( $is_core_block && ! wp_should_load_separate_core_block_assets() ) {
		return false;
	}

	$style_path      = remove_block_asset_path_prefix( $style_handle );
	$is_style_handle = $style_handle === $style_path;
	// Allow only passing style handles for core blocks.
	if ( $is_core_block && ! $is_style_handle ) {
		return false;
	}
	// Return the style handle unless it's the first item for every core block that requires special treatment.
	if ( $is_style_handle && ! ( $is_core_block && 0 === $index ) ) {
		return $style_handle;
	}

	// Check whether styles should have a ".min" suffix or not.
	$suffix = SCRIPT_DEBUG ? '' : '.min';
	if ( $is_core_block ) {
		$style_path = ( 'editorStyle' === $field_name ) ? "editor{$suffix}.css" : "style{$suffix}.css";
	}

	$style_path_norm = wp_normalize_path( realpath( dirname( $metadata['file'] ) . '/' . $style_path ) );
	$has_style_file  = '' !== $style_path_norm;

	if ( $has_style_file ) {
		$style_uri = plugins_url( $style_path, $metadata['file'] );

		// Cache $template_path_norm and $stylesheet_path_norm to avoid unnecessary additional calls.
		static $template_path_norm   = '';
		static $stylesheet_path_norm = '';
		if ( ! $template_path_norm || ! $stylesheet_path_norm ) {
			$template_path_norm   = wp_normalize_path( get_template_directory() );
			$stylesheet_path_norm = wp_normalize_path( get_stylesheet_directory() );
		}

		// Determine if the block style was registered in a theme, by checking if the script path starts with either
		// the parent (template) or child (stylesheet) directory path.
		$is_parent_theme_block = str_starts_with( $style_path_norm, $template_path_norm );
		$is_child_theme_block  = str_starts_with( $style_path_norm, $stylesheet_path_norm );
		$is_theme_block        = ( $is_parent_theme_block || $is_child_theme_block );

		if ( $is_core_block ) {
			// All possible $style_path variants for core blocks are hard-coded above.
			$style_uri = includes_url( 'blocks/' . str_replace( 'core/', '', $metadata['name'] ) . '/' . $style_path );
		} elseif ( $is_theme_block ) {
			// Get the script path deterministically based on whether or not it was registered in a parent or child theme.
			$style_uri = $is_parent_theme_block
				? get_theme_file_uri( str_replace( $template_path_norm, '', $style_path_norm ) )
				: get_theme_file_uri( str_replace( $stylesheet_path_norm, '', $style_path_norm ) );
		}
	} else {
		$style_uri = false;
	}

	$version = ! $is_core_block && isset( $metadata['version'] ) ? $metadata['version'] : false;
	$result  = wp_register_style(
		$style_handle_name,
		$style_uri,
		array(),
		$version
	);
	if ( ! $result ) {
		return false;
	}

	if ( $has_style_file ) {
		wp_style_add_data( $style_handle_name, 'path', $style_path_norm );

		if ( $is_core_block ) {
			$rtl_file = str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $style_path_norm );
		} else {
			$rtl_file = str_replace( '.css', '-rtl.css', $style_path_norm );
		}

		if ( is_rtl() && file_exists( $rtl_file ) ) {
			wp_style_add_data( $style_handle_name, 'rtl', 'replace' );
			wp_style_add_data( $style_handle_name, 'suffix', $suffix );
			wp_style_add_data( $style_handle_name, 'path', $rtl_file );
		}
	}

	return $style_handle_name;
}


Top ↑

Changelog

Changelog
Version Description
6.1.0 Added $index parameter.
5.5.0 Introduced.

Top ↑

User Contributed Notes

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