别一上来就改父主题的 functions.php,主题一更新,你加的代码全没,站点还可能白屏,正确做法是:建一个子主题,把 functions.php 放进子主题里,下面这套流程,新手照着做就能把安全改装层搭起来。
适用人群说明
这篇适合:已经装好 WordPress,但不会写插件;会用主题自定义器,但想再加代码功能;害怕主题更新覆盖改动;想改样式、改摘要长度、加统计代码、覆盖模板文件的新手。
不太适合:已经能独立写插件、用 Git 管理主题的高级开发,你们可以略过,但避坑清单仍值得扫一眼。

WordPress 子主题 functions 实战,新手 30 分钟搭好不怕更新的改装层
准备工作
- 能登录 WordPress 后台。
- 有主机文件管理器、FTP 或宝塔面板。
- 父主题已经安装,先别删。
- 先备份网站,用 UpdraftPlus、主机快照都行,子主题操作不复杂,但
functions.php写错会白屏,备份是底线。
完整搭建步骤
第 1 步:确认父主题目录名
进入 wp-content/themes/,看父主题文件夹名,比如是 twentytwentyfour、astra、generatepress,记住它,后面 Template: 必须一模一样,大小写敏感。
第 2 步:创建子主题文件夹
在 wp-content/themes/ 下新建文件夹,建议命名 父主题名-child,例如父主题是 twentytwentyfour,就建:
twentytwentyfour-child
第 3 步:创建 style.css
在子主题文件夹里新建 style.css,写入:
/* Theme Name: My Child Theme Theme URI: https://example.com Description: 我的 WordPress 子主题 Author: 你的名字 Author URI: https://example.com Template: twentytwentyfour Version: 1.0.0 License: GNU General Public License v2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html Text Domain: my-child-theme */
重点:Template: 后面写父主题文件夹名,不是后台显示的主题名称,写错,后台就看不到子主题。
第 4 步:创建 functions.php
在子主题文件夹新建 functions.php,粘贴下面代码,记得把 twentytwentyfour 换成你的父主题目录名。
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* 加载父主题与子主题样式
*/
function mychild_enqueue_styles() {
$theme = wp_get_theme();
$parent = $theme->parent();
$parent_handle = 'mychild-parent-style';
if ( $parent ) {
wp_enqueue_style(
$parent_handle,
get_template_directory_uri() . '/style.css',
array(),
$parent->get( 'Version' )
);
}
wp_enqueue_style(
'mychild-style',
get_stylesheet_uri(),
array( $parent_handle ),
$theme->get( 'Version' )
);
}
add_action( 'wp_enqueue_scripts', 'mychild_enqueue_styles', 20 );
/**
* 可选:加载子主题额外 CSS
*/
function mychild_enqueue_extra_styles() {
$extra_css = get_stylesheet_directory() . '/assets/child.css';
if ( file_exists( $extra_css ) ) {
wp_enqueue_style(
'mychild-extra',
get_stylesheet_directory_uri() . '/assets/child.css',
array( 'mychild-style' ),
filemtime( $extra_css )
);
}
}
add_action( 'wp_enqueue_scripts', 'mychild_enqueue_extra_styles', 30 );
/**
* 示例:修改摘要长度
*/
function mychild_excerpt_length( $length ) {
return 30;
}
add_filter( 'excerpt_length', 'mychild_excerpt_length', 20 );
第 5 步:上传并激活
把整个子主题文件夹放到 wp-content/themes/,进入后台:外观 → 主题,找到你的子主题,点击启用。
第 6 步:检查前台
打开网站首页,重点看三件事:
- 样式是否正常。
- 浏览器控制台有没有 404。
- 打开页面源代码,搜索
mychild-style,确认子主题样式已加载。
第 7 步:测试 functions 是否生效
临时在子主题 functions.php 最后加:
add_action( 'wp_footer', function() {
echo '<!-- child functions ok -->';
} );
刷新前台,查看源代码,能看到 child functions ok 就说明子主题 functions.php 生效了,测试完删掉。
第 8 步:加 CSS 和覆盖模板
想加 CSS,优先写进子主题 style.css,或新建 assets/child.css,想改模板,footer.php,就从父主题复制这个文件到子主题同名路径,只改需要改的部分,不要一次复制一大堆模板,后面父主题更新了你很难维护。
配置要点
- 子主题
functions.php只写你的自定义功能,不要复制父主题全部代码。 - 函数名加前缀,
mychild_,避免和父主题冲突。 - 父主题资源用
get_template_directory_uri(),子主题资源用get_stylesheet_directory_uri()。 - 样式用
wp_enqueue_scripts入队,不要用@import,也不要在wp_head里硬写<link>。 - 子主题
functions.php会先于父主题加载,想移除父主题动作,不要直接remove_action,建议挂到after_setup_theme或init稍后执行。 functions.php末尾不要加?>,避免多余空格导致 header 报错。- 如果父主题是区块主题,样式和设置还要看
theme.json,子主题可以只写要覆盖的theme.json片段,WordPress 会合并。
常见踩坑提醒
- 后台看不到子主题:
style.css头部缺失,或Template写错。 - 样式错乱:父主题样式没加载,或加载顺序反了,优先检查父主题的
wp_enqueue_stylehandle。 - 白屏:
functions.php语法错误,用 FTP 把子主题文件夹改名,或删除错误行恢复。 - 函数冲突:父主题已有同名函数,子主题又定义,直接 fatal,所有函数加前缀。
- 更新后失效:子主题本身不会丢,但你覆盖的模板可能过时,父主题结构大改时要同步检查。
- 切换主题后设置丢失:子主题激活后,自定义器和小工具可能需要重新设置,操作前先记录。
- 缓存没清:改了 CSS 不生效,先清 WordPress 缓存、插件缓存、CDN 缓存,再强刷浏览器。
做完这几步,你就有了一个不怕父主题更新的改装层,以后加代码、调样式、覆盖模板,都往子主题里放,别偷懒去改父主题,那是给未来的自己挖坑。
发表评论