WordPress 子主题样式不生效,先别急着怀疑缓存
子主题里的 style.css 我改了七八遍,浏览器里一点变化没有。第一反应是缓存——清 CDN、清对象缓存、换无痕窗口,还是老样子。折腾半小时才反应过来,问题压根不在缓存。 顺手记一下,免得下次再走一遍。 先看浏览器到底请求了哪个文件 打
子主题里的 style.css 我改了七八遍,浏览器里一点变化没有。第一反应是缓存——清 CDN、清对象缓存、换无痕窗口,还是老样子。折腾半小时才反应过来,问题压根不在缓存。
顺手记一下,免得下次再走一遍。
先看浏览器到底请求了哪个文件
打开开发者工具,Network 面板过滤 css。你会发现有时候请求的是父主题的 style.css,子主题那个文件根本没被请求。这时候你去清缓存属于白忙。
还有一种更常见的:两个都请求了,但顺序反了,父主题的在后面。CSS 后面覆盖前面,你改子主题当然看不出动静。
问题出在 wp_enqueue_style 的第三个参数
很多人(包括我)一开始都是这么写的:
// zb_users 不用管,这行写在子主题 functions.php 里
add_action( 'wp_enqueue_scripts', function () {
wp_enqueue_style(
'child-style',
get_stylesheet_directory_uri() . '/style.css',
array(), // 这里空了
filemtime( get_stylesheet_directory() . '/style.css' )
);
} );
第三个参数是依赖数组。你留空,WordPress 就没义务保证它排在哪。改成带上父主题的句柄就好了——但这个句柄必须是你父主题真实注册过的名字,不是你随手编的。
add_action( 'wp_enqueue_scripts', function () {
wp_enqueue_style(
'child-style',
get_stylesheet_directory_uri() . '/style.css',
array( 'parent-style' ),
filemtime( get_stylesheet_directory() . '/style.css' )
);
} );
这里有个容易混的地方:get_stylesheet_directory_uri() 永远指向当前启用的主题(也就是你的子主题),get_template_directory_uri() 指向父主题。两个函数名起得挺反直觉的,我是查了文档才记住。
句柄名到底叫什么
别猜。在子主题的 functions.php 里临时丢一句:
add_action( 'wp_print_styles', function () {
global $wp_styles;
error_log( print_r( $wp_styles->queue, true ) );
} );
然后开 WP_DEBUG 和 WP_DEBUG_LOG,看 wp-content/debug.log 里打印出来的队列。里面列的就是已经入队的句柄名,父主题那个自然在里面。找到之后把名字填进依赖数组,收工。
注意 wp_styles 得 global 拿,不然是个 undefined variable。
还有一种情况,跟队列没关系
有些主题自己在 wp_head 上挂了一个优先级很高的回调,往里吐一段 inline style(通常是主题选项里的自定义颜色)。那段代码排在所有外部样式后面,你怎么调依赖都压不住它。
遇到这种,别在 wp_enqueue_style 上死磕了。去看主题的 inc/ 目录里谁挂了 wp_head。我上次那个模板就是,优先级 99。
最后补一句:filemtime() 做版本号这招在普通虚拟主机上没问题,但我没在 NFS 或者挂了 opcache 的环境里实测过,如果版本号一直不变,换成固定字符串试试。