
您是否曾经直接在主题的 functions.php 中编辑 CSS 或添加代码?如果是,您可能遇到过这个痛苦的经历:主题更新时,您所有的自定义内容都被清除了。数小时的 CSS 工作,在您点击"更新"的瞬间化为乌有。
子主题(child theme)是解决这个问题的正确、符合 WordPress 标准的方案。本指南将解释什么是子主题、它的工作原理,以及如何从零开始创建一个 — 手动方式或通过插件。
切勿直接编辑父主题。对父主题文件所做的任何 CSS 或 PHP 更改,都会在下次主题更新时被覆盖。您所有的工作会立即消失,且无法恢复。
什么是 WordPress 子主题?
子主题是一个继承父主题所有内容的子级主题,但它将您的自定义内容存储在自己独立的文件中。这意味着当父主题更新时,您所有的更改都会被保留,因为更新只影响父主题的文件 — 而不是您的子主题。
工作原理:WordPress 首先加载子主题。如果在子主题中找不到所需的文件,它会回退到父主题。这让您只需覆盖需要更改的部分,而无需复制整个主题。
- 在子主题的
style.css中添加 CSS → 覆盖父主题样式 - 在子主题的
functions.php中添加 PHP → 与父主题函数并行运行 - 将模板文件复制到子主题中 → 使用子主题版本而非父主题版本
为什么在自定义之前必须创建子主题
有三个核心原因:
- 安全的主题更新 — 所有自定义内容都保存在子主题中,父主题更新时永远不会被修改
- 接收安全补丁 — 您可以随时更新父主题以修复安全漏洞,而无需担心丢失工作成果
- 清晰的自定义分离 — 更容易调试、备份和迁移,因为所有修改都集中在一个地方
子主题文件结构
子主题在 /wp-content/themes/ 内的新文件夹中,最少需要两个文件:
/wp-content/themes/
my-parent-theme/ ← 父主题(请勿编辑)
my-parent-theme-child/ ← 我们的子主题
style.css ← 必需(头部信息 + 自定义 CSS)
functions.php ← 推荐(加载父主题 CSS)
手动创建子主题
第一步:创建新文件夹
使用 DirectAdmin 文件管理器或 FTP,在 wp-content/themes/ 内创建一个新文件夹。将其命名为类似 twentytwentyfive-child 的名称(如果您的父主题是 Twenty Twenty-Five)。
第二步:创建 style.css
在新文件夹中创建名为 style.css 的文件,内容如下:
/*
Theme Name: Twenty Twenty-Five Child
Template: twentytwentyfive
Description: Child theme of Twenty Twenty-Five
Author: Your Name
Version: 1.0
*/
/* 在此处添加您的自定义 CSS */
最重要的一行是 Template: — 它必须与父主题的文件夹名称完全匹配,包括大小写。
第三步:创建 functions.php
在子主题文件夹中创建 functions.php 文件,以便在子主题样式表之前正确加载父主题的样式表:
<?php
add_action( 'wp_enqueue_scripts', 'my_child_theme_enqueue_styles' );
function my_child_theme_enqueue_styles() {
// 加载父主题样式表
wp_enqueue_style(
'parent-style',
get_template_directory_uri() . '/style.css'
);
// 加载子主题样式表(覆盖父主题)
wp_enqueue_style(
'child-style',
get_stylesheet_directory_uri() . '/style.css',
array( 'parent-style' )
);
}
注意:许多现代主题(使用 theme.json 的块主题)以不同方式加载 CSS。有些不需要手动为父主题调用 wp_enqueue_style。请务必查阅主题文档以确认正确的做法。
激活子主题
- 前往 WordPress 后台 → 外观 → 主题
- 您的新子主题将出现在列表中
- 点击子主题上的激活
- 您的网站外观完全不变 — 子主题从父主题继承了所有内容
使用插件创建子主题(Child Theme Configurator)
如果您不想手动创建文件,插件可以自动处理一切。
使用 Child Theme Configurator
- 安装免费插件 Child Theme Configurator(超过 40 万次活跃安装)
- 前往 工具 → Child Theme Configurator
- 选择您要使用的父主题
- 为子主题命名并设置选项
- 点击 Create Child Theme
- 插件会自动创建文件夹、style.css 和 functions.php,然后立即激活子主题
向子主题添加自定义 CSS
有两种方式添加自定义 CSS:
方式一:直接编辑 style.css
打开子主题中的 style.css,在注释头部之后添加 CSS:
/* 自定义 CSS */
.site-header {
background-color: #059669;
}
.entry-title {
font-size: 2rem;
font-weight: 700;
}
方式二:WordPress 自定义工具
前往 外观 → 自定义 → 附加 CSS。这种方式更方便,但 CSS 存储在数据库中,而不是子主题文件中。
覆盖父主题模板文件
要更改页面布局 — 例如单篇文章模板 — 将模板文件从父主题复制到子主题文件夹中,然后在那里进行编辑。
# 示例:覆盖单篇文章模板
# 从父主题复制:
/wp-content/themes/twentytwentyfive/single.php
# 放入子主题中:
/wp-content/themes/twentytwentyfive-child/single.php
# 按需编辑子主题中的 single.php
# WordPress 会自动使用子主题版本
关键原则:只覆盖您实际需要更改的文件 — 而不是整个主题。复制所有内容会违背子主题的初衷,并让您失去父主题更新的好处。
向子主题 functions.php 添加函数
子主题的 functions.php 与父主题的并行运行 — 它不会替换父主题的。您可以安全地添加钩子、过滤器和自定义函数:
<?php
// 添加自定义统计脚本
add_action( 'wp_head', 'my_custom_analytics' );
function my_custom_analytics() {
// 插入统计或任何自定义脚本
}
// 从单篇文章中移除侧边栏
add_filter( 'theme_mod_single_sidebar', '__return_false' );
// 注册自定义文章类型
add_action( 'init', 'register_my_custom_post_type' );
function register_my_custom_post_type() {
// ...
}
在子主题中使用 theme.json(块主题)
自 WordPress 5.8 起,全站编辑(FSE)改变了主题控制样式和布局的方式。Twenty Twenty-Three、Twenty Twenty-Four 和 Twenty Twenty-Five 等块主题使用 theme.json 文件代替传统 CSS。这意味着块主题的子主题与经典子主题的工作方式略有不同。
在块主题子主题中,您可以创建自己的 theme.json 来覆盖父主题中定义的值。WordPress 会自动合并两个文件 — 子主题的值始终优先。一个常见用例是更改网站的主色调和排版:
{
"$schema": "https://schemas.wp.org/trunk/theme.json",
"version": 2,
"settings": {
"color": {
"palette": [
{ "name": "Primary", "slug": "primary", "color": "#059669" },
{ "name": "Background", "slug": "background", "color": "#f0fdf4" }
]
},
"typography": {
"fontSizes": [
{ "name": "Small", "slug": "small", "size": "14px" },
{ "name": "Normal", "slug": "normal", "size": "16px" },
{ "name": "Large", "slug": "large", "size": "20px" }
]
}
}
}
使用 theme.json 覆盖的优势在于,块编辑器会立即在编辑界面中反映您的自定义颜色和字体 — 无需编写冗长的 CSS 选择器,即可保持编辑器与实际网站同步。
注意:如果父主题是使用 theme.json 的块主题,在 functions.php 中手动加载父主题样式表可能是不必要的 — 甚至可能导致样式重复加载。请务必查阅父主题文档以确认子主题的正确做法。
子主题创建方式对比:手动、插件与 WP-CLI
创建子主题有三种主要方式,各自适合不同的情况:
| 方式 | 最适合 | 优势 | 注意事项 |
|---|---|---|---|
| 手动(style.css + functions.php) | 希望完全掌控的开发者 | 无需额外插件;了解文件结构 | 容易拼错 Template 头部信息或加载顺序 |
| 插件(Child Theme Configurator) | 非技术用户 | 一键设置;图形界面;不会拼写错误 | 需要安装插件;可能遗漏块主题的细节 |
| WP-CLI | 拥有 SSH 访问权限的开发者 | 最快速;可脚本化;可在多个网站重复使用 | 需要在虚拟主机服务器上安装 WP-CLI 和 SSH |
对于没有 SSH 访问权限的共享主机用户,通过 DirectAdmin 文件管理器或 FTP 手动创建是完全可行的。只需创建两个文件即可开始使用。使用 WP-CLI 时,等效的单条命令为:
wp scaffold child-theme twentytwentyfive-child --parent_theme=twentytwentyfive --activate
常见错误及解决方法
子主题的设置相对简单,但在开始之前有一些常见问题值得了解:
- "找不到父主题"错误 —
style.css中的Template:值与父主题的文件夹名称不完全匹配(包括大小写)。请仔细检查wp-content/themes/内的文件夹名称。 - 激活后所有父主题样式消失 — 您忘记在
functions.php中加载父主题样式表,或使用了已弃用的@import方式。请添加正确的wp_enqueue_style调用。 - 子主题显示但似乎不起作用 — 确认子主题在"外观 → 主题"下已真正激活。同时检查 PHP 错误日志,查看
functions.php是否有语法错误。 - 自定义 CSS 没有效果 — 父主题可能使用了优先级更高的选择器覆盖了您的样式。请提高您的选择器优先级,或使用 WordPress 自定义工具的"附加 CSS"字段进行快速覆盖。
- 模板覆盖破坏了布局 — 如果父主题在您复制模板文件后更新了该模板,复制的文件可能已过时。请将子主题版本与当前父主题版本进行比较,并相应更新。
调试技巧:如果激活子主题后网站崩溃,请打开无痕/隐私浏览窗口,前往"外观 → 主题"停用子主题。如果网站恢复正常,问题出在您的子主题文件中 — 而不是服务器或父主题。
长期备份与维护子主题
您的子主题文件夹保存了您对网站所做的所有自定义内容。如果因主机迁移失败、意外删除或服务器故障而丢失,您将失去所有工作成果。请遵循以下实践来确保其安全:
- 单独备份子主题文件夹 — 不要仅依赖全站备份。每次进行重大更改时,将子主题文件夹压缩并保存到本地。
- 使用版本控制(Git) — 将子主题文件夹放入 Git 仓库,以追踪每次更改,并可即时回滚到任何之前的状态。
- 定期更新父主题 — 有了子主题,没有理由推迟安全更新。及时应用父主题更新,保持网站受到保护。
- 每次父主题更新后检查网站 — 偶尔,父主题更新会修改您已覆盖的模板。每次更新后对关键页面进行快速目视检查,可以及早发现问题。
- 递增子主题版本号 — 每次进行重大编辑后,更改
style.css中的Version:值。这可以清除浏览器缓存,并为您提供清晰的更改时间记录。
总结:子主题只需两个文件即可开始使用,但能为每个 WordPress 网站提供长期保护。如果您的网站目前在没有子主题的情况下运行,请立即创建一个 — 在下一次主题更新抹去您的心血之前。
支持完整文件访问的 WordPress 主机 — 低至 500 泰铢/年
AsiaGB 主机完全支持 WordPress 子主题,配备 DirectAdmin、SSD 存储、免费 SSL、文件管理器和 FTP 访问。起价 500 泰铢/年,无隐藏费用。
查看主机方案 →