我学 WordPress 主题设计那会儿,最大的困惑不是“这个函数怎么写”,而是——我改了这么多文件,到底哪个在起作用?
header.php、footer.php、index.php、single.php……每个文件我都打开过、改过,但心里一直没底。改完刷新页面,确实变了,可为什么变?说不清。
后来我才想明白:问题不在“函数记不住”,而在于我脑子里没有一张图——不知道“我输入一个网址,WordPress 到底按什么顺序、调了哪些文件、怎么拼出一个页面”。
这张图不建立,看再多模板标签也是散的。所以这个系列第一篇,不急着讲代码,先把这张图给你。
前几天群里有人问:
我只改了 header.php 一个文件,为什么整个网站所有页面的页头都变了?
这个问题看着简单,但它背后就是那张图。要回答它,就得先搞清楚:一个页面到底是怎么来的。
假设你在浏览器里输入 www.caogenbj.com/html-css-table.html,回车。接下来发生的事,可以拆成六步。
浏览器向服务器(这台机器上跑的是 Nginx)发起请求:“我要这个地址的内容。”
Nginx 看了一眼,发现这是个动态请求(不是图片、不是 CSS),于是把它交给 PHP 处理,入口文件是网站根目录下的 index.php。
这个 index.php 本身几乎什么都不干,它只做一件事——把 WordPress 的核心加载起来:
define( 'WP_USE_THEMES', true );
require __DIR__ . '/wp-blog-header.php';
就这两行。加载过程中,WordPress 会依次读入配置、连上数据库、加载所有启用的插件,最后加载当前主题的 functions.php。
注意这个顺序:插件先加载,主题的 functions.php 后加载。这一点后面讲钩子(卷四)时会反复用到——为什么插件能改主题输出的东西,却改不了主题里先执行的那部分代码,根子就在这个顺序上。
WordPress 拿到 html-css-table.html 这个地址,去数据库里查:这是一篇文章?一个独立页面?一个分类?还是根本不存在?
查出来的结果是:这是一篇文章。于是 WordPress 内部有个判断 is_single() 返回了真。
既然是文章,就把这篇文章的标题、正文、作者、发布时间、分类、标签……从数据库里取出来,准备好。
这是主题开发者最该关心的一步。WordPress 手里有一张规则表(叫“模板层级”),既然判断出这是文章页,它就去主题目录里按顺序找:
single-{文章类型}-{别名}.php
single-{文章类型}.php
single.php
singular.php
index.php
从最具体找到最通用,找到哪个用哪个。caogenbj 主题里有 single.php,所以就用它。
single.php 被打开执行。它第一行是:
<?php get_header(); ?>
这一行把 header.php 的内容“搬”进来(注意是搬,不是函数调用,第五篇会细讲)。接着输出文章标题、正文,再调 get_sidebar() 把侧栏搬进来,最后 get_footer() 把页脚搬进来。
所有内容拼完,变成一段完整的 HTML,返回给浏览器。浏览器渲染,你就看到了那个页面。
把六步再看一遍,你会发现分工是这样的:
| 步骤 | 谁负责 |
|---|---|
| ① 浏览器向服务器要内容 | Web 服务器(Nginx) |
| ② WordPress 启动 | WordPress 核心 |
| ③ 判断页面类型 | WordPress 核心 |
| ④ 查数据库 | WordPress 核心 |
| ⑤ 选模板 | 主题 |
| ⑥ 模板输出 | 主题 |
主题开发者只负责 ⑤ 和 ⑥。前面四步全是 WordPress 自己干的,你改主题改不到它们。
这句话能解释很多困惑:
为什么只改 header.php,所有页面都变了?
因为 header.php 不是“首页的页头”,它是“所有页面的页头”。
看 caogenbj 的文件:index.php、single.php、page.php、category.php……每一个模板的第一行,都是 <?php get_header(); ?>。
也就是说,不管访问哪个页面,最后都会去“搬”同一个 header.php。你改它,当然全站都变。同理,footer.php 也是全站共用的。
这就是“拼装”的思路:零件只写一份,到处引用。第五篇会专门讲这个机制。
把六步画成一张图,就是这样:
浏览器请求
↓
Nginx → index.php(入口)
↓
WordPress 启动(配置 → 数据库 → 插件 → 主题 functions.php)
↓
解析地址 → 判断页面类型(is_single? is_page? is_category?)
↓
查数据库,拿到数据
↓
模板层级选文件(single.php / page.php / index.php …)
↓
模板执行:get_header → 主体 → get_sidebar → get_footer
↓
HTML 输出 → 浏览器渲染
这张图,就是整个系列的骨架。后面每一篇,都是在这张图上补一个节点:
一句话记住:一个页面 = WordPress 核心准备好数据 + 模板层级选中一个文件 + 那个文件把零件拼起来。
主题开发,改的就是最后这一段。
下一篇,我们专门拆“选模板”这一步——模板层级到底怎么选,以及为什么你建了 page.php,访问文章却不生效。