如果你曾经自定义过你的主题,并看到更新如何抹去你所有的更改,那么你已经知道为什么存在 WordPress 子主题 (或子主题)。子主题是一个继承了另一个主题(父主题)所有设计和功能的テーマ,它允许你只修改你想改变的部分:一些样式、一个模板、一些功能。这个设计的妙处在于你的更改存在于一个独立的文件夹中,这样当父主题更新时(为了安全和兼容性,它必须更新),你的自定义内容仍然完好无损。它是 WordPress 官方用于自定义第三方主题的机制,创建它实际上只需要两个文件和五分钟。在本指南中,我们将了解子主题到底是什么,何时真正需要它(何时不需要),如何使用完整代码一步步创建它,使其成为可能模板层次结构如何运作,以及从一开始就应避免的典型错误。
什么是子主题以及继承如何运作
子主题是...内部的一个文件夹 wp-content/themes 它通过样式表中的一行声明其父主题是另一个已安装的主题。从该声明开始,WordPress 应用一个简单而强大的规则:
- 对于 PHP 模板: 如果文件存在于子主题中,则使用子主题的文件;如果不存在,则使用父主题的文件。复制
header.php从父主题到子主题,并在那里编辑它会替换头部,而不会触及原始文件。 - 对于样式和功能: 不会替换,而是累加。
functions.php子主题的被加载 此外 父主题的(以及之前),子主题的 CSS 与父主题的 CSS 一起排队,以覆盖特定规则。
实际结果是:父主题仍然是核心(并且可以正常更新),而子主题则作为一层薄薄的图层,包含你的差异。更新父主题绝不会触及子主题的文件夹,因此你的更改在任何更新后都能保留。
何时需要子主题(何时不需要)
并非所有自定义都值得使用子主题。分界线很明确:
如果你需要一个子主题…
- 你将要 编辑主题文件:PHP 模板,或超出少量调整的 CSS。
- 你想 添加与设计相关的功能 (注册一个额外的菜单、一个小工具区域、图片尺寸)。
- 你维护客户网站,并且更新必须能够安全地应用。
如果你不需要它…
- 你只想 一些 CSS 调整: el campo “CSS adicional” del personalizador (o de los estilos globales en temas de bloques) los guarda en la base de datos, a salvo de actualizaciones.
- 你的更改是 纯粹的功能 (一个短代码、一个 WooCommerce 设置、一个跟踪代码片段):这属于插件或代码片段管理器,例如 WPCode,因为它也必须在主题更改后继续存在。
- 你使用一个 现代块主题 并且你所有的更改都可以在站点编辑器中完成:在那里进行的修改已经保存到数据库中。
黄金法则:涉及主题文件的设计,归子主题;独立于设计的功能,归插件。如果你仍在选择主题,也要考虑到这一点:一个良好且维护得当的主题值得在自定义之前投入少量精力创建一个子主题。在我们的指南中 65. 如何为您的WordPress网站选择完美主题 我们回顾一下区分一个可靠主题的标志。
如何一步步创建 WordPress 子主题
我们将为示例父主题创建一个子主题;我们将使用 Astra,但对于任何经典主题,过程都是相同的:只需更改父主题的标识符。你需要访问文件(SFTP 或主机管理器),或者在本地使用文件浏览器。
步骤 1:创建文件夹
在...内部 wp-content/themes,创建一个新文件夹。按照惯例,使用父主题名称加上后缀 -child:
wp-content/themes/astra-child/
├── style.css
└── functions.php
步骤 2:创建带有头部的 style.css
该文件 style.css 是强制性的,其注释头是将文件夹转换为主题的关键。关键行是 Template:它必须包含父主题文件夹的精确名称(区分大小写):
/*
Theme Name: Astra Child
Theme URI: https://biblioweb.es/
Description: Tema hijo de Astra para personalizaciones seguras
Author: BiblioWeb
Author URI: https://biblioweb.es/
Template: astra
Version: 1.0.0
Text Domain: astra-child
*/
/* A partir de aquí, tus estilos personalizados. */
步骤 3:在 functions.php 中排队样式
与过去的做法相反(使用 @import(如今因速度慢而不推荐),父主题的样式表通过正确的排队从 functions.php:
<?php
/**
* Encolar la hoja de estilos del tema padre y la del hijo.
*/
add_action( 'wp_enqueue_scripts', 'astra_child_enqueue_styles' );
function astra_child_enqueue_styles() {
// Estilos del padre.
wp_enqueue_style(
'astra-parent-style',
get_template_directory_uri() . '/style.css',
array(),
wp_get_theme( get_template() )->get( 'Version' )
);
// Estilos del hijo, cargados después para poder sobrescribir.
wp_enqueue_style(
'astra-child-style',
get_stylesheet_directory_uri() . '/style.css',
array( 'astra-parent-style' ),
wp_get_theme()->get( 'Version' )
);
}
注意这两个孪生函数的细节: get_template_directory_uri() 始终指向 父主题 y get_stylesheet_directory_uri() 到 子主题混淆它们是子主题一半问题的根源。注意:有些主题(包括 Astra)已经以子主题自动加载的方式排队其样式;如果你看到重复的样式,请简化排队,只保留具有适当依赖关系的子主题样式表。
步骤 4:激活并检查
10. 前往 外观: verás “Astra Child” como un tema más. Actívalo. La web debe verse exactamente igual que con el padre; si se ve sin estilos, revisa el valor de Template 16. 和入队。这样,你的 screenshot.png 15. (1200×900) 到子主题文件夹,以便在选择器中显示缩略图。
14. 步骤 5 (可选):覆盖模板
13. 要修改父主题的模板,请将其复制到子主题,遵循其相对路径并在那里编辑。例如,要自定义单个文章模板,请复制 single.php 12. 从父主题到子主题的根目录;对于子文件夹中的模板(在 WooCommerce 中很常见),请遵循其结构: woocommerce/single-product.php11. 。WordPress 将自动使用你的副本。
10. 从子主题自定义什么:有用示例
9. 结构搭建完成后,子主题就变成了你的安全工作空间。一些常见用途:
8. 自定义样式
/* En style.css del hijo */
.site-title {
font-size: 2.2rem;
letter-spacing: -0.02em;
}
.entry-content a {
text-decoration: underline;
text-underline-offset: 3px;
}
7. 与设计相关的功能
// En functions.php del hijo: registrar un menú adicional.
add_action( 'after_setup_theme', 'astra_child_menus' );
function astra_child_menus() {
register_nav_menu( 'menu-legal', 'Menú legal del pie' );
}
// Un tamaño de imagen a medida para tarjetas del blog.
add_action( 'after_setup_theme', 'astra_child_image_sizes' );
function astra_child_image_sizes() {
add_image_size( 'tarjeta-blog', 600, 400, true );
}
6. 记住上一节的标准:如果代码片段不依赖于设计(分析、重定向、行为调整),就不要将其放入 functions.php 5. 子主题的;将其移至自己的插件或代码片段管理器,以便它能在未来主题更改中幸存。许多 4. WordPress 必备插件 3. 它们的存在正是为了避免将所有内容都放入主题。
2. 子主题常见错误
- 1. 模板拼写错误。 如果
Template: astrano coincide exactamente con el nombre de la carpeta del padre, WordPress mostrará el hijo como “roto”. Es el fallo número uno. - 在 CSS 中使用 @import。 它有效,但会序列化下载并降低速度。请始终从
functions.php. - 复制过多的模板。 复制到子主题的每个模板将不再接收父主题在其更新中包含的改进。只复制你真正要修改的内容,并在父主题发布重大更改时检查你的副本。
- 混淆 functions.php。 El del hijo no sustituye al del padre: ambos se cargan. Si declaras una función con el mismo nombre que una del padre no “la sobrescribes”: provocas un error fatal, salvo que el padre la haya envuelto en
function_exists(). - 在自定义父主题后创建子主题。 正确的顺序是:安装父主题,创建子主题,激活子主题,然后才能进行个性化设置。自定义器设置是按主题保存的,因此激活子主题时可能需要重新配置一些选项(或使用设置导出插件进行迁移)。
- 未备份就编辑。 PHP 语法错误位于
functions.php网站崩溃。通过 SFTP 编辑(切勿在生产环境中使用桌面文件编辑器),并保留最新副本以便快速撤消。
子主题与区块主题:2026年的细微差别
对于区块主题(全站编辑),大部分经典自定义(页眉、页脚、模板)都是在站点编辑器中可视化完成并保存到数据库中,而不是文件中。这减少了子主题必不可少的情况,但并未淘汰它:它仍然是添加结构化CSS、修改 theme.json (主题的全局样式设置,子主题也可以覆盖),注册自己的模式或修改父主题的HTML模板。继承机制的工作方式相同:相同的 style.css 及其 Template,以及子主题的模板(在文件夹中 templates/)优先于父主题的文件。完整参考资料可在 developer.wordpress.org上的子主题官方手册.
常见问题
子主题会影响WordPress的性能吗?
影响微乎其微:一个额外的样式表(通常很小)和一个 functions.php 额外。如果构建良好,引入正确且没有 @import,一个子主题不会明显减慢网站速度。
我可以创建一个子主题的子主题吗?
不。WordPress只支持一个继承级别:子主题不能成为另一个主题的父主题。如果你需要变体,请使用一个组织良好的子主题,或考虑采用不同的方法(自定义模板、个性化插件)。
如果我更换父主题会怎样?
子主题与其特定的父主题绑定:如果你激活另一个主题,子主题将无法按原样工作。样式和模板很少可移植(它们依赖于父主题的类和结构),但独立于设计的功能可以,这是将
有没有插件可以帮我创建子主题?
是的,像Child Theme Configurator这样的插件可以一键生成结构,甚至可以将父主题的自定义设置迁移到子主题。如果你不想修改文件,这是一个合法的选择,尽管如你所见,手动过程只需要两个文件和五分钟,并且理解它将在每次出现问题时帮助你。
结论
WordPress子主题是那些定义了“良好个性化”与“有过期日期的个性化”之间区别的小部件之一。两个文件(style.css 及其头部信息和 functions.php (通过排队加载)足以将你的更改与原始主题分离,并使其免受更新的影响。避免出错的规则只有三条:在个性化之前创建子主题,只将你真正修改的模板复制到子主题中,并保留 functions.php 主题的设计功能,将通用功能留在插件中。如果你的网站使用第三方主题,并且你打算修改其文件中的任何一行代码,请不要犹豫:今天就设置子主题。这是WordPress生态系统中最划算的五分钟投资。