跳到正文
原文
athemes.com新闻· Muhammad Umair·· 14 小时前编辑评分33

2026 年还需要 WordPress 子主题吗?

WordPress child themes: do you still need one in 2026?

编辑导读

对大多数使用 block theme 的站点,已无需子主题,因为 Site Editor 的更改保存在数据库中,不会被父主题更新覆盖。经典主题模板覆盖、主题专属 PHP、防止客户误改,以及白标交付这四种情况仍适合使用子主题;纯视觉调整可用 Additional CSS,与外观无关的 PHP 则更适合放入插件。

你找到的每份指南都会告诉你,在做任何修改之前先构建一个子主题。这个建议多年来一直正确,但在区块主题上,如今它更多时候是错误的,而不是正确的。

变化之处在于 WordPress 存储编辑内容的位置。站点编辑器中的更改本来就能在父主题更新后保留,因此对于区块主题来说,子主题只是一个毫无收益、需要你维护的文件夹。

目录
  1. 你还需要子主题吗?
  2. 区块主题带来了哪些变化
  3. 决策树
  4. 子主题仍是正确答案的情况
  5. 如何创建子主题
  6. 快捷方式:现成的子主题
  7. 人们常犯的错误
  8. 关于 WordPress 子主题的常见问题
  9. 关于 WordPress 子主题的最后想法

对于大多数使用区块主题的人来说,不需要。站点编辑器中的更改会保存到数据库,而不是主题文件,因此父主题更新无法覆盖它们。保护这些更改最初正是子主题存在的原因。

仍有四种情况需要子主题。第一种是你需要编辑模板文件的经典主题。第二种是应放在 functions.php 中的自定义 PHP。第三种是某个客户站点,其中有人可能在不知情的情况下撤销站点编辑器中的更改。第四种是对主题进行白标处理,以供转售或交付。

如果这些情况都不适用于你,请到此为止,直接使用站点编辑器。本指南其余部分面向上述四种情况所涵盖的人。

区块主题带来了哪些变化

全站编辑将模板编辑从文件转移到了数据库。当你在外观 » 编辑器中编辑页眉、页脚或页面模板时,WordPress 会将该编辑保存为一条数据库记录,指向原始模板,而不是替换文件。

The WordPress Site Editor open at Appearance » Editor with the site's templates listed.

其后果正是旧指南尚未跟上变化的地方。父主题更新会替换主题文件,而你的数据库记录不会受到影响,因此你的自定义内容会自动保留。站点编辑器甚至会显示你已自定义哪些模板,并提供重置选项,这是子主题从未能提供的安全级别。

The Site Editor templates list showing which templates have been customised.

经典主题采用的是旧方式。它们的模板是主题文件夹内的 PHP 文件,更新会覆盖这些文件,你所做的任何更改也会随之消失。这就是为什么建议会因你使用的 theme 类型而产生如此巨大的差异,也是为什么“我需要子主题吗”现在首先要问“这是哪种主题”。

决策树

四种方式几乎涵盖所有自定义需求,选对一种可以省去另外三种方式带来的维护工作。

  • 站点编辑器:用于区块主题的布局、模板、模板部件、颜色、排版和间距。更新后仍会保留,无需代码,并可在同一界面中撤销
  • 附加 CSS:不改变结构的视觉微调,例如颜色、大小或间距调整。位于自定义工具或样式面板中,并在更新后保留
  • 一个小插件:用于与主题外观无关的任何 PHP,例如自定义文章类型、短代码或第三方集成。将其放在插件中意味着它不仅能在主题更新后保留,还能在主题更换后保留
  • 子主题:用于经典主题的模板文件覆盖、主题专用 PHP,以及任何必须无法从管理后台编辑的内容
The Additional CSS panel open in the WordPress Customizer.

选择的标准只有一个问题。问自己:如果明年切换主题,这项更改应该怎么办?根据答案来放置它。任何应该随主题一起离开的内容,都应放在该主题或其子主题中;任何应该保留的内容,都应放在插件中。

