<?php /** * Overrides Core's wp-includes/block-patterns.php to add category descriptions for WP 6.3. * * @package gutenberg */ /** * Registers the block pattern sources. * * @since 6.3.0 Added source to core block patterns. */ function gutenberg_register_core_block_patterns_and_categories() { $should_register_core_patterns = get_theme_support( 'core-block-patterns' ); if ( $should_register_core_patterns ) { $core_block_patterns = array( 'query-standard-posts', 'query-medium-posts', 'query-small-posts', 'query-grid-posts', 'query-large-title-posts', 'query-offset-posts', 'social-links-shared-background-color', ); foreach ( $core_block_patterns as $core_block_pattern ) { $pattern = require ABSPATH . WPINC . '/block-patterns/' . $core_block_pattern . '.php'; $pattern['source'] = 'core'; // Added in 6.3.0. register_block_pattern( 'core/' . $core_block_pattern, $pattern ); } } } add_action( 'init', 'gutenberg_register_core_block_patterns_and_categories' ); /** * Register Core's official patterns from wordpress.org/patterns. * * @since 5.8.0 * @since 5.9.0 The $current_screen argument was removed. * @since 6.2.0 Normalize the pattern from the API (snake_case) to the format expected by `register_block_pattern` (camelCase). * @since 6.3.0 Add 'pattern-directory/core' to the pattern's 'source'. * * @param WP_Screen $deprecated Unused. Formerly the screen that the current request was triggered from. */ function gutenberg_load_remote_block_patterns( $deprecated = null ) { if ( ! empty( $deprecated ) ) { _deprecated_argument( __FUNCTION__, '5.9.0' ); $current_screen = $deprecated; if ( ! $current_screen->is_block_editor ) { return; } } $supports_core_patterns = get_theme_support( 'core-block-patterns' ); /** * Filter to disable remote block patterns. * * @since 5.8.0 * * @param bool $should_load_remote */ $should_load_remote = apply_filters( 'should_load_remote_block_patterns', true ); if ( $supports_core_patterns && $should_load_remote ) { $request = new WP_REST_Request( 'GET', '/wp/v2/pattern-directory/patterns' ); $core_keyword_id = 11; // 11 is the ID for "core". $request->set_param( 'keyword', $core_keyword_id ); $response = rest_do_request( $request ); if ( $response->is_error() ) { return; } $patterns = $response->get_data(); foreach ( $patterns as $pattern ) { $pattern['source'] = 'pattern-directory/core'; // Added in 6.3.0. $normalized_pattern = gutenberg_normalize_remote_pattern( $pattern ); $pattern_name = 'core/' . sanitize_title( $normalized_pattern['title'] ); register_block_pattern( $pattern_name, (array) $normalized_pattern ); } } } /** * Register `Featured` (category) patterns from wordpress.org/patterns. * * @since 5.9.0 * @since 6.2.0 Normalize the pattern from the API (snake_case) to the format expected by `register_block_pattern` (camelCase). * @since 6.3.0 Add 'pattern-directory/featured' to the pattern's 'source'. */ function gutenberg_load_remote_featured_patterns() { $supports_core_patterns = get_theme_support( 'core-block-patterns' ); /** This filter is documented in wp-includes/block-patterns.php */ $should_load_remote = apply_filters( 'should_load_remote_block_patterns', true ); if ( ! $should_load_remote || ! $supports_core_patterns ) { return; } $request = new WP_REST_Request( 'GET', '/wp/v2/pattern-directory/patterns' ); $featured_cat_id = 26; // This is the `Featured` category id from pattern directory. $request->set_param( 'category', $featured_cat_id ); $response = rest_do_request( $request ); if ( $response->is_error() ) { return; } $patterns = $response->get_data(); $registry = WP_Block_Patterns_Registry::get_instance(); foreach ( $patterns as $pattern ) { $pattern['source'] = 'pattern-directory/featured'; // Added in 6.3.0. $normalized_pattern = gutenberg_normalize_remote_pattern( $pattern ); $pattern_name = sanitize_title( $normalized_pattern['title'] ); // Some patterns might be already registered as core patterns with the `core` prefix. $is_registered = $registry->is_registered( $pattern_name ) || $registry->is_registered( "core/$pattern_name" ); if ( ! $is_registered ) { register_block_pattern( $pattern_name, (array) $normalized_pattern ); } } } /** * Registers patterns from Pattern Directory provided by a theme's * `theme.json` file. * * @since 6.0.0 * @since 6.2.0 Normalize the pattern from the API (snake_case) to the format expected by `register_block_pattern` (camelCase). * @since 6.3.0 Add 'pattern-directory/theme' to the pattern's 'source'. * @access private */ function gutenberg_register_remote_theme_patterns() { /** This filter is documented in wp-includes/block-patterns.php */ if ( ! apply_filters( 'should_load_remote_block_patterns', true ) ) { return; } if ( ! wp_theme_has_theme_json() ) { return; } $pattern_settings = gutenberg_get_theme_directory_pattern_slugs(); if ( empty( $pattern_settings ) ) { return; } $request = new WP_REST_Request( 'GET', '/wp/v2/pattern-directory/patterns' ); $request['slug'] = $pattern_settings; $response = rest_do_request( $request ); if ( $response->is_error() ) { return; } $patterns = $response->get_data(); $patterns_registry = WP_Block_Patterns_Registry::get_instance(); foreach ( $patterns as $pattern ) { $pattern['source'] = 'pattern-directory/theme'; // Added in 6.3.0. $normalized_pattern = gutenberg_normalize_remote_pattern( $pattern ); $pattern_name = sanitize_title( $normalized_pattern['title'] ); // Some patterns might be already registered as core patterns with the `core` prefix. $is_registered = $patterns_registry->is_registered( $pattern_name ) || $patterns_registry->is_registered( "core/$pattern_name" ); if ( ! $is_registered ) { register_block_pattern( $pattern_name, (array) $normalized_pattern ); } } }