前两天把我的弹窗公告插件提交到了 WordPress 官方应用商店,前后折腾了三轮审核,分享一下整个过程,给打算上架的站长们做个参考。

第一轮:自动审核(PCP)
提交 ZIP 包之后,WP.org 会自动运行 Plugin Check Plugin(PCP)扫描,当场就会告诉你过没过。
我这轮遇到的问题:
- ❌ 插件名用了中文「弹窗公告」→ 改成英文
Homepage Popup Notice - ❌ 绑定了 jQuery 2.1.4 → 删除(WP 核心已自带,不允许重复捆绑)
- ❌
Tested up to写的是 6.9,当时最新版已是 7.0 → 更新版本号 - ⚠️
Domain Path指向的 languages 文件夹无 .mo 文件 → 删掉这个头信息
注意:这个扫描只是预检,还是有几率被拒的。不过没过也别怕,修好了重新上传就行。

第二轮:人工 + AI 混合审核
提交后等了不到一天,收到了志愿者发来的邮件,这次是人和 AI 一起看,列出了 7 个问题:
🔴 自定义 CSS/JS 输入框
插件里有一个「自定义 CSS」输入框,允许用户直接写 CSS。官方说不允许让用户随意粘贴任意代码,哪怕只是 CSS。
修复: 删掉 s1_custom_css 和 s2_btn_style 这两个字段。
🔴 用了 <style> 和 <script> 直接输出
有一些样式和脚本直接通过 <style> 和 <script> 标签输出在页面里。
修复: 改成 wp_add_inline_style() 和 wp_add_inline_script(),走标准的 wp_enqueue 流程。
🔴 nonce 没有 sanitize
wp_verify_nonce($_GET['_wpnonce'], ...) 直接传入了 GET 参数,没做任何清理。
修复: 改成 wp_verify_nonce(sanitize_text_field(wp_unslash($_GET['_wpnonce'])), ...)。
🔴 Contributors 列表没有自己
readme.txt 里的 Contributors 只写了 tschencj,没有我的 WP.org 用户名 tsxcc。
修复: 加上了 tsxcc。
🔴 load_plugin_textdomain() 多余
WP 4.6 开始会自动加载语言文件,不用再手动调用了。
修复: 直接删掉。
🔴 js-cookie 版本过旧
用的 3.0.1,最新版已经是 3.0.8。
修复: npm view js-cookie 查最新版,下载替换。
🟧 所有权验证
这是最麻烦的一环。我用 163.com 邮箱注册的 WP.org,但插件的作者 URL 是我的个人网站 kqwq.com,志愿者无法确认我是不是那个域名的所有者。
修复: 按官方要求,把 WP.org 账号邮箱改成了 @kqwq.com 的邮箱,然后回复邮件说明情况。第二轮审核时通过了。

第三轮:终审
第二轮修复后上传了 v1.0.1,志愿者又看了一遍,这次所有技术问题都通过了,只剩下一个自动扫描的误报——Windows 上的路径分隔符 \ 被误判为文件名不兼容。
回复邮件说明是误报后,目前还在等待最终批准。

总结
时间线:
- 7月20日 — 提交 ZIP 包,自动预检驳回(插件名中文、jQuery 捆绑、Tested up to 过时)
- 7月20日 — 修好重新上传,当天收到第一轮人工审核邮件(列出 7 个问题)
- 7月21日 — 修复所有问题,上传 v1.0.1,回复邮件说明所有权
- 7月22日 — 志愿者回信说所有权仍需验证
- 7月23日 — 把 WP.org 邮箱改成 @kqwq.com,回复邮件告知
- 7月24日 — 志愿者确认所有权通过,终审只剩一个文件名误报
- 7月24日 — 回复邮件说明是误报
- 至今 — 等待中…
几点经验:
- 插件名必须英文,中文名直接报错
- 不要捆绑核心库(jQuery、React 等),WP 自带了
- 不要有任何让用户插入任意代码的输入框,这是红线
- 所有的输入都要 sanitize,特别是 nonce 这种
- 善用 wp_enqueue 系列函数,别自己手写
<script>标签 - 邮箱域名要和插件作者域名一致,不然所有权验证会让你多等一轮
- 志愿者也是人,回复邮件简短客气就好,别写长篇大论
祝各位上架顺利 🚀



