函数文档

_load_remote_featured_patterns()

💡 云策文档标注

概述

_load_remote_featured_patterns() 函数用于从 wordpress.org/patterns 注册“Featured”类别的远程块模式。它通过 REST API 获取模式数据,并在满足条件时将其注册到 WordPress 块模式注册表中。

关键要点

  • 函数检查主题是否支持核心块模式(通过 get_theme_support('core-block-patterns'))和 should_load_remote_block_patterns 过滤器,以决定是否加载远程模式。
  • 使用 WP_REST_Request 向 /wp/v2/pattern-directory/patterns 发送 GET 请求,并设置 category 参数为 26(对应“Featured”类别)。
  • 获取响应数据后,通过 wp_normalize_remote_block_pattern() 规范化模式属性,并使用 register_block_pattern() 注册模式,避免重复注册。
  • 相关 Hook:should_load_remote_block_patterns 过滤器可用于禁用远程块模式的加载。

代码示例

function _load_remote_featured_patterns() {
    $supports_core_patterns = get_theme_support( 'core-block-patterns' );
    $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;
    $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';
        $normalized_pattern = wp_normalize_remote_block_pattern( $pattern );
        $pattern_name = sanitize_title( $normalized_pattern['title'] );
        $is_registered = $registry->is_registered( $pattern_name ) || $registry->is_registered( "core/$pattern_name" );
        if ( ! $is_registered ) {
            register_block_pattern( $pattern_name, $normalized_pattern );
        }
    }
}

注意事项

  • 函数在 WordPress 5.9.0 中引入,后续版本有更新:6.2.0 添加了模式规范化,6.3.0 添加了模式来源标识。
  • 依赖多个 WordPress 核心函数和类,如 WP_REST_Request、WP_Block_Patterns_Registry 等,确保环境兼容。
  • 错误处理:如果 REST 请求失败或条件不满足,函数会静默返回,不注册任何模式。

📄 原文内容

Register Featured (category) patterns from wordpress.org/patterns.

Source

function _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';
		$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 = $registry->is_registered( $pattern_name ) || $registry->is_registered( "core/$pattern_name" );
		if ( ! $is_registered ) {
			register_block_pattern( $pattern_name, $normalized_pattern );
		}
	}
}

Hooks

apply_filters( ‘should_load_remote_block_patterns’, bool $should_load_remote )

Filter to disable remote block patterns.

Changelog

Version Description
6.3.0 Add 'pattern-directory/featured' to the pattern’s 'source'.
6.2.0 Normalized the pattern from the API (snake_case) to the format expected by register_block_pattern() (camelCase).
5.9.0 Introduced.