函数文档

_build_block_template_result_from_file()

💡 云策文档标注

概述

_build_block_template_result_from_file() 函数基于主题文件构建统一的 WP_Block_Template 对象。它处理模板类型('wp_template' 或 'wp_template_part'),设置对象属性,并应用块钩子算法。

关键要点

  • 函数接受两个参数:$template_file(数组,主题文件信息)和 $template_type(字符串,模板类型)。
  • 返回一个 WP_Block_Template 对象,包含 id、theme、content、slug 等属性。
  • 根据模板类型('wp_template' 或 'wp_template_part')进行特定处理,如注册模板检查、默认模板类型设置、post_types 或 area 属性添加。
  • 对模板内容应用 apply_block_hooks_to_content() 函数,以插入钩子块并设置元数据。
  • 对于 'wp_template_part' 类型,内容会先包装在模拟模板部分块中,再进行处理。

代码示例

function _build_block_template_result_from_file( $template_file, $template_type ) {
    $default_template_types = get_default_block_template_types();
    $theme                  = get_stylesheet();

    $template                 = new WP_Block_Template();
    $template->id             = $theme . '//' . $template_file['slug'];
    $template->theme          = $theme;
    $template->content        = file_get_contents( $template_file['path'] );
    $template->slug           = $template_file['slug'];
    $template->source         = 'theme';
    $template->type           = $template_type;
    $template->title          = ! empty( $template_file['title'] ) ? $template_file['title'] : $template_file['slug'];
    $template->status         = 'publish';
    $template->has_theme_file = true;
    $template->is_custom      = true;
    $template->modified       = null;

    if ( 'wp_template' === $template_type ) {
        $registered_template = WP_Block_Templates_Registry::get_instance()->get_by_slug( $template_file['slug'] );
        if ( $registered_template ) {
            $template->plugin      = $registered_template->plugin;
            $template->title       = empty( $template->title ) || $template->title === $template->slug ? $registered_template->title : $template->title;
            $template->description = empty( $template->description ) ? $registered_template->description : $template->description;
        }
    }

    if ( 'wp_template' === $template_type && isset( $default_template_types[ $template_file['slug'] ] ) ) {
        $template->description = $default_template_types[ $template_file['slug'] ]['description'];
        $template->title       = $default_template_types[ $template_file['slug'] ]['title'];
        $template->is_custom   = false;
    }

    if ( 'wp_template' === $template_type && isset( $template_file['postTypes'] ) ) {
        $template->post_types = $template_file['postTypes'];
    }

    if ( 'wp_template_part' === $template_type && isset( $template_file['area'] ) ) {
        $template->area = $template_file['area'];
    }

    if ( 'wp_template_part' === $template->type ) {
        $content           = get_comment_delimited_block_content(
            'core/template-part',
            array(),
            $template->content
        );
        $content           = apply_block_hooks_to_content(
            $content,
            $template,
            'insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata'
        );
        $template->content = remove_serialized_parent_block( $content );
    } else {
        $template->content = apply_block_hooks_to_content(
            $template->content,
            $template,
            'insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata'
        );
    }

    return $template;
}

注意事项

  • 函数内部使用 file_get_contents() 读取模板文件内容,需确保文件路径有效。
  • 对于 'wp_template' 类型,会检查 WP_Block_Templates_Registry 中的注册模板,并优先使用其属性。
  • 默认模板类型(如 'index'、'single')会覆盖 title 和 description,并将 is_custom 设为 false。
  • 模板部分('wp_template_part')的内容处理涉及包装和序列化块操作,以支持钩子块插入。
  • 函数自 WordPress 5.9.0 引入,6.3.0 版本添加了 modified 属性。

📄 原文内容

Builds a unified template object based on a theme file.

Parameters

$template_filearrayrequired
Theme file.
$template_typestringrequired
Template type. Either 'wp_template' or 'wp_template_part'.

Return

WP_Block_Template Template.

Source

function _build_block_template_result_from_file( $template_file, $template_type ) {
	$default_template_types = get_default_block_template_types();
	$theme                  = get_stylesheet();

	$template                 = new WP_Block_Template();
	$template->id             = $theme . '//' . $template_file['slug'];
	$template->theme          = $theme;
	$template->content        = file_get_contents( $template_file['path'] );
	$template->slug           = $template_file['slug'];
	$template->source         = 'theme';
	$template->type           = $template_type;
	$template->title          = ! empty( $template_file['title'] ) ? $template_file['title'] : $template_file['slug'];
	$template->status         = 'publish';
	$template->has_theme_file = true;
	$template->is_custom      = true;
	$template->modified       = null;

	if ( 'wp_template' === $template_type ) {
		$registered_template = WP_Block_Templates_Registry::get_instance()->get_by_slug( $template_file['slug'] );
		if ( $registered_template ) {
			$template->plugin      = $registered_template->plugin;
			$template->title       = empty( $template->title ) || $template->title === $template->slug ? $registered_template->title : $template->title;
			$template->description = empty( $template->description ) ? $registered_template->description : $template->description;
		}
	}

	if ( 'wp_template' === $template_type && isset( $default_template_types[ $template_file['slug'] ] ) ) {
		$template->description = $default_template_types[ $template_file['slug'] ]['description'];
		$template->title       = $default_template_types[ $template_file['slug'] ]['title'];
		$template->is_custom   = false;
	}

	if ( 'wp_template' === $template_type && isset( $template_file['postTypes'] ) ) {
		$template->post_types = $template_file['postTypes'];
	}

	if ( 'wp_template_part' === $template_type && isset( $template_file['area'] ) ) {
		$template->area = $template_file['area'];
	}

	if ( 'wp_template_part' === $template->type ) {
		/*
		 * In order for hooked blocks to be inserted at positions first_child and last_child in a template part,
		 * we need to wrap its content a mock template part block and traverse it.
		 */
		$content           = get_comment_delimited_block_content(
			'core/template-part',
			array(),
			$template->content
		);
		$content           = apply_block_hooks_to_content(
			$content,
			$template,
			'insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata'
		);
		$template->content = remove_serialized_parent_block( $content );
	} else {
		$template->content = apply_block_hooks_to_content(
			$template->content,
			$template,
			'insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata'
		);
	}

	return $template;
}

Changelog

Version Description
6.3.0 Added modified property to template objects.
5.9.0 Introduced.