functions.php 里给 upload_mimes 加了 svg,上传仍提示 Sorry, this file type is not permitted。debug.log 里 wp_check_filetype_and_ext 返回的 type 是 text/plain。日志里能对上时间点,这种反而好排。
服务器把 svg 的 MIME 映射成 text/plain,WordPress 用真实类型覆盖了扩展名推断的结果,允许列表里没有 text/plain 就被拒。部分环境还会因为缺 XML 声明识别成空。这一点先确认清楚,后面就不用反复试。
add_filter('wp_check_filetype_and_ext', function ($d, $f, $n, $m) {
if ($m === 'image/svg+xml') { $d['ext'] = 'svg'; $d['type'] = 'image/svg+xml'; }
return $d;
}, 10, 4);
这次卡住的地方就在「SVG MIME 校验」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
处理上按这个顺序:在 wp_check_filetype_and_ext 过滤器里按扩展名补回 image/svg+xml;确认文件开头有 svg 声明 否则 fileinfo 判不出;上传后再 sanitize 一遍 不要直接信任内容。
结果对不对很好判断,后台能选中 svg 上传成功,媒体库里类型显示为 image/svg+xml。
