搜索全站
主题 8 分钟阅读

子主题不生效、样式不覆盖怎么办(排查与修复)

建好子主题却发现样式不覆盖、改动没效果?本文从style.css的Template声明、目录位置、wp_enqueue_style引入顺序、CSS选择器权重、缓存五个方面讲清原因,并给出可直接照做的修复步骤,让子主题真正生效、改样式不再被父主题更新覆盖。

U
UFO_PF 2026-10-10 · 阅读 8 分钟
子主 主题
阅读提示
本文约 2,823 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。

引言

很多站长都听过「要改主题就建子主题,别动父主题」这条忠告,于是照猫画虎建了一个子主题:新建文件夹、写 style.css、填上 Template,再启用。结果却发现——改的 CSS 完全没效果,加在子主题里的文件好像被无视,页面还是父主题那套样式。于是开始怀疑人生:是不是子主题根本没生效?其实子主题能不能覆盖父主题,取决于几个很具体的条件:Template 是否写对、样式表是否按正确方式入队、选择器权重是否够、缓存有没有清。只要有一个环节错了,子主题就会「看起来没起作用」。另外还有一种容易被忽略的情况:父主题自己用 @import 引入了别的样式表,层叠顺序会「插队」到子主题前面,覆盖自然失败——这类顺序问题也要一并排查。下面逐一拆解。

故障原因分析

  • Template 声明写错:style.css 头部 Template: 的值必须是父主题的目录名(大小写敏感),写成主题显示名或写错大小写,WordPress 就认不出父主题。
  • 子主题目录放错位置:必须放在 wp-content/themes/ 下,与父主题平级,不能嵌在父主题文件夹里面。
  • 没有正确 enqueue 父主题样式:自己写子主题时忘了用 wp_enqueue_style 引入父主题 style.css 和子主题 style.css,导致父主题样式根本没被加载(或加载顺序不对)。
  • CSS 优先级不够:子主题样式被加载了,但父主题的选择器权重更高,或在子主题中用了更低权重的写法,覆盖失败。
  • 只改样式没改模板:style.css 只影响 CSS;要改 header.php、footer.php 这类结构,必须在子主题里放同名文件。
  • 缓存没清:浏览器缓存、插件缓存、CDN 缓存仍在输出旧的 CSS。

分步解决方案

第一步:核对子主题的 style.css

在 wp-content/themes/你的子主题/style.css 顶部,头部注释必须像这样(Template 填父主题目录名):

/*
Theme Name: My Child Theme
Template: parent-theme-folder-name
Version: 1.0
*/

Theme Name 是显示给后台看的任意名称,Template 才是父主题目录名。用 FTP 看一眼父主题文件夹的真实名字,一字不差地填进去。改完到「外观 → 主题」看子主题缩略图上是否显示父主题信息,能显示通常说明认到了。

第二步:正确入队父子样式

在子主题里建 functions.php(注意:子主题的 functions.php 不会覆盖父主题的,是「追加」加载的),加入:

<?php
function mychild_enqueue_styles() {
    // 先加载父主题样式,句柄用主题目录名区分
    wp_enqueue_style(
        'parent-style',
        get_template_directory_uri() . '/style.css'
    );
    // 再加载子主题样式,依赖 parent-style,保证顺序在后
    wp_enqueue_style(
        'child-style',
        get_stylesheet_directory_uri() . '/style.css',
        array( 'parent-style' ),
        wp_get_theme()->get( 'Version' )
    );
}
add_action( 'wp_enqueue_scripts', 'mychild_enqueue_styles' );

关键点:get_template_directory_uri() 指向父主题,get_stylesheet_directory_uri() 指向子主题;把子主题样式的依赖设成父主题句柄,才能保证它排在后面、优先生效。

第三步:提高选择器权重

父主题里若有 .site-header .logo { color: #333; },你在子主题只写 .logo { color: #f60; } 是压不过的。要么复制更完整的选择器路径,要么适度提升权重:

.site-header .logo,
body .site-header .logo {
    color: #f60;
}

优先用「复制父主题原选择器 + 加一层父级」的方式,比暴力 !important 更可控;非要用 !important 也应尽量少用。如果再叠一层,还可以给子主题样式表加版本参数(如 filemtime() 生成的时间戳),避免浏览器一直用旧的 CSS。

第四步:要改结构就复制同名模板

想改页眉页脚,需把父主题的 header.php、footer.php 复制到子主题根目录下的相同相对路径再改。WordPress 会优先读取子主题里的同名文件。改模板时记得把父主题独有的 get_template_part() 逻辑一并保留,别删漏。

第五步:清缓存验证

清浏览器强刷(Ctrl+F5)、清 WordPress 缓存插件、清服务器 opcache 和 CDN,再查看页面源代码里 <link> 是否指向子主题的 style.css。若指向正确但仍无效,多半是权重问题;若根本没出现子主题样式,回到第二步检查 enqueue。

常见踩坑点

  1. Template 填成主题显示名:Theme Name: Astra 不代表目录名是 Astra,要填真实目录名。
  2. 子主题文件不完整:正规子主题至少要有 style.css,要定制样式还需 functions.php,缺一不可。
  3. 在子主题 style.css 里 import 父主题导致顺序错乱:用 @import url("../父主题/style.css") 有性能与顺序隐患,建议改用 enqueue。
  4. 改了父主题才想起有子主题:父主题更新会覆盖,改动应始终在子主题。
  5. 忘了依赖导致加载顺序颠倒:不设依赖时,子主题样式可能排在父主题之前,被反向覆盖。
  6. 浏览器缓存骗人:明明生效了却因缓存看不到,先强刷再判断。

总结

子主题不生效、样式不覆盖,绝大多数不是「子主题没用」,而是几处细节没写对:Template 必须是父主题目录名、目录要放对位置、父子样式要用 wp_enqueue_style 按正确顺序引入、被覆盖的选择器权重要够、要改结构就得复制同名模板文件,最后别忘了清缓存。按这五步依次排查,很快就能定位问题。掌握这套方法后,子主题不生效将不再是拦路虎,你也能真正发挥「改样式不动父主题、更新不丢改动」的优势,安全地长期维护自己的站点。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。