我之前的 caogenbj 主题,装过 SEO 插件、装过缓存插件,后台设置得好好的,前台却一点变化都没有。我一度以为插件有问题,卸了装、装了卸,折腾了很久。
后来打开 header.php 才发现:我的主题根本没调 wp_head()。
head 部分是我自己手写的,写完直接 </head> 收尾,中间漏了那一行。
它不是“WordPress 的开头”,而是给所有插件留的一个输出口。
插件想往 <head> 里塞东西(比如 SEO 的 meta、缓存的预加载、统计代码),只有一条路:挂到 wp_head 这个钩子上。而主题必须在 head 里调用 wp_head(),这个“出口”才会打开。
打个比方:wp_head() 是墙上的一个插座。插件是各种电器,都带着插头。你不装插座,电器再好也通不了电。
最坑的是:网站照样能打开,所以你不会发现。直到你装了个插件、发现没反应,才会怀疑到这一层。
因为“手写 head”看起来很方便——title、description、CSS、JS,自己写几行就搞定了,还“可控”。
但手写的代价是:你把所有插件都关在门外了。
正规的 head 应该长这样:
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
就这几行。title、description、CSS、JS,都交给 wp_head() 和插件去输出。
打开主题的 header.php,搜 wp_head。搜不到,就是漏了。
另一个检查方法:打开任意页面,看源码里有没有 wp-json 或者 api.w.org 之类的痕迹。有,说明 wp_head() 在工作;完全没有,大概率是漏了。
我把 header.php 的整个 head 段重写了,只留框架 + wp_head(),具体的 title/description/canonical 交给一个单独的 head-seo.php 去生成。
这样两个好处:
wp_head() 有了,插件能正常工作;一句话记住:wp_head() 是插件往 head 输出的唯一出口,主题不调它,所有插件都白装。
下一篇讲:如果你坚持手写 head,会付出什么代价。