子主题函数没执行,多半是 Template 写错了

· wordpress · 阅读 2
摘要

子主题在后台能启用,前台函数却像完全没写过。我第一次碰到,盯着 CSS 改了半小时,后来才发现 functions.php 根本没被加载。 Template 填的是目录名 style.css 顶部那个 Template,要写父主题的文件夹名

子主题在后台能启用,前台函数却像完全没写过。我第一次碰到,盯着 CSS 改了半小时,后来才发现 functions.php 根本没被加载。

Template 填的是目录名

style.css 顶部那个 Template,要写父主题的文件夹名,不是后台里那行中文主题名。大小写也算。我本地父主题目录是 twentytwentyfour,写成 Twenty Twenty-Four,子主题卡片上就不会出现「基于某某」。

/*
Theme Name: 我的子主题
Template: twentytwentyfour
*/

文件位置:wp-content/themes/你的子主题/style.css。改完刷新「外观 → 主题」。没有「基于」这几个字,后面都不用试。

两份 functions.php 都会跑

认成子主题之后,子主题的 functions.php 先加载,父主题那份跟着加载。它不覆盖父主题,两份都执行。补丁写进父主题,下次更新就没了。我现在只改子主题这份:

// 子主题 functions.php
add_action('wp_enqueue_scripts', function () {
    wp_enqueue_style('parent-style', get_template_directory_uri() . '/style.css');
    wp_enqueue_style('child-style', get_stylesheet_uri(), array('parent-style'));
});

get_template_directory_uri() 指向父主题,get_stylesheet_uri() 指向正在用的子主题。这两个我曾经对调过,优先级就乱,看起来像「子主题没生效」。

还有个反直觉的地方:子主题加载更早,所以你想替换父主题里的函数,父主题那边得先用 function_exists 包一下。父主题没包、你在子主题里又声明同名函数,结果是直接 fatal,不是安静地覆盖。这点我是把整站打白之后才记住的。

文件在,仍然像没执行

functions.php 里有语法错误时,站点会白,现象和「没加载」很像。去看 wp-content/debug.log,前提是 wp-config.php 里开了 WP_DEBUG_LOG。日志路径若落在子主题目录,就别再改 Template 了。语法和抬头不要两头一起动,不然你分不清是哪下修好的。