它不是模板,不输出任何页面内容。它是主题的“功能文件”——放一些辅助函数、注册菜单、注册侧栏、挂载钩子。
caogenbj 的 functions.php 里放了:评论过滤、description() 函数、标题过滤器、分页函数、面包屑函数、侧栏注册。
这是它最关键的特性:functions.php 比所有模板文件都先加载。
一个请求进来,WordPress 的顺序是:
functions.php;single.php 等)。所以 functions.php 里定义的东西,模板里都能直接用。比如你在 functions.php 定义了 lingfeng_pagenavi(),模板里就能调它。
常见的几类:
add_action / add_filter,改 WordPress 的默认行为;wp_enqueue_script)。有三个东西不该放这里:
判断标准:这个功能,换个主题还要不要?要 → 插件;不要 → 主题。
很多人把所有东西都塞进 functions.php,几百行、上千行。结果换主题时全丢,或者维护时找不到。
更好的做法是拆分:
functions.php 只做“入口”,用 require 引入其他文件;inc/setup.php(注册)、inc/hooks.php(钩子)、inc/helpers.php(工具函数)。小主题不拆也行,但要有“以后可能拆”的意识,别把无关的东西混在一起。
纯 PHP 文件末尾不要写 ?>。
因为 ?> 后面的任何空白(空格、换行)都会被原样输出。而 functions.php 在所有页面输出之前加载,这些空白会跑到每个页面的最前面。
在 HTML 里看不出(浏览器忽略),但在 XML(比如站点地图)里就是致命的——<?xml 前面多了空白,解析直接失败。
caogenbj 的 functions.php 原来末尾就有 ?> 加 8 个空行,我这次一并删了。
一句话记住:functions.php 是主题的功能层,比模板先加载;放注册、钩子、工具函数,别放页面内容;末尾不要写 ?>。
下一篇讲钩子——add_action 和 add_filter 到底在干什么。