这个问题比任何关于文件类型的规则都能更准确地划分情况,这也正是人们 functions.php 文件中的许多内容原本就应该是插件的原因。

何时子主题仍是正确答案

四种情况,直截了当地说明。

  • 覆盖经典主题的模板:你需要更改模板输出的内容,主题属于经典主题,而编辑父主题意味着下次更新时就会丢失这项更改
  • 主题专属的 PHP:你正在添加一个仅在此主题启用时才有意义的过滤器或操作,因此插件并不适合承载它
  • 客户站点:站点编辑器功能强大且一目了然,客户在探索它时可能在不知情的情况下撤销你的工作,而子主题中的代码根本无法在管理后台中编辑
  • 白标:你要以自己的名义发布一个带主题的构建版本,而子主题承载着品牌、截图和元数据

如何创建子主题

整个过程大约需要十分钟,下面这两个文件就是子主题所必需的。

步骤 1:创建子主题文件夹

通过 SFTP 连接到你的站点,或者从主机控制面板打开文件管理器。两种方式最终都会进入同一个位置。

连接后,导航到 wp-content/themes/。所有已安装的主题都存放在这里,无论是父主题还是子主题,每个主题各占一个文件夹。

The Theme File Editor with the theme selector listing every theme installed on the site.

在这里为子主题创建一个新文件夹。以父主题的名称命名,并在末尾加上 -child,这样 botiga 就变成 botiga-child,sydney 就变成 sydney-child。

这种命名方式是一种约定而非硬性要求,但它也是所有人都会遵循的约定,下一个打开这个文件夹的人会因此感谢你。

文件夹名称请保持全小写且不含空格,因为之后每个会操作该文件夹的工具都会因此更容易使用。下划线和连字符都可以,而 WordPress 的其余部分使用的是连字符。

继续之前检查一件事,因为之后它会引发令人困惑的错误。父主题必须已经安装在同一目录中,因为没有父主题的子主题无法激活,而 WordPress 报告这种情况时,很容易被误读为上传损坏。

步骤 2:编写 style.css

在新文件夹中创建一个名为 style.css 的文件,因为 WordPress 会读取文件顶部的注释块,得知这个文件夹本身是一个主题。同一注释块还会告诉 WordPress 这个主题是哪个主题的子主题。

粘贴以下标头,并将其中的值修改为与你的父主题一致。

/*
Theme Name: Botiga Child
Theme URI: https://example.com/botiga-child
Description: Child theme for Botiga
Author: Your name
Template: botiga
Version: 1.0.0
*/
The child theme's style.css open in the Theme File Editor, showing the theme header comment block.

Template 这一行才是真正重要的部分,也是大多数子主题创建失败时出错的地方。它必须与父主题的文件夹名称完全一致,包括小写形式和每个字符。

请根据步骤 1 中看到的文件夹名称核对这一值,而不是根据主题的显示名称核对。Botiga 的文件夹是 botiga,而名为“Botiga Pro”的主题完全可能存放在另一个名称的文件夹中。

The Theme File Editor with the parent theme selected, showing the folder name the Template line must match.

主题名称会显示在外观 » 主题中,因此请将其设置成你在列表中容易识别的名称。代码块中的其他所有内容都是可选的,其存在只是为了整洁而非功能需要,不过填写描述和作者只需十秒,却能让客户交付显得更专业。

你在该注释块下方编写的任何 CSS 都会应用到你的站点,并且它在父主题自身的样式表之后加载,因此当选择器特异性相同时,它会生效。在区块主题中,这通常也是子主题唯一需要使用的文件。

步骤 3:添加 functions.php 并加载父主题样式

在同一文件夹中 alongside style.css 创建一个名为 functions.php 的文件。

区块主题在这个文件中可能完全不需要添加任何内容,因为 WordPress 会自动为你加载父主题的样式表,也没有任何内容需要配置。

经典主题则例外,需要这个文件。必须显式加载父主题的样式表,否则站点将只加载子主题的 CSS,而不会加载父主题的任何 CSS。

<?php
add_action( 'wp_enqueue_scripts', 'child_theme_enqueue_styles' );

