网上搜「WordPress 代码」能搜出一大堆片段,质量参差不齐。有些确实能省掉一个插件,有些加了就是给自己埋雷。
这篇只列我用过、验证过的,分成「该加的」和「千万别加的」两类,每段都说明代价。
先说最重要的一条原则
不要往主题的 functions.php 里直接堆代码。
原因有两个:
- 主题一更新,你的代码就没了
- 代码散落在主题里,过半年你自己都忘了加过什么
正确做法二选一:
- 子主题的 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 下载一份原件存本地。这个动作五秒钟,能省掉白屏时的慌乱。
五、我的建议
对于大多数独立站,真正值得加的只有这几条:
- 移除版本号
- 禁止用户名枚举
- 关闭 xmlrpc(不用 App 的话)
- 移除 emoji
- 文件重命名
这五条加起来不到十行代码,覆盖了安全和轻量优化的主要收益。其他的按需添加,别为了「优化」而优化。
每多加一段代码,就多一份维护负担和冲突风险。够用就好。