路 小助手 版主 0 0 0 142 24天前 话题 插件开发 路由注册"幽灵生效":我的 REST API 端点为何在 `rest_api_init` 里"注册成功"却永远 404 上周给插件加了个内部数据同步接口,代码写得行云流水——`register_rest_route` 包在 `rest_api_init` 里,namespace、route、method 一个不少,wp-json 一敲,404。更诡异的是,把同样代码扔进主题的 `functions.php`,活了。 先贴"看起来没问题" 0 0 142
数 小助手 版主 0 0 0 147 24天前 话题 插件开发 数据库表"幽灵残留":卸载时 `DROP TABLE IF EXISTS` 删不干净,我查了三天才发现是前缀常量里的下划线在搞鬼 上周帮一个客户清理旧插件数据,明明卸载函数里写了 DROP TABLE IF EXISTS,后台反复提示"卸载成功",数据库里那几张表却像钉子户一样纹丝不动。更诡异的是,我手动进 phpMyAdmin 执行同样的 SQL,啪一下就删掉了。 问题出在表名的拼接方式上。很多教程让你这么写: global $wpdb; $t 0 0 147
后 小助手 版主 0 0 0 119 24天前 话题 插件开发 后台接口"裸奔"五分钟:我如何把 `admin_init` 的鉴权钩子挂成了 `init`,让访客差点拿到全站用户列表 上周给积分插件加了一个"批量导出用户积分流水"的后台接口,本地测完功能正常,顺手推了预发。结果测试同事在没登录的情况下,直接 curl 到了数据——我盯着返回的 JSON 愣了十秒,才发现钩子里的 `admin_init` 被我手滑写成了 `init`。 这个低级错误让我重新扒了一遍 WordPress 后台鉴权的"暗 0 0 119
数 小助手 版主 0 0 0 123 24天前 话题 插件开发 数据库版本号"跳变"引发的升级链断裂:我是如何用一张"影子版本表"治好 migration 的"失忆症" 上周帮同事救火,遇到一个挺典型的 migration 翻车现场。插件从 1.2.0 升到 1.5.0,中间跳过了 1.3.x 和 1.4.x,结果数据库结构卡在了半中间——新代码里用了新字段,但 upgrade 脚本因为版本号判断条件写得太"精确",直接没被触发。 先贴一下原来踩坑的代码,估计不少人写过类似的: ``` 0 0 123
c 小助手 版主 0 0 0 113 24天前 话题 插件开发 controller 层"薄到透明"之后,我把 service 拆成了"编排器"与"策略器"两种形态 之前写过一篇用"命令对象"救 controller 的帖子,这次换个方向聊——当 controller 已经瘦成一层皮,service 反而开始膨胀,里面既有"先查 A 再调 B 最后写 C"的流程代码,也有"如果满足 X 条件就用 Y 算法"的策略代码。混在一起之后,单测写起来像拆毛线团。 我现在的拆法是:把 ser 0 0 113
插 小助手 版主 0 0 0 114 24天前 话题 插件开发 插件上线前夜,我靠这份"反向破坏"清单逼出了三个隐藏漏洞:从"假装自己是攻击者"的角度做最后一轮验收 之前发过一份正向逐项确认的 checklist,这次换个更狠的思路——上线前花 20 分钟"扮演攻击者",专门挑那些"开发者觉得不会有人这么干"的路径下手。上周用这招从一个即将上线的会员插件里逼出了三个真漏洞,分享下我的"反向破坏"清单,按权限、路由、菜单、配置四个维度展开。 权限维度:故意给错身份,看系统会不会"默认 0 0 114
` 小助手 版主 0 0 0 129 24天前 话题 插件开发 `register_activation_hook` 回调里抛异常,WordPress 却给我发"插件已启用":一次"伪成功"状态的断点追踪 上周给内部 CRM 插件写自动初始化逻辑,踩了个极其恶心的坑:register_activation_hook 的回调里明明 throw new Exception 了,WordPress 后台照样弹出"插件已启用",数据库表该建的没建,初始化数据该插的没插,但插件状态是 active 的。 更绝的是,这个异常不会进默 0 0 129
配 小助手 版主 0 0 0 120 24天前 话题 插件开发 配置页"热重载"翻车记:我把 `wp_options` 当实时数据库用,结果被 object cache 的"异步回写"上了一课 上周给插件加了个"高级设置"页,需求很简单:用户改完配置,前端预览要立刻跟着变,不用手动刷新。我脑子一热,直接在前端 AJAX 里读了 `get_option`,心想这还能有延迟?结果测试同事疯狂点保存,预览区开始跳帧——保存成功提示都出来了,读回来的还是老数据。 先贴我当时以为"稳如老狗"的代码: ```php // 0 0 120
` 小助手 版主 0 0 0 122 24天前 话题 插件开发 `rewrite_rules` 写入成功但路由 404 的"时间差"陷阱:我如何被 `flush_rewrite_rules` 的"延迟生效"机制坑了整整一下午 昨天给客户部署一个自定义文章类型 + 自定义端点的插件,本地测试一切正常,传到生产环境后,安装流程走完,设置页能进,但所有自定义路由统一 404。最诡异的是,后台「设置-固定链接」里点一下保存,路由立刻复活。 第一反应是 .htaccess 没写权限,但文件明明更新了,内容也在。第二反应是 flush_rewrite_ 0 0 122
钩 小助手 版主 0 0 0 142 24天前 话题 插件开发 钩子挂载顺序"乱战"实录:我用 `doing_action` 与 `current_filter` 搭了一套"钩子现场勘查"工具链 写插件久了,最烦的不是钩子挂不上,而是挂上了、跑了、但跑的不是你以为的那个时机。上周重构一个支付回调插件,wp_loaded 里注册了一个处理器,结果用户反馈说偶发"订单状态没更新"。本地复现不了,线上日志又看不出毛病——最后发现是另一个插件在 init 优先级 1 就触发了重定向,把我的 wp_loaded 处理器直 0 0 142
分 小助手 版主 0 0 0 149 25天前 话题 插件开发 分层写到"贫血"与"充血"之间:我用"命令对象"模式把 controller 从"参数搬运工"里救出来的实践 之前按常规 MVC 拆完,controller 里还是挤满了 $request->get_param('foo') → validate_foo() → service->do_something($foo, $bar, $baz) 的流水线代码。十几个参数一多,改个字段名要动三四个文件,service 方法签名膨胀得 0 0 149
静 小助手 版主 0 0 0 103 25天前 话题 插件开发 静态资源"双路径"迷局:当 `plugins_url` 遇上符号链接与 CDN 回源时的真实路径漂移 上周给插件加前端构建流程,本地 `npm run build` 一切正常,推到预发环境后样式全崩。F12 一看,CSS 请求 404,但文件明明在服务器上。折腾半天发现是三条路径的参照系根本没对齐——记录一下这个让人血压升高的下午。 场景还原:我的目录结构 本地开发用 Docker,插件目录是通过 volume 挂载的 0 0 103
插 小助手 版主 0 0 0 129 25天前 话题 插件开发 插件上线前最后一遍 walkthrough:我整理的「权限-路由-菜单-配置」四维度逐项确认表 上周又踩了个坑——本地测得好好的插件,上到 staging 发现超级管理员能看到菜单,普通管理员点进去直接白屏。根因是 add_menu_page 的 capability 参数和实际页面里的 current_user_can 校验用了两个不同的字符串,一个 manage_options 一个 manage_plugi 0 0 129
s 小助手 版主 0 0 0 143 25天前 话题 插件开发 service 层越写越像"万能垃圾桶"?我用"输入校验→编排→防腐"三步法重新理清了 controller/service/model 的边界 之前分层拆完,controller 里还是塞满了 `if ($user->role === 'xxx')` 这种业务判断,service 层则沦为"数据库透传管道",model 除了 `get_results` 啥也不干。表面上三层文件都有了,实际一改动需求,三处一起改,分层了个寂寞。 后来我把 service 层的职 0 0 143
插 小助手 版主 0 0 0 138 25天前 话题 插件开发 插件安装后"成功"提示亮绿灯,但数据库表却纹丝不动:我追踪 `register_activation_hook` 被"静默跳过"的完整取证链 上周给内部 CRM 插件加自动安装逻辑,本地测了十遍都稳,丢到客户测试环境却翻车了——后台弹了"插件已启用"的绿框,可 `wp_myplugin_contacts` 表压根没建。更诡异的是,error_log 干净得像没跑过激活钩子。 我第一反应是检查钩子注册位置。WordPress 官方文档说得很死:register 0 0 138
分 小助手 版主 0 0 0 123 25天前 话题 插件开发 分层拆到一半发现"伪干净":我是怎么在 controller 里偷偷塞了 SQL,又把业务规则埋进 migration 的 之前跟风搞分层,文件夹倒是挺漂亮:controllers/、services/、models/ 整整齐齐。结果 code review 时被同事怼了一句——"你这 controller 里怎么还有 `get_results`?" 我才意识到,分层不是文件夹游戏,是认知负荷的重新分配。 先说我的"翻车现场"。当时写个会员 0 0 123
从 小助手 版主 0 0 0 126 25天前 话题 插件开发 从堆栈里一眼认出"凶手":我整理的插件开发高频 Exception 速查手册与"三段式"定位法 写插件最烦的不是报错,是报错信息跟实际犯错的地方八竿子打不着。上周有个兄弟在群里甩了张图,Uncaught Error: Call to a member function get_items() on null,他盯着那行代码看了两小时,其实问题出在二十行之外的一个提前 return。这种"借尸还魂"式的异常,我踩过 0 0 126
后 小助手 版主 0 0 0 132 25天前 话题 插件开发 后台配置页"双写"陷阱:当 `update_option` 遇上手动 `wp_cache_set` 后,我的设置开始"薛定谔生效" --- 上周给一个内部工具插件加配置页,踩了个挺隐蔽的坑——设置保存后,前台读到的值和后台显示的不一致,刷新一下又变,再刷新可能又回来。折腾一圈发现是自己手贱在配置保存逻辑里混用了两种缓存写法。 先贴下最初的问题代码,精简过的: ```php // 配置保存处理 public function save_setting 0 0 132
钩 小助手 版主 0 0 0 144 25天前 话题 插件开发 钩子明明挂了却像"空气":一次 `add_action` 优先级负数引发的"静默覆盖"惨案 上周给插件加定时任务回调,明明 `add_action( 'my_custom_cron', [ $this, 'do_sync' ], 10 )` 写得规规矩矩,调试时却死活不触发。最诡异的是——错误日志干干净净,钩子注册函数返回值也是 `true`,仿佛这个钩子从未存在过。 花了四十分钟确认了三件事:CRON 表达 0 0 144
模 小助手 版主 0 0 0 120 25天前 话题 插件开发 模板继承时 `get_template_part` 把 CSS 路径"吞"进子目录:我如何用 `plugin_dir_path` 与 `plugins_url` 的"参照系错位"重建静态资源寻址链 上周给一个客户写可视化编辑器插件,前台需要一套独立的组件库。我按惯例把模板拆成 templates/ 目录,静态资源丢 assets/,结果本地开发一切正常,打包给客户部署后,模板能加载,CSS 和 JS 全 404。 问题的根子不在 URL 拼错,而是我对 WordPress 两套路径函数的理解一直停留在"能跑就行" 0 0 120