刚刚看到WordPress官方消息(原文),WordPress 4.7 将带来新的主题开发相关函数和钩子,如果你是主题开发者,一起来了解一下吧。
注:以下函数和钩子可能会有进一步更改!
get_theme_file_uri()及相关函数
WordPress 3.0 引进了 get_template_part() 函数,可以用来加载主题的文件,它会先在子主题中找到该文件,如果子主题没有就在父主题查找,这样就可以允许通过子主题来覆盖父主题的某些文件。
WordPress 4.7 将引进一个新的 get_theme_file_uri() 函数,允许子主题获取主题文件路径,比如用于引用css或js脚本,例如:
wp_enqueue_script( 'my-script', get_theme_file_uri( 'js/my-script.js' ) );
上面的代码将先在子主题中引用 js/my-script.js 的网址,如果不存在就在父主题引用。这样一来,子主题就可以覆盖父主题引用的css和js脚本。当然,如果没有使用子主题,那该函数也一样可以在父主题中正常使用。
WordPress 4.7 也会带来另一个相关函数 get_theme_file_path()
,它相当于 get_theme_file_uri() 的文件路径。该函数的一个可能用途是,当你想为这个css或js添加时间戳版本的时候(使用 filemtime()),就可以使用这个函数:
wp_enqueue_script(
'my-script',
get_theme_file_uri( 'js/my-script.js' ),
array(),
filemtime( get_theme_file_path( 'js/my-script.js' ) )
);
此外,还新增了 get_parent_theme_file_uri() 和 get_parent_theme_file_path() 函数,专用于引用父主题的文件网址和路径。为了保持一致性,这些函数可以用来分别替代你可能使用的 get_template_directory_uri()
和 get_template_directory()。
{$type}_template_hierarchy 过滤钩子
这些动态命名的钩子允许主题或插件通过特定的请求来过滤模板层级(template hierarchy)。虽然技术上可以使用 template_include 钩子来实现过滤模板层级,但是新的过滤钩子更加直接、简单、和长远,而且不需要在钩子的回调函数中重新实现整个层级逻辑。
可用的钩子名如下:
embed_template_hierarchy
404_template_hierarchy
search_template_hierarchy
frontpage_template_hierarchy
home_template_hierarchy
taxonomy_template_hierarchy
attachment_template_hierarchy
single_template_hierarchy
page_template_hierarchy
singular_template_hierarchy
category_template_hierarchy
tag_template_hierarchy
author_template_hierarchy
date_template_hierarchy
archive_template_hierarchy
paged_template_hierarchy
index_template_hierarchy
下面整个例子就是通过新的钩子添加一个基于年份的模板文件到日期存档的最高层级:
add_filter( 'date_template_hierarchy', function( array $templates ) {
$year = get_query_var( 'year' );
array_unshift( $templates, "year-{$year}.php" );
return $templates;
} );
下面整个稍微复杂一点的例子,添加一个基于分类项目Meta字段值的模板文件到分类归档层级中:
add_filter( 'category_template_hierarchy', function( array $templates ) {
$format = get_term_meta( get_queried_object_id(), 'format', true );
if ( $format ) {
$new = "category-format-{$format}.php";
$pos = array_search( 'category.php', $templates );
array_splice( $templates, $pos, 0, $new );
}
return $templates;
} );
更多例子请看 #14310
这些钩子同样支持调试类插件来访问和显示每次请求的模板层级,以便让你了解 WordPress 在你主题中查找什么文件。最新版本的 Query Monitor 已经支持这个功能。
需要注意的是,WordPress 模板层级的一致性使得标准化主题结构成为可能,强烈建议不要使用这些钩子来移除候选层级模板文件,除非你知道自己在做什么!
支持非ASCII编码命名的模板文件
如果你给文章或项目使用非ASCII编码命名,例如,名字的URL编码(URL-encoded)形式将可以在模板层级中使用。例如,WordPress 4.7 之前的文章查找的层级如下:
这不是很人性化,所以 WordPress 4.7 增加了一个新的、更高的优先级的模板,支持非编码形式命名:
这就可以让你很清楚地看到哪些文件是用于特定的非ASCII编码命名的文章。
大家都知道,中文是非ASCII编码,那这个改进是否意味着可以使用中文命名模板文件:
single-post-世界你好.php?哈哈哈……
wordpress这两年更新挺勤的
的确,保持更新势头挺好的,不像国内很多程序几年都不更新,安全性都得不到保证
我个人觉得,有利有弊,弊在老是在头部自动多出自己用不上的功能!
我的已经升级到了4.6.1版本,今后可能会蛮长一段时间不会再升级。因为,每次升级都会在头部多出一些东西,而这些又是自己用不上的,还得想办法去掉它,真是麻烦!