function child_theme_enqueue_styles() {
    wp_enqueue_style(
        'parent-style',
        get_template_directory_uri() . '/style.css'
    );
}
The child theme's functions.php open in the Theme File Editor with the parent stylesheet enqueue in place.

这段代码中有两处细节值得理解,而不是盲目复制。get_template_directory_uri()指向父主题,get_stylesheet_directory_uri()指向子主题;将两者对调是常见且容易令人困惑的错误。

另一处是句柄,也就是这里的 parent-style,它必须唯一。如果你的父主题已经注册了同名句柄,请另选一个名称,否则你会悄无声息地覆盖它的注册。

子主题的 functions.php是在父主题的基础上追加,而不是替换它,这与模板文件的行为相反。两个文件会依次运行,因此你永远不需要把父主题的函数复制过来,而这样做通常会因函数重复声明而导致致命错误。

专业提示

在文件顶部打开 PHP 标签,并完全省略结束标签。?>之后多出的一个空行是“headers already sent”警告最常见的成因之一,而不写结束标签可以彻底避免这种可能。

步骤 4:安装并启用子主题

安装方式取决于你在哪里构建了子主题,但两种方式最终都会到达同一位置。

如果你直接在服务器上构建了这个文件夹,那么子主题已经安装完毕。进入外观 » 主题,它就会和其他主题一起显示在那里。

The Appearance » Themes screen with Botiga Child listed among the installed themes.

如果你是 在本地构建的,请先把该文件夹压缩成 .zip 文件。请压缩文件夹本身,而不是其中的内容,因为 WordPress 期望主题文件位于压缩包内下一层目录中。

然后进入外观 » 主题 » 添加新主题,点击屏幕顶部的上传主题。

选择 zip 文件并点击立即安装以上传。WordPress 会将压缩包解压到 wp-content/themes/ 中,并报告是否找到了有效主题,这也是你首次确认 style.css 头部格式正确的依据。

The Upload Theme screen with the child theme zip selected and ready to install.

现在点击子主题上的启用,让页面重新加载。父主题必须保持安装状态,因为子主题会从它继承所有内容,不过父主题无需设为当前启用主题。

Botiga Child showing as the active theme on the Appearance » Themes screen.

加载前台并确认站点外观与启用前完全一致,因为空的子主题会继承所有内容,此时本应没有任何变化。

网站如果突然失去所有样式,几乎总是因为 style.css 中的模板行与父主题文件夹名称不匹配,因此请返回步骤 2,逐字符比较两者。

步骤 5:迁移你的自定义内容

启用子主题后,将你之前在父主题中维护的内容逐项移入子主题,不要一次全部移动。

CSS 放入子主题的 style.css 中,位于页头注释块下方;所有 PHP 则放入子主题的 functions.php 中,位于你在第 3 步添加的入队代码下方。

模板文件与 CSS 和 PHP 的处理方式不同,因为它们是替换而非追加。将文件从父主题复制到子主题中相同的相对路径,使父主题的 template-parts/content.php 成为子主题的 template-parts/content.php,然后只编辑副本。

The Theme File Editor showing the template file copied into the child theme at the same relative path.

只复制实际需要修改的模板文件。复制父主题的整个模板文件夹是子主题最常见的错误,这会让你今后每次更新父主题时,都不得不手动合并那些你根本不需要维护的文件。

每完成一部分就检查前台,而不是全部完成后再检查。找出十一项改动中哪一项弄坏了页面,远比发现是最后一项造成的更让人痛苦。

The site's front end loading correctly with the child theme active and the customisations in place.

所有内容迁移完毕后,撤销你在父主题中的编辑,避免两者在不知情的情况下出现分歧。父主题只要仍保留着你的旧改动,就会继续正常工作,直到某天它被更新;届时,你原以为存在于子主题中的行为就会悄然消失。

至此,子主题就完成了。它已启用,承载着你的自定义内容,而下一次父主题更新不会影响其中任何一项。

快捷方式:现成的子主题

如果你的父主题是我们的主题,子主题已经存在,你可以跳过整个构建过程。

