← 返回首页

WordPress autoload 审计:那条 autoload='yes' 的 SQL 错了

WordPressWP-CLI运维

如果你给自己的WordPress 站做过性能体检,大概率敲过这一句:

SELECT SUM(LENGTH(option_value)) FROM wp_options WHERE autoload='yes';

然后拿着那个数字,和「autoload 应该小于 800KB」的传说对比一下,觉得没问题就关掉页面。

问题在于:**从 WordPress 6.6 开始,这句 SQL 数的不是你的站点真实加载量。** 它会漏掉一部分行,而且漏得越来越厉害——站点运行越久、升级跨越的版本越多,偏差越大。这不是配置问题,是官方在 2024 年 7 月改了 autoload 列的取值语义,而绝大多数教程(以及托管商的知识库文章)没跟上。

我实际运营的一个内容站,套用这句老 SQL 得到 222.0 KB / 123 行;换成对齐核心逻辑的口径重算,是 261.4 KB / 142 行。18% 的低估。 而这个站点离 800KB 的告警线还远,所以低估暂时不致命——可一旦你的站点真的到了临界区间,你手上那个偏低的数字就是最坏情况:它让你以为还没到,从而继续放着不管。

这篇讲三件事:正确的口径是什么、怎么用 WP-CLI 2.12 的官方命令改而不是手改数据库、以及三个被普遍混为一谈的阈值(150KB / 800KB / 900KB)分别在管什么。

⏳ 太长不看版 (TL;DR)

🥇 **必改的一件事**:把 WHERE autoload='yes' 换成 WHERE autoload IN ('yes','on','auto-on','auto')。这是唯一一条必须改的。

👉 在 Amazon 上查看 Dell U2723QE 4K USB-C 显示器 >>(长时间盯 SQL 输出与表格时的实际生产力装备)

🌟 配套一条:审计和清理都在终端里做,屏幕宽度和色准直接决定你能不能一眼看出哪一行异常。

👉 在 Amazon 上查看 BenQ ScreenBar Halo 2 挂灯 >>

💡 **三个阈值的真相**:150KB 是「单条 option 太大就别自动加载」的内核启发式;800KB 是 Site Health 弹告警的线;900KB 是 wp doctor 用的线。**三个数字三个用途,没有一个是「安全线」。**

---



第一步:搞清 6.6 到底改了什么

改动来自 WordPress 6.6 的 Options API 更新(官方 dev note)。核心只有一句:`add_option()` 和 `update_option()` 的 `$autoload` 参数默认值从 `'yes'` 变成了 `null`,并且数据库里 `autoload` 列现在会写入五种值:

列里的值来源是否参与自动加载
`on`代码显式传了 `true`是,必须加载
`off`代码显式传了 `false`否
`auto`没显式指定,交给内核判断**是**(目前仍加载)
`auto-on`内核启发式判定「该加载」是
`auto-off`内核启发式判定「别加载」否

两个关键点:

1. **auto 目前算「加载」。** 内核用一个叫 wp_autoload_values_to_autoload() 的函数决定,函数体就是白纸黑字的四元素数组 'yes', 'on', 'auto-on', 'auto'。你的老 SQL 只匹配其中一个。

2. **没有升级脚本。** 官方在 dev note 里明确写了不提供迁移。所以一个从旧版本一路升上来的站点,autoload 列里同时躺着 yes 和 auto-on 两套值——这就是为什么老 SQL 的偏差会随时间累积。

顺带一提,WordPress 7.1.3 已经在 2026 年 10 月 6 日发布,这是个安全修复版本(含 Comments 后台的存储型 XSS、WXR 导出的二阶 SQL 注入等),官方只维护最新版本。如果你的站点还停在 7.1.2 或更早,先升级再谈性能——顺序反了没有意义。

第二步:用三条 SQL 把真实数字算出来

先备份数据库,这一步没有任何理由跳过:

wp db export backup-$(date +%F).sql --allow-root

**查询一:真实总量**(这条是核心,对应 wp_load_alloptions() 的实际行为)

SELECT COUNT(*) AS rows_n,
       ROUND(SUM(LENGTH(option_value)) / 1024, 1) AS autoload_kb
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto-on', 'auto');

查询二:谁最胖(transients 也算进来了,这是很多人漏掉的一块)

SELECT option_name, autoload,
       ROUND(LENGTH(option_value) / 1024, 1) AS kb
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto-on', 'auto')
ORDER BY LENGTH(option_value) DESC
LIMIT 25;

查询三:分布——这条回答「我的站点到底有多老」

SELECT autoload, COUNT(*) AS rows_n,
       ROUND(SUM(LENGTH(option_value)) / 1024, 1) AS kb
FROM wp_options
GROUP BY autoload
ORDER BY kb DESC;

如果查询三里 yes 占比很高,说明这个站点的 option 大多是 6.6 之前写入的且从未被更新过——这些行**不会**因为升级而自动获得新语义,只能你手动去改。第三条查询的价值就在这里:它决定了你要不要往下走。

第三步:改用 WP-CLI 的官方命令,而不是手写 UPDATE

