刚学主题那会儿,我做过一件蠢事:想给“关于”页面换个样式,于是新建了一个 page.php,认认真真改了半小时。改完刷新文章页——纹丝不动。
当时我以为是自己改错了,又折腾了半天。后来才明白:文章页根本不用 page.php。
这就是“模板层级”在起作用。它决定了你访问一个地址时,WordPress 到底去主题目录里挑哪个文件。
你可以把 WordPress 想成一个特别守规矩的图书管理员。你说“我要文章页”,他不会随手拿一本,而是按一张优先级清单从上往下找:
这张清单,就是模板层级。它不是一个文件,是 WordPress 内部的一组查找规则。
当 is_single() 为真(也就是访问一篇文章),WordPress 按这个顺序找:
single-{文章类型}-{别名}.php
single-{文章类型}.php
single.php
singular.php
index.php
逐个解释一下:
single-{文章类型}-{别名}.php:最具体。比如 single-post-html-css-table.php,只给这一篇文章用。single-{文章类型}.php:稍微宽一点。比如 single-post.php,给所有“post”类型的文章用。single.php:所有文章通用。singular.php:单篇内容通用(文章和页面都算)。index.php:最终兜底,什么都能接。找到第一个存在的文件,就用它,后面的不再看。
当 is_page() 为真(访问一个独立页面,比如“关于本站”),顺序是另一条:
自定义页面模板(如果在后台选过)
page-{别名}.php
page-{ID}.php
page.php
singular.php
index.php
page-{别名}.php:比如 page-about.php,只给“关于”页用。page-{ID}.php:比如 page-8.php,按页面 ID 指定。page.php:所有页面通用。singular.php → index.php。看明白了吗?文章走 single 那条线,页面走 page 那条线,两条线互不相干。所以你建了 page.php,访问文章当然不生效——文章根本不看 page.php。
注意两条线的最后都是 index.php。这就是为什么一个主题最少要两个文件(style.css 和 index.php)——因为不管什么页面,实在找不到专用模板,最后都能落到 index.php。
反过来说:如果你删掉 single.php,文章页不会报错,它会自动用 index.php 来显示。只是长得跟首页一样而已。
caogenbj 主题只有 single.php 和 page.php,没有 single-post.php、page-about.php 这类更具体的文件。所以:
single.php;page.php。这就是为什么它两个模板就能撑起整个站的内容页——因为绝大多数主题也用不到更具体的那些。
光记这张表容易忘。我给你一段代码,加进去之后,打开任意页面,右键“查看网页源代码”,就能看到当前用的是哪个模板。
把这段加到主题的 functions.php 里:
add_filter( 'template_include', function ( $t ) {
if ( is_admin() ) return $t;
echo '<!-- 当前模板:' . basename( $t ) . ' -->';
return $t;
} );
加完刷新页面,看源码,会多出一行注释:
<!-- 当前模板:single.php -->
换一个页面再看,会变成 page.php、category.php……
这个技巧能瞬间治好“模板层级靠背”的毛病。不用记表,看一眼就知道。测试完记得把这行删掉,别留在正式站上(虽然只是个注释,但没必要留着)。
有人会问:那首页呢?首页算 single 还是 page?
都不算。首页有自己的一条线,而且分两种情况:
home.php → index.php;front-page.php → page.php → index.php。front-page.php 和 home.php 的区别,下一篇文章会连同分类页、标签页、搜索页、404 一起讲完。
一句话记住:模板层级 = 从“最具体”查到“最通用”的一张优先级清单,index.php 是最后的兜底。
文章走 single 线,页面走 page 线,两条线互不相干——这就是为什么你建了 page.php,访问文章却不生效。
下一篇,我们把剩下一半补齐:分类页、标签页、搜索页、404,各走哪条线。