网站开发

functions.php 里最该加和最不该加的代码:一份实用清单

网上搜「WordPress 代码」能搜出一大堆片段,质量参差不齐。有些确实能省掉一个插件,有些加了就是给自己埋雷。

这篇只列我用过、验证过的,分成「该加的」和「千万别加的」两类,每段都说明代价。

先说最重要的一条原则

不要往主题的 functions.php 里直接堆代码。

原因有两个:

  1. 主题一更新,你的代码就没了
  2. 代码散落在主题里,过半年你自己都忘了加过什么

正确做法二选一:

  • 子主题的 functions.php —— 适合模板相关的改动
  • Code Snippets 插件(推荐)—— 每段代码有名字、有注释、可以单独开关,出问题一键禁用,不用 FTP

下面这些代码,都假设你放在其中一个地方。

一、该加的:能省一个插件的

1. 关闭文章修订版(数据库瘦身)

// 只保留最近 3 个修订版
if ( ! defined( 'WP_POST_REVISIONS' ) ) {
    define( 'WP_POST_REVISIONS', 3 );
}

这条其实更适合放在 wp-config.php。效果:数据库不会无限膨胀。

2. 移除前台的 WordPress 版本号

remove_action( 'wp_head', 'wp_generator' );

默认 WordPress 会在页面源码里输出 <meta name="generator" content="WordPress 6.7">,等于告诉攻击者你的版本号。删掉它,一行代码的事。

3. 禁止作者归档页枚举用户名

add_action( 'template_redirect', function() {
    if ( is_author() || ( isset($_GET['author']) && $_GET['author'] ) ) {
        wp_redirect( home_url(), 301 );
        exit;
    }
});

不懂这条有多重要的,可以去试试访问 你的域名/?author=1——默认情况下它会把你的管理员用户名显示出来。用户名暴露 + 登录页无限试密码 = 很危险。

4. 关闭 XML-RPC(不用 App 发文的话)

add_filter( 'xmlrpc_enabled', '__return_false' );

xmlrpc.php 是暴力破解和 CC 攻击的重灾区,一次请求能试上百个密码。不用就关掉。

注意:如果你用手机 App 管理网站、或者用某些第三方工具(比如部分邮件营销插件),可能依赖它。关之前确认一下。

5. 让搜索结果页排除页面/附件

add_filter( 'pre_get_posts', function( $q ) {
    if ( $q->is_main_query() && $q->is_search() && ! is_admin() ) {
        $q->set( 'post_type', 'post' );
    }
});

默认搜索会搜出页面和附件,很乱。限制成只搜文章。

6. 给上传的文件自动重命名

add_filter( 'sanitize_file_name', function( $filename ) {
    $ext = pathinfo( $filename, PATHINFO_EXTENSION );
    return md5( $filename . time() ) . '.' . $ext;
}, 10 );

解决中文文件名上传后变成乱码、或者 URL 里带一堆百分号的问题。对国内站很有用。

7. 允许上传 SVG / WebP(按需)

add_filter( 'upload_mimes', function( $mimes ) {
    $mimes['webp'] = 'image/webp';
    return $mimes;
});

SVG 要谨慎——SVG 文件里可以嵌入脚本,允许上传等于开了一个 XSS 入口。如果不是必须,别开。

8. 登录失败时不提示具体错误

add_filter( 'login_errors', function() {
    return '用户名或密码不正确';
});

默认 WordPress 会区分「用户名不存在」和「密码错误」,等于帮攻击者确认用户名是否有效。

二、该加的:性能优化类

9. 移除 emoji 脚本

remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );

WordPress 为了支持 emoji 会加载一个额外的 JS,大多数站用不上。如果你用 Gutenberg 编辑器,emoji 输入可能受影响,但前台显示不受影响(现代系统自带 emoji 字体)。

10. 移除用不到的 oEmbed

remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
remove_action( 'wp_head', 'wp_oembed_add_host_js' );

oEmbed 是「粘贴一个 YouTube 链接自动变成播放器」的功能。如果你不需要嵌入外部内容,关掉能少加载一个 JS。

11. 限制文章修订版的自动保存频率

define( 'AUTOSAVE_INTERVAL', 300 );  // 放 wp-config.php

默认 60 秒存一次,改成 5 分钟,减少数据库写入。

三、千万别加的:这些会埋雷

❌ 1. 网上搜来的「关闭 WordPress 自动更新」

// 别加这个
add_filter( 'automatic_updater_disabled', '__return_true' );

很多老教程会教你关掉自动更新,理由是「怕更新后网站崩」。但 WordPress 的安全更新是自动推送的——你关掉的那一刻,就等于宣布这个站以后不再打安全补丁。

正确做法:保留安全相关的自动更新,只关闭主题和插件的自动更新(这些才容易出兼容问题):

add_filter( 'auto_update_plugin', '__return_false' );
add_filter( 'auto_update_theme', '__return_false' );
// 核心的安全更新保持开启

❌ 2. 直接改数据库前缀的「安全代码」

有些文章会教你改 $table_prefix。已经建好的站不要这么干——需要同时改数据库表名和一堆 meta 字段,手动改极易出错,一个疏漏就是网站崩溃。

如果真的要改,用专门插件(比如 Change Table Prefix),并且备份在前。

❌ 3. 用 extract() 或者关闭错误报告的「万能代码」

// 别加
error_reporting(0);

把错误全藏起来,等于以后网站出问题你完全看不到原因。生产环境应该关闭「显示」错误,但保留「记录」错误:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );   // 前台不显示,但写到日志里

❌ 4. 来自不明来源的「破解/去授权」代码

网上有些代码声称能「免费激活某某商业插件」。这类代码里藏后门的比例非常高——它会给你一个管理员后门账号、或者悄悄往你的页面插外链。

你以为省了几百块授权费,实际是把整个站的控制权交出去了。

❌ 5. 一次性堆 30 个片段

很多人找到一个「WordPress 优化代码合集」,一次贴几十段进去。

问题:出问题时你不知道是哪一段导致的。而且这些合集里很多代码已经过时(针对五年前的 WordPress 版本),现在加上去轻则无效,重则冲突。

正确做法:一次加一段,加完刷新看网站正常不正常,确认没问题再加下一段。用 Code Snippets 的话,每段都能单独开关,排查很容易。

四、加了代码出问题怎么快速恢复

这是必须提前知道的——白屏的时候你没法进后台。

如果是 Code Snippets 插件

访问 你的域名/wp-admin/admin.php?page=code-snippets&action=deactivate-all 可以紧急禁用所有片段。

如果是写在 functions.php

用 FTP 或文件管理器,把 functions.php 改名(比如改成 functions.php.bak),网站立刻恢复。然后慢慢排查那一段代码的问题。

预防

改 functions.php 之前,先用 FTP 下载一份原件存本地。这个动作五秒钟,能省掉白屏时的慌乱。

五、我的建议

对于大多数独立站,真正值得加的只有这几条:

  1. 移除版本号
  2. 禁止用户名枚举
  3. 关闭 xmlrpc(不用 App 的话)
  4. 移除 emoji
  5. 文件重命名

这五条加起来不到十行代码,覆盖了安全和轻量优化的主要收益。其他的按需添加,别为了「优化」而优化。

每多加一段代码,就多一份维护负担和冲突风险。够用就好。