WordPress Version: 6.3
/**
* Registers patterns from Pattern Directory provided by a theme's
* `theme.json` file.
*
* @since 6.0.0
* @since 6.2.0 Normalized 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 _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 = wp_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';
$normalized_pattern = wp_normalize_remote_block_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, $normalized_pattern);
}
}
}