WP-CLI 2.12 内置了 `wp option set-autoload` 和 `wp option get-autoload` 两个子命令(见 官方文档)。**用它们,不要手写 `UPDATE wp_options SET autoload=...`** —— 命令走内核 API,会同步清理对象缓存里的 `alloptions`,手写 SQL 不会,你会得到一个「数据库改了但页面没变」的假象。

先确认某个 option 当前的真实取值:

wp option get-autoload rewrite_rules --allow-root

改掉它:

wp option set-autoload some_heavy_plugin_option no --allow-root
# Success: Updated autoload value for 'some_heavy_plugin_option' option.

批量的话,把查询二的输出喂进去(下面这条会先把 kb 小于 1KB 的行过滤掉,避免误伤核心配置):

wp db query "SELECT option_name FROM wp_options
  WHERE autoload IN ('yes','on','auto-on','auto')
    AND LENGTH(option_value) > 1024
    AND option_name NOT IN ('rewrite_rules','siteurl','home','blogname')
  LIMIT 20" --skip-column-names | while read -r opt; do
  wp option set-autoload "$opt" no --allow-root
done

改完必须清一次缓存,否则 alloptions 里还是旧值:

wp cache delete alloptions --allow-root

**哪些能碰,哪些不能碰**:`rewrite_rules` 改了会触发全量重写规则重建;`siteurl` / `home` 关掉自动加载会让每个请求多一次查询;主题的 `theme_mods_*` 系列建议保持自动加载。**如果你的站点已经上了对象缓存,这一步做完顺手验证一下效果** —— 我之前写过一篇 WordPress 7.1 + Redis 对象缓存实战,里面讲了 autoload 与对象缓存的叠加效应,两件事一起看更清楚。

第四步:三个阈值别再混着说

这是本文最想替你省掉的部分。市面上几乎所有文章都只给一个「800KB」,但内核里其实有三个不同的数字:

数字在哪定义管什么调它有用吗
**150,000 字节**`wp_filter_default_autoload_value_via_option_size()`单条 option 超过这个大小、且代码没显式指定时,写入为 `auto-off`用 `wp_max_autoloaded_option_size` 过滤器可调。官方明确说**不建议调高**
**800,000 字节**`WP_Site_Health::get_test_autoloaded_options_size_limit`Site Health 弹出「Autoloaded options could affect performance」的临界点用 `site_status_autoloaded_options_size_limit` 过滤器可调
**900 KB**`wp doctor` 的 `autoload-options-size` 检查`wp doctor` 命令自己的告警线不可调

两个必须知道的事实:

顺带说一个 WP-CLI 自己的坑:wp option list --autoload=on --format=total_bytes 这条命令看起来是干这件事的,它**也少算**——它只匹配 on 和 yes 两个值,把 auto / auto-on 全漏了。审计请用上面的 SQL,别用这条。

踩坑录:我实际遇到的 3 个报错

报错一:`Error: YIKES! It looks like you're running this as root.`

完整文案后面还跟着 You probably meant to run this as the user that your WordPress install exists under.

原因:WP-CLI 检测到当前是 root,主动拦下来了。这是保护机制——root 身份下站点里任何插件代码都拥有服务器完整控制权。

解决(推荐第二种):

# 方案一:单次绕过
wp option get-autoload rewrite_rules --allow-root

# 方案二:以站点所属用户运行(我实际用的就是这个)
sudo -u www-data wp option get-autoload rewrite_rules

如果你在容器里反复撞这个错,可以设环境变量 WP_CLI_ALLOW_ROOT=1 一次解决。但要注意方案一留下的隐患:**用 root 跑过写操作后,文件属主会变成 root**,Web 服务器可能就写不进去了,记得 chown -R www-data:www-data /var/www/html/。

报错二:`Warning: Could not delete 'option_three' option. Does it exist?`

**原因**:option 名字拼错了,或者它本来就在 autoload='off' 状态、你的清理脚本只扫了自动加载的行所以压根没匹配到。这个警告来自 wp option delete,但你在清理流程里看到它,通常意味着上游的 option_name 列表是脏的。

解决:脚本里加一道存在性校验,别让脚本静默跳过:

if wp option get-autoload "$opt" >/dev/null 2>&1; then
  wp option set-autoload "$opt" no --allow-root
else
  echo "SKIP (not found): $opt" >&2
fi

报错三:审计脚本跑通了,数字却和后台对不上

这个没有报错信息,所以最难查。现象是 Site Health 明确报「Autoloaded options could affect performance」,而你的 SQL 算出来只有几百 KB。

**原因**:八成是你用的就是那句 autoload='yes';剩下两成是漏了 transients——一个没设过期的 transient 是**永久自动加载**的,而 wp option list 默认把 transients 藏起来,两边都会让它「消失」。

**解决**:先跑查询三看分布。auto + auto-on 加起来占比可观,就确认是前者;auto-off 里有几十 KB 的大块,就是后者。再补一条专门看 transient 的:

SELECT option_name,
       ROUND(LENGTH(option_value) / 1024, 1) AS kb,
       autoload
FROM wp_options
WHERE option_name LIKE '%_transient_%'
  AND LENGTH(option_value) > 512