aThemes 通过文档而非 WordPress.org 主题目录提供 Botiga、Sydney 和 Sydney Pro 的现成子主题。每个产品的文档页面都有下载和安装步骤,涵盖 Botiga 子主题、Sydney 子主题和 Sydney Pro 子主题。

最好明确它们的来源,因为在 WordPress.org 搜索 botiga-child 或 sydney-child 子主题不会得到任何结果。它们通过文档提供,而非通过主题目录提供,因此应从文档页面获取。

如果你仍在选择父主题,我们的 WordPress 主题页面介绍了各种选项,而我们最快的 WordPress 主题对比文章则提供了性能数据。

人们常犯的错误

四个错误造成了大多数子主题问题。

  • 复制整个父主题:子主题只应包含你修改过的文件,而复制所有内容会让每次父主题更新都需要手动合并
  • 仍然编辑父主题:如果改动被写入父主题文件,子主题就起不到任何保护作用。这种情况最常发生在主题文件编辑器中,因为同一个下拉菜单可以选择两个主题
  • 忘记截图:如果子主题文件夹中没有一张 1200 × 900 像素的 screenshot.png,该主题在外观 » 主题中会显示为灰色占位符,在客户网站上看起来像是坏了
  • 破坏翻译:子主题不会自动继承父主题的文本域,因此你添加的任何字符串都需要使用正确的文本域,否则无法翻译

如果你使用的是页面构建器而非主题文件,上述大部分内容会换一种形式,我们精选的最佳 WordPress 主题构建器文章涵盖了这些选项。

关于 WordPress 子主题的常见问题

子主题通常会带来一系列类似的问题,尤其是现在区块主题改变了第一个问题的答案。

什么是 WordPress 子主题?

子主题是一种主题,它会继承另一个主题的全部内容,后者称为父主题,并且只覆盖你所更改的部分。它需要一个文件夹、一个包含 Template 行的 style.css,该行用于指定父主题,除此之外不需要任何其他内容。

2026 年还需要使用子主题吗?

对于区块主题,通常不需要,因为站点编辑器的更改会存储在数据库中,并且不会因父主题更新而丢失。如果你仍需覆盖经典主题模板、使用主题专属 PHP、在客户端站点中不希望以站点编辑器为唯一依据,或者需要进行白标定制,则仍需要子主题。

如何创建子主题?

在 wp-content/themes/ 中创建一个文件夹,添加一个 style.css 文件,其头部注释中的 Template 行必须与父主题的文件夹名称完全一致;如果需要 PHP 或加载经典主题样式表,再添加一个 functions.php 文件,然后从 外观 » 主题中启用它。

子主题会拖慢网站速度吗?

不会产生可测量的差异。子主题只会增加一次样式表查找,相较于页面上的其他所有内容而言微不足道。将整个父主题复制到子主题中可能会引发问题,但这属于维护问题,而不是性能问题。

父主题更新时,我的子主题会怎样?

它不会受到影响。父主题的文件会被替换,而子主题的文件会保持不变,这正是你创建子主题时想要的行为。唯一的例外是父主题更新时修改了你已经覆盖的模板;此时你的副本仍可继续使用,但不会包含此次更新新增的内容。

关于 WordPress 子主题的最后思考

对于大多数使用区块主题的人,坦率地说,他们并不需要子主题,而站点编辑器已经完成了人们原本被告知需要用子主题实现的功能。旧版教程尚未更新的正是这一点,而这样可以省去一个文件夹和一项维护工作。

如果你使用经典主题、编写 PHP,或要把网站交给其他人,请创建子主题并尽量保持精简。通常只需要两个文件,任何应当比主题更长久存在的内容都应放在插件中,而不是放在这里。

你使用的是区块主题还是经典主题?这是否改变了你在这里得到的答案?请在下方评论中告诉我。

来源:athemes.com新闻 · https://athemes.com/tutorials/wordpress-child-theme/?utm_source=rss&utm_medium=rss&utm_campaign=wordpress-child-theme

部分链接为推广/关联链接。