主题没写 wp_body_open,插件在后台一直报错

· wordpress · 阅读 11
摘要

装了个统计插件,前台功能正常,后台却飘一行红字,说当前主题不兼容 wp_body_open()。我第一反应是插件太挑,换个插件得了。后来想想,这函数三年前就进核心了,主题不写确实是自己理亏。 它只是个钩子,位置在 body 之后 打开 he

装了个统计插件,前台功能正常,后台却飘一行红字,说当前主题不兼容 wp_body_open()。我第一反应是插件太挑,换个插件得了。后来想想,这函数三年前就进核心了,主题不写确实是自己理亏。

它只是个钩子,位置在 body 之后

打开 header.php,找 <body> 标签,紧跟着加一行:

<body <?php body_class(); ?>>
<?php wp_body_open(); ?>

要求就一条:必须在 <body> 之后、其他内容之前。放太靠后,插进去的代码会跑到布局里面,比如统计脚本被塞进 <div class="wrapper"> 里,那基本没救了。

老主题没这函数怎么办?WordPress 官方给了一段兼容写法,我记得是判断函数存在再调用,但我现在打字打不出一模一样的原文。实际做法是:把 wp_body_open() 换成 do_action( 'wp_body_open' );,效果等价,在 WordPress 5.2 之后的环境里都能跑。

为什么插件非要这个

因为它是唯一一个「body 已开始、HTML 还没输出正文」的官方时机。GTM 那种要尽早注入的脚本、或者需要读 document.body 的埋点,卡这里最稳。

放 wp_head 里会报错——那时候 body 还不存在。放 footer 又太晚,有些指标抓不到。

加完还报错,就查两处

一是模板会不会根本没走 header.php。有些页面模板自己手写了 <html> 开头,把 header 跳过了。这种情况加在 header.php 里当然白加。

二是 functions.php 里有没有人已经把 wp_body_open 给摘掉了:

// 搜一下有没有这句,有就删掉
remove_all_actions( 'wp_body_open' );

这种代码一般是以前为了「优化」硬塞进来的,现在属于纯粹的坑。

顺带一提,改完记得确认子主题里没有重复的 header.php。我有一次就是改错了文件,改了父主题,结果子主题里那份老文件还在生效——查了半天以为自己手抽。