ORDER BY LENGTH(option_value) DESC
LIMIT 20;

行业应用:把它变成流程,而不是一次性任务

单站点手改一次是体力活,多站点就必须是流程。我实际用的做法是把它塞进三个位置:

**上线前体检**。任何新站、新插件组合上线前,把查询一 + 查询二作为验收项跑一遍。判断标准不要写成「小于 800KB」,写成「查询三里 auto-off 的总和 < 100KB 且无单条 > 150KB」——前者是内核的提示线,后者才是真实结构。

CI 里的 diff 检查。WordPress 站的性能退化极少是一次性的,通常是某次插件升级悄悄带进来的。在 CI 里跑:

NEW=$(wp db query "SELECT ROUND(SUM(LENGTH(option_value))/1024,1) FROM wp_options
      WHERE autoload IN ('yes','on','auto-on','auto')" --skip-column-names)
if (( $(echo "$NEW > $BASE + 50" | bc -l) )); then
  echo "autoload 增长超过 50KB,请说明原因" >&2; exit 1
fi

月度定时巡检。cron 里跑一次查询一,把数字连同查询二的 top 5 一起发到值班群。比等 Site Health 弹告警早,因为它在 800KB 之前就给你趋势了。

再补一句:数据库瘦身的收益是有天花板的。option 瘦身解决的是「每次请求都要多读一大坨配置」,它治不了慢查询本身。如果你的站点是查询慢而不是内存吃紧,方向应该去别处——我之前那篇 WordPress 数据库优化实战 讲的就是那条线(3.2 秒降到 180 毫秒),和本文互补。另外批量改元数据和内链的事,看这篇 WP-CLI 全量重排600 篇文章的实录。

总结

回到开头那句 SQL。真正需要记住的改动只有两处,都很小:

**查询条件**从 autoload='yes' 变成 autoload IN ('yes','on','auto-on','auto')。这一处是必改。

认知从「800KB 是安全线」变成「800KB 只是告警线,150KB 和 900KB 各管各的,三个都不是安全线」。这一处不改,你会一直用一个不存在的标准做判断。

至于动手的部分,用 wp option set-autoload 而不是手写 UPDATE,多花两秒钟敲命令,能省掉一整类「改了没生效」的排查。

如果你的站点 autoload 总量本来就远低于阈值,本文不会让你变快——它的价值是让你的数字终于可信。想确认自己站上的实际数字,建议直接查官方页面核对当前版本的阈值与函数行为:Site Health autoloaded options 检查、wp_autoload_values_to_autoload()。

Q: 我升级到最新 WordPress 后,autoload 会自动瘦身吗?

A: 不会。官方在6.6 的 dev note 里明确写了不提供升级脚本。升级只会让**此后新写入**的 option 用上新的 auto-* 语义,历史行需要你手动改。

**Q: auto 和 auto-on 有区别吗?**

A: 有。auto 是「没有任何决定」,auto-on 是「内核启发式判定该加载」。当前 7.1 下两者都参与加载,但官方在 6.6 dev note 里说过 auto 的默认行为**未来可能变**。如果你依赖某个靠 auto 加载的 option,显式改成 on 更稳。

Q: 装了 Performance Lab 插件有必要吗?

A: 它的价值在于给 Site Health 那个检查加一张明细表,能直接在后台点选关闭某个 option 的自动加载,不用碰 SQL。只做命令行审计的话不是必需。

Q: 800KB 是怎么来的?我看到的文章说 1MB 还有 400KB。

A: 400KB / 1MB 那些数字是 6.6 之前的老经验值。6.6 引入了 Site Health 检查并把 800,000 字节作为默认阈值,WP-CLI 的 wp doctor 则另用 900KB。具体数字建议以你自己版本的代码为准——grep -rn 'site_status_autoloaded_options_size_limit' wp-admin/includes/class-wp-site-health.php。

👉 立即参与 MiniMax Token Plan:AI 编程加速,企业用户专享优惠

👉 立即参与小米 MiMo 开放平台:国内领先的 AI 大模型开放平台,高性价比推理服务

👉 立即参与阿里云 AI:汇集爆款 AI 产品,热门模型专属权益优惠券助力企业创新加速

📌 本文由 AI 辅助生成并经人工审核发布 | TechPassive — AI 驱动的内容测试站点,专注于效率工具与 SaaS 真实评测

🔗 精选推荐工具

使用以下链接支持我们持续产出高质量内容(点击可直接前往购买):

☁️ DigitalOcean 云服务器 ⚡ Vultr 高性能 VPS ⭐ MiniMax Token 套餐 🤖 QoderWork 中国版(推荐有奖) ☁️ 阿里云爆款 AI 产品 📚 WordPress 实用书单 🔍 WordPress SEO 书单 🌐 虚拟主机书单 🐳 Docker 书单 🐧 Linux 书单 🐍 Python 书单 💰 联盟营销书单 💵 被动收入书单 🖥️ 服务器书单 ☁️ 云计算书单 🚀 DevOps 书单 🤖 小米 MiMo 开放平台
← 返回首页