WordPress 主题里的 wp_head():少写一行,会连锁坏掉哪些东西

· wordpress · 阅读 15
摘要

很多人做 WP 主题,第一次把 header.php 从别人的主题抄过来时,会顺手删掉几行「看着没用的」。其中 wp_head() 是最常被误删的一个,因为它在源码里只输出一个空标签,浏览器里看不出来任何东西。 删掉之后最先坏的是什么 不是

很多人做 WP 主题,第一次把 header.php 从别人的主题抄过来时,会顺手删掉几行「看着没用的」。其中 wp_head() 是最常被误删的一个,因为它在源码里只输出一个空标签,浏览器里看不出来任何东西。

删掉之后最先坏的是什么

不是样式,是插件。WP 的插件绝大多数靠 wp_head 这个钩子往页面里注入内容,包括:

  • 统计代码、验证 meta 标签
  • SEO 插件输出的 title / description / canonical
  • 缓存插件的调试注释和预加载链接
  • CDN、图片懒加载的脚本

这些全部失效,而且不报错,你会以为是插件本身不兼容,去插件作者那里开一堆 ticket。

wp_head() 到底放在哪

必须在 </head> 闭合标签之前,且只能出现一次。放在 <body> 里虽然也「能跑」,但校验器会报错,部分插件也会因为找不到节点而失效。

正确的骨架

<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
  <meta charset="<?php bloginfo('charset'); ?>">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>

配套的两个「必须」

body_class() 和 wp_footer() 是同一组的。少了 body_class(),主题的 CSS 条件类(比如首页、单页、登录态)全部失效;少了 wp_footer(),后半段注入的脚本(很多插件的 JS 都挂在 footer)不加载。

这三个函数是 WP 主题的「三件套」,缺任何一个都会出现「装了插件但没反应」的诡异现象。判断方法很简单:看页面源码里有没有插件的注入痕迹,没有就先回去查这三行。