输入一个网址后,WordPress 在后台到底忙了什么

作者: admin 分类: wordpress主题制作教程 发布时间: 2026-11-06 18:25

先说一段我自己的教训

我学 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。

第二步:WordPress 启动

这个 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,所以就用它。

第六步:模板执行,拼出 HTML

single.php 被打开执行。它第一行是:

<?php get_header(); ?>

这一行把 header.php 的内容“搬”进来(注意是搬,不是函数调用,第五篇会细讲)。接着输出文章标题、正文,再调 get_sidebar() 把侧栏搬进来,最后 get_footer() 把页脚搬进来。

所有内容拼完,变成一段完整的 HTML,返回给浏览器。浏览器渲染,你就看到了那个页面。

关键认知:主题只管最后两步

把六步再看一遍,你会发现分工是这样的:

步骤 谁负责
① 浏览器向服务器要内容 Web 服务器(Nginx)
② WordPress 启动 WordPress 核心
③ 判断页面类型 WordPress 核心
④ 查数据库 WordPress 核心
⑤ 选模板 主题
⑥ 模板输出 主题

主题开发者只负责 ⑤ 和 ⑥。前面四步全是 WordPress 自己干的,你改主题改不到它们。

这句话能解释很多困惑:

  • 为什么我改了 CSS,页面结构却没变?——因为 CSS 只管“怎么画”,结构是第 ⑥ 步输出的。
  • 为什么我改了 functions.php,某个页面还是老样子?——可能是第 ⑤ 步选了别的模板,你改的那个文件根本没被用到。
  • 为什么插件能改页面的东西?——它在第 ② 步就加载了,比模板早。

现在回答开头那个问题

为什么只改 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 输出 → 浏览器渲染

这张图,就是整个系列的骨架。后面每一篇,都是在这张图上补一个节点:

  • 第二、三篇补“选模板”这一步——模板层级到底怎么选;
  • 第四、五、六篇补“主题的骨架”——最小文件集、拼装机制、主题的“身份证”;
  • 第七篇拿 caogenbj 这个真实主题走一遍;
  • 第八篇把整张图复盘一遍;
  • 卷二开始,补“主体”里那段最核心的循环。

小结

一句话记住:一个页面 = WordPress 核心准备好数据 + 模板层级选中一个文件 + 那个文件把零件拼起来。

主题开发,改的就是最后这一段。

下一篇,我们专门拆“选模板”这一步——模板层级到底怎么选,以及为什么你建了 page.php,访问文章却不生效。

本系列导航

相关文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Powered by 草根站长笔记 © 2015-2026 草根站长笔记 Inc.版权所有,禁止转载