_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'.
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;
}