wp/wp-includes/blocks/index.php
changeset 21 48c4eec2b7e6
parent 19 3d72ae0968f4
child 22 8c2e4d02f4ef
--- a/wp/wp-includes/blocks/index.php	Thu Sep 29 08:06:27 2022 +0200
+++ b/wp/wp-includes/blocks/index.php	Fri Sep 05 18:40:08 2025 +0200
@@ -5,68 +5,140 @@
  * @package WordPress
  */
 
+define( 'BLOCKS_PATH', ABSPATH . WPINC . '/blocks/' );
+
 // Include files required for core blocks registration.
-require ABSPATH . WPINC . '/blocks/archives.php';
-require ABSPATH . WPINC . '/blocks/avatar.php';
-require ABSPATH . WPINC . '/blocks/block.php';
-require ABSPATH . WPINC . '/blocks/calendar.php';
-require ABSPATH . WPINC . '/blocks/categories.php';
-require ABSPATH . WPINC . '/blocks/comment-author-name.php';
-require ABSPATH . WPINC . '/blocks/comment-content.php';
-require ABSPATH . WPINC . '/blocks/comment-date.php';
-require ABSPATH . WPINC . '/blocks/comment-edit-link.php';
-require ABSPATH . WPINC . '/blocks/comment-reply-link.php';
-require ABSPATH . WPINC . '/blocks/comment-template.php';
-require ABSPATH . WPINC . '/blocks/comments-pagination-next.php';
-require ABSPATH . WPINC . '/blocks/comments-pagination-numbers.php';
-require ABSPATH . WPINC . '/blocks/comments-pagination-previous.php';
-require ABSPATH . WPINC . '/blocks/comments-pagination.php';
-require ABSPATH . WPINC . '/blocks/comments-title.php';
-require ABSPATH . WPINC . '/blocks/cover.php';
-require ABSPATH . WPINC . '/blocks/file.php';
-require ABSPATH . WPINC . '/blocks/gallery.php';
-require ABSPATH . WPINC . '/blocks/home-link.php';
-require ABSPATH . WPINC . '/blocks/image.php';
-require ABSPATH . WPINC . '/blocks/latest-comments.php';
-require ABSPATH . WPINC . '/blocks/latest-posts.php';
-require ABSPATH . WPINC . '/blocks/legacy-widget.php';
-require ABSPATH . WPINC . '/blocks/loginout.php';
-require ABSPATH . WPINC . '/blocks/navigation-link.php';
-require ABSPATH . WPINC . '/blocks/navigation-submenu.php';
-require ABSPATH . WPINC . '/blocks/navigation.php';
-require ABSPATH . WPINC . '/blocks/page-list.php';
-require ABSPATH . WPINC . '/blocks/pattern.php';
-require ABSPATH . WPINC . '/blocks/post-author-biography.php';
-require ABSPATH . WPINC . '/blocks/post-author.php';
-require ABSPATH . WPINC . '/blocks/post-comments.php';
-require ABSPATH . WPINC . '/blocks/post-comments-form.php';
-require ABSPATH . WPINC . '/blocks/post-content.php';
-require ABSPATH . WPINC . '/blocks/post-date.php';
-require ABSPATH . WPINC . '/blocks/post-excerpt.php';
-require ABSPATH . WPINC . '/blocks/post-featured-image.php';
-require ABSPATH . WPINC . '/blocks/post-navigation-link.php';
-require ABSPATH . WPINC . '/blocks/post-template.php';
-require ABSPATH . WPINC . '/blocks/post-terms.php';
-require ABSPATH . WPINC . '/blocks/post-title.php';
-require ABSPATH . WPINC . '/blocks/query-no-results.php';
-require ABSPATH . WPINC . '/blocks/query-pagination-next.php';
-require ABSPATH . WPINC . '/blocks/query-pagination-numbers.php';
-require ABSPATH . WPINC . '/blocks/query-pagination-previous.php';
-require ABSPATH . WPINC . '/blocks/query-pagination.php';
-require ABSPATH . WPINC . '/blocks/query-title.php';
-require ABSPATH . WPINC . '/blocks/query.php';
-require ABSPATH . WPINC . '/blocks/read-more.php';
-require ABSPATH . WPINC . '/blocks/rss.php';
-require ABSPATH . WPINC . '/blocks/search.php';
-require ABSPATH . WPINC . '/blocks/shortcode.php';
-require ABSPATH . WPINC . '/blocks/site-logo.php';
-require ABSPATH . WPINC . '/blocks/site-tagline.php';
-require ABSPATH . WPINC . '/blocks/site-title.php';
-require ABSPATH . WPINC . '/blocks/social-link.php';
-require ABSPATH . WPINC . '/blocks/tag-cloud.php';
-require ABSPATH . WPINC . '/blocks/template-part.php';
-require ABSPATH . WPINC . '/blocks/term-description.php';
-require ABSPATH . WPINC . '/blocks/widget-group.php';
+require BLOCKS_PATH . 'legacy-widget.php';
+require BLOCKS_PATH . 'widget-group.php';
+require BLOCKS_PATH . 'require-dynamic-blocks.php';
+
+/**
+ * Registers core block style handles.
+ *
+ * While {@see register_block_style_handle()} is typically used for that, the way it is
+ * implemented is inefficient for core block styles. Registering those style handles here
+ * avoids unnecessary logic and filesystem lookups in the other function.
+ *
+ * @since 6.3.0
+ *
+ * @global string $wp_version The WordPress version string.
+ */
+function register_core_block_style_handles() {
+	global $wp_version;
+
+	if ( ! wp_should_load_separate_core_block_assets() ) {
+		return;
+	}
+
+	$blocks_url   = includes_url( 'blocks/' );
+	$suffix       = wp_scripts_get_suffix();
+	$wp_styles    = wp_styles();
+	$style_fields = array(
+		'style'       => 'style',
+		'editorStyle' => 'editor',
+	);
+
+	static $core_blocks_meta;
+	if ( ! $core_blocks_meta ) {
+		$core_blocks_meta = require BLOCKS_PATH . 'blocks-json.php';
+	}
+
+	$files          = false;
+	$transient_name = 'wp_core_block_css_files';
+
+	/*
+	 * Ignore transient cache when the development mode is set to 'core'. Why? To avoid interfering with
+	 * the core developer's workflow.
+	 */
+	$can_use_cached = ! wp_is_development_mode( 'core' );
+
+	if ( $can_use_cached ) {
+		$cached_files = get_transient( $transient_name );
+
+		// Check the validity of cached values by checking against the current WordPress version.
+		if (
+			is_array( $cached_files )
+			&& isset( $cached_files['version'] )
+			&& $cached_files['version'] === $wp_version
+			&& isset( $cached_files['files'] )
+		) {
+			$files = $cached_files['files'];
+		}
+	}
+
+	if ( ! $files ) {
+		$files = glob( wp_normalize_path( BLOCKS_PATH . '**/**.css' ) );
+
+		// Normalize BLOCKS_PATH prior to substitution for Windows environments.
+		$normalized_blocks_path = wp_normalize_path( BLOCKS_PATH );
+
+		$files = array_map(
+			static function ( $file ) use ( $normalized_blocks_path ) {
+				return str_replace( $normalized_blocks_path, '', $file );
+			},
+			$files
+		);
+
+		// Save core block style paths in cache when not in development mode.
+		if ( $can_use_cached ) {
+			set_transient(
+				$transient_name,
+				array(
+					'version' => $wp_version,
+					'files'   => $files,
+				)
+			);
+		}
+	}
+
+	$register_style = static function ( $name, $filename, $style_handle ) use ( $blocks_url, $suffix, $wp_styles, $files ) {
+		$style_path = "{$name}/{$filename}{$suffix}.css";
+		$path       = wp_normalize_path( BLOCKS_PATH . $style_path );
+
+		if ( ! in_array( $style_path, $files, true ) ) {
+			$wp_styles->add(
+				$style_handle,
+				false
+			);
+			return;
+		}
+
+		$wp_styles->add( $style_handle, $blocks_url . $style_path );
+		$wp_styles->add_data( $style_handle, 'path', $path );
+
+		$rtl_file = "{$name}/{$filename}-rtl{$suffix}.css";
+		if ( is_rtl() && in_array( $rtl_file, $files, true ) ) {
+			$wp_styles->add_data( $style_handle, 'rtl', 'replace' );
+			$wp_styles->add_data( $style_handle, 'suffix', $suffix );
+			$wp_styles->add_data( $style_handle, 'path', str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $path ) );
+		}
+	};
+
+	foreach ( $core_blocks_meta as $name => $schema ) {
+		/** This filter is documented in wp-includes/blocks.php */
+		$schema = apply_filters( 'block_type_metadata', $schema );
+
+		// Backfill these properties similar to `register_block_type_from_metadata()`.
+		if ( ! isset( $schema['style'] ) ) {
+			$schema['style'] = "wp-block-{$name}";
+		}
+		if ( ! isset( $schema['editorStyle'] ) ) {
+			$schema['editorStyle'] = "wp-block-{$name}-editor";
+		}
+
+		// Register block theme styles.
+		$register_style( $name, 'theme', "wp-block-{$name}-theme" );
+
+		foreach ( $style_fields as $style_field => $filename ) {
+			$style_handle = $schema[ $style_field ];
+			if ( is_array( $style_handle ) ) {
+				continue;
+			}
+			$register_style( $name, $filename, $style_handle );
+		}
+	}
+}
+add_action( 'init', 'register_core_block_style_handles', 9 );
 
 /**
  * Registers core block types using metadata files.
@@ -75,40 +147,10 @@
  * @since 5.5.0
  */
 function register_core_block_types_from_metadata() {
-	$block_folders = array(
-		'audio',
-		'button',
-		'buttons',
-		'code',
-		'column',
-		'columns',
-		'comments-query-loop',
-		'embed',
-		'freeform',
-		'group',
-		'heading',
-		'html',
-		'list',
-		'media-text',
-		'missing',
-		'more',
-		'nextpage',
-		'paragraph',
-		'preformatted',
-		'pullquote',
-		'quote',
-		'separator',
-		'social-links',
-		'spacer',
-		'table',
-		'text-columns',
-		'verse',
-		'video',
-	);
-
+	$block_folders = require BLOCKS_PATH . 'require-static-blocks.php';
 	foreach ( $block_folders as $block_folder ) {
-		register_block_type(
-			ABSPATH . WPINC . '/blocks/' . $block_folder
+		register_block_type_from_metadata(
+			BLOCKS_PATH . $block_folder
 		);
 	}
 }