本文解释了 WordPress 如何根据模板层级决定在单个页面上使用哪个模板文件,帮助开发者自定义主题时选择正确的文件进行编辑。模板层级基于查询字符串匹配,从特定文件到通用文件依次查找,直到找到匹配的模板。
function author_role_template( $templates = '' ) {
$author = get_queried_object();
$role = $author->roles[0];
if ( ! is_array( $templates ) && ! empty( $templates ) ) {
$templates = locate_template( array( "author-$role.php", $templates ), false );
} elseif ( empty( $templates ) ) {
$templates = locate_template( "author-$role.php", false );
} else {
$new_template = locate_template( array( "author-$role.php" ) );
if ( ! empty( $new_template ) ) {
array_unshift( $templates, $new_template );
}
}
return $templates;
}
add_filter( 'author_template', 'author_role_template' );As discussed, template files are modular, reusable files, used to generate the web pages on your WordPress site. Some template files (such as the header and footer template) are used on all of your site’s pages, while others are used only under specific conditions.
This article explains how WordPress determines which template file(s) to use on individual pages. If you want to customize an existing WordPress theme it will help you decide which template file needs to be edited.
WordPress uses the query string to decide which template or set of templates should be used to display the page. The query string is information that is contained in the link to each part of your website.
Put simply, WordPress searches down through the template hierarchy until it finds a matching template file. To determine which template file to use, WordPress:
With the exception of the basic index.php template file, you can choose whether you want to implement a particular template file or not.
If WordPress cannot find a template file with a matching name, it will skip to the next file in the hierarchy. If WordPress cannot find any matching template file, the theme’s index.php file will be used.
When you are using a child theme, any file you add to your child theme will over-ride the same file in the parent theme. For example, both themes contain the same template category.php, then child theme’s template is used.
If a child theme contains the specific template such as category-unicorns.php and the parent theme contains lower prioritized template such as category.php, then child theme’s category-unicorns.php is used.
Contrary, if a child theme contains general template only such as category.php and the parent theme contains the specific one such as category-unicorns.php, then parent’s template category-unicorns.php is used.
If your blog is at http://example.com/blog/ and a visitor clicks on a link to a category page such as http://example.com/blog/category/your-cat/, WordPress looks for a template file in the current theme’s directory that matches the category’s ID to generate the correct page. More specifically, WordPress follows this procedure:
category-unicorns.php.category-unicorns.php is missing and the category’s ID is 4, WordPress looks for a template file named category-4.php.category-4.php is missing, WordPress will look for a generic category template file, category.php.category.php does not exist, WordPress will look for a generic archive template, archive.php.archive.php is also missing, WordPress will fall back to the main theme template file, index.php.The following diagram shows which template files are called to generate a WordPress page based on the WordPress template hierarchy.

While the template hierarchy is easier to understand as a diagram, the following sections describe the order in which template files are called by WordPress for a number of query types.
By default, WordPress sets your site’s home page to display your latest blog posts. This page is called the blog posts index. You can also set your blog posts to display on a separate static page. The template file home.php is used to render the blog posts index, whether it is being used as the front page or on separate static page. If home.php does not exist, WordPress will use index.php.
home.phpindex.phpfront-page.php exists, it will override the home.php template.The front-page.php template file is used to render your site’s front page, whether the front page displays the blog posts index (mentioned above) or a static page. The front page template takes precedence over the blog posts index (home.php) template. If the front-page.php file does not exist, WordPress will either use the home.php or page.php files depending on the setup in Settings Reading. If neither of those files exist, it will use the index.php file.
front-page.php – Used for both “your latest posts” or “a static page” as set in the front page displays section of Settings Reading.home.php – If WordPress cannot find front-page.php and “your latest posts” is set in the front page displays section, it will look for home.php. Additionally, WordPress will look for this file when the posts page is set in the front page displays section.page.php – When “front page” is set in the front page displays section.index.php – When “your latest posts” is set in the front page displays section but home.php does not exist or when front page is set but page.php does not exist.As you can see, there are a lot of rules to what path WordPress takes. Using the chart above is the best way to determine what WordPress will display.
The privacy-policy.php template file is used to render your site’s Privacy Policy page. The Privacy Policy page template takes precedence over the static page (page.php) template. If the privacy-policy.php file does not exist, WordPress will either use the page.php or singular.php files depending on the available templates. If neither of those files exist, it will use the index.php file.
privacy-policy.php – Used for the Privacy Policy page set in the Change your Privacy Policy page section of Settings Privacy.custom template file – The page template assigned to the page. See get_page_templates().page-{slug}.php – If the page slug is privacy, WordPress will look to use page-privacy.php.page-{id}.php – If the page ID is 6, WordPress will look to use page-6.php.page.phpsingular.phpindex.php The single post template file is used to render a single post. WordPress uses the following path:
single-{post-type}-{slug}.php – (Since 4.4) First, WordPress looks for a template for the specific post. For example, if post type is product and the post slug is dmc-12, WordPress would look for single-product-dmc-12.php.single-{post-type}.php – If the post type is product, WordPress would look for single-product.php.single.php – WordPress then falls back to single.php.singular.php – Then it falls back to singular.php.index.php – Finally, as mentioned above, WordPress ultimately falls back to index.php.The template file used to render a static page (page post-type). Note that unlike other post-types, page is special to WordPress and uses the following path:
custom template file – The page template assigned to the page. See <a href="https://developer.wordpress.org/reference/functions/get_page_templates/">get_page_templates()</a>.page-{slug}.php – If the page slug is recent-news, WordPress will look to use page-recent-news.php.page-{id}.php – If the page ID is 6, WordPress will look to use page-6.php.page.phpsingular.phpindex.phpRendering category archive index pages uses the following path in WordPress:
category-{slug}.php – If the category’s slug is news, WordPress will look for category-news.php.category-{id}.php – If the category’s ID is 6, WordPress will look for category-6.php.category.phparchive.phpindex.phpTo display a tag archive index page, WordPress uses the following path:
tag-{slug}.php – If the tag’s slug is sometag, WordPress will look for tag-sometag.php.tag-{id}.php – If the tag’s ID is 6, WordPress will look for tag-6.php.tag.phparchive.phpindex.phpCustom taxonomies use a slightly different template file path:
taxonomy-{taxonomy}-{term}.php – If the taxonomy is sometax, and taxonomy’s term is someterm, WordPress will look for taxonomy-sometax-someterm.php. In the case of post formats, the taxonomy is ‘post_format’ and the terms are ‘post-format-{format}. i.e. taxonomy-post_format-post-format-link.php for the link post format.taxonomy-{taxonomy}.php – If the taxonomy were sometax, WordPress would look for taxonomy-sometax.php.taxonomy.phparchive.phpindex.phpCustom Post Types use the following path to render the appropriate archive index page.
archive-{post_type}.php – If the post type is product, WordPress will look for archive-product.php.archive.phpindex.php(For rendering a single post type template, refer to the single post display section above.)
Based on the above examples, rendering author archive index pages is fairly explanatory:
author-{nicename}.php – If the author’s nice name is matt, WordPress will look for author-matt.php.author-{id}.php – If the author’s ID were 6, WordPress will look for author-6.php.author.phparchive.phpindex.phpDate-based archive index pages are rendered as you would expect:
date.phparchive.phpindex.phpSearch results follow the same pattern as other template types:
search.phpindex.phpLikewise, 404 template files are called in this order:
404.phpindex.phpRendering an attachment page (attachment post-type) uses the following path:
{MIME-type}.php – can be any MIME type (For example: image.php, video.php, pdf.php). For text/plain, the following path is used (in order):
text-plain.phpplain.phptext.phpattachment.phpsingle-attachment-{slug}.php – For example, if the attachment slug is holiday, WordPress would look for single-attachment-holiday.php.single-attachment.phpsingle.phpsingular.phpindex.phpAs of WordPress 6.4, attachment pages are no longer enabled by default on new installations. Users can enable them with a plugin, so it is still good practice to test your theme and ensure it properly displays content when viewing an attachment page.
The embed template file is used to render a post which is being embedded. Since 4.5, WordPress uses the following path:
embed-{post-type}-{post_format}.php – First, WordPress looks for a template for the specific post. For example, if its post type is post and it has the audio format, WordPress would look for embed-post-audio.php.embed-{post-type}.php – If the post type is product, WordPress would look for embed-product.php.embed.php – WordPress then falls back to embed.php.wp-includes/theme-compat/embed.php template.Since WordPress 4.7, any dynamic part of a template name which includes non-ASCII characters in its name actually supports both the un-encoded and the encoded form, in that order. You can choose which to use.
Here’s the page template hierarchy for a page named “Hello World 😀” with an ID of 6:
page-hello-world-😀.phppage-hello-world-%f0%9f%98%80.phppage-6.phppage.phpsingular.phpThe same behaviour applies to post slugs, term names, and author nicenames.
The WordPress template system lets you filter the hierarchy. This means that you can insert and change things at specific points of the hierarchy. The filter (located in the get_query_template() function) uses this filter name: "{$type}_template" where $type is the template type.
Here is a list of all available filters in the template hierarchy:
embed_template404_templatesearch_templatefrontpage_templatehome_templateprivacypolicy_templatetaxonomy_templateattachment_templatesingle_templatepage_templatesingular_templatecategory_templatetag_templateauthor_templatedate_templatearchive_templateindex_templateFor example, let’s take the default author hierarchy:
author-{nicename}.phpauthor-{id}.phpauthor.phpTo add author-{role}.php before author.php, we can manipulate the actual hierarchy using the ‘author_template’ template type. This allows a request for /author/username where username has the role of editor to display using author-editor.php if present in the current themes directory.
function author_role_template( $templates = '' ) {
$author = get_queried_object();
$role = $author->roles[0];
if ( ! is_array( $templates ) && ! empty( $templates ) ) {
$templates = locate_template( array( "author-$role.php", $templates ), false );
} elseif ( empty( $templates ) ) {
$templates = locate_template( "author-$role.php", false );
} else {
$new_template = locate_template( array( "author-$role.php" ) );
if ( ! empty( $new_template ) ) {
array_unshift( $templates, $new_template );
}
}
return $templates;
}
add_filter( 'author_template', 'author_role_template' );
Changelog: