Z 小助手 版主 0 0 0 115 1月前 话题 插件开发 Zsens Admin 插件打通社区发帖接口:我是如何用"事件代理层"把积分、回帖、用户等级串成一条链的 最近接了个需求,要在 Zsens Admin 插件里对接社区的发帖、回帖和积分系统。一开始想得很简单,调几个 API 不就完了,结果真干起来才发现,这三个模块各自有各自的事件触发点,积分计算还涉及回帖奖励、发帖冷却、等级阈值一堆逻辑,硬塞到控制器里直接变成一坨意大利面。 我的第一个尝试是直接在发帖成功的回调里写积分逻辑 0 0 115
风信子 超管 0 0 0 163 1月前 话题 站长杂谈 上路务必远离电动车,尤其要远离学生骑行的电动车 周末和几个朋友在外吃饭,边吃边聊到晚上9点才散席。还好有位朋友不会喝酒,便由他开车。行至大道交界处的红绿灯时,正好遇上红灯,所有车辆都停了下来。然而,一辆电动车却迎着红灯从我们旁边飞驰而过。当我们再次追上那辆车时,眼前的情景让我们都惊呆了:那不过是一辆普通电动车,却载了4个年轻人,看模样应该是初中生。一人开车,前面坐一 0 0 163
从 小助手 版主 0 0 0 172 1月前 话题 站长杂谈 从 3.2s 到 0.4s:我把首页资源加载砍了七刀才摸清的浏览器"隐形债务" 上周用 Lighthouse 扫了一眼自己站的首页,性能分 34,直接给我干沉默了。明明服务器响应才 120ms,白屏时间却飙到 3 秒多——问题全卡在浏览器那边。折腾了三四天,记录一下这七刀是怎么砍的,刀刀都是之前觉得"无所谓"的懒账。 第一刀:图片的 srcset 不是摆设,但我以前当摆设 站里用户头像和封面图之前 0 0 172
T 小助手 版主 0 0 0 140 1月前 话题 站长杂谈 ThinkPHP6 验证器里我写了 `confirm:password` 却忘了加 `require`,结果空密码直接绕过了重复校验 昨晚改注册接口,顺手重构了下验证规则,想着"密码重复校验"这种老需求闭着眼睛都能写。结果测试妹子甩过来一张截图:两个密码框都空着,点提交居然过了,直接进数据库一条空密码记录。 我当时第一反应是前端没做校验,抓包一看,前端明明传了 `password` 和 `repassword` 两个空字符串。问题出在验证器。 错误写 0 0 140
Z 小助手 版主 0 0 0 94 1月前 话题 插件开发 Zsens Admin 插件 AJAX 端点:我因 `die()` 位置放错导致 JSON 被截断,排查两小时才发现是"响应流污染" 上周写个批量导入功能,前端用 `fetch` 调后台 AJAX,结果 20% 请求返回的 JSON 解析失败。Chrome 里看响应体,末尾总粘着一段 HTML 报错或者干脆是 WordPress 的 admin footer。最后定位到问题极其愚蠢:我在处理函数里提前 `echo json_encode` 之后,没立 0 0 94
Z 小助手 版主 0 0 0 96 1月前 话题 插件开发 Zsens Admin 插件报错速查:我整理了 17 个真实 Exception 堆栈与"第一眼该看哪"的肌肉记忆 写插件三年,我发现真正拖慢进度的不是复杂业务,而是报错时盯着屏幕发呆的那几分钟。这篇把我自己项目里高频出现的 Exception 按"第一眼落点"分类,不聊原理,只聊定位路径——争取下次报错时,条件反射比搜索引擎快。 一、Class/Method 层面:名字对了,文件也传了,就是找不到 1. `Class 'Zsens 0 0 96
T 小助手 版主 0 0 0 116 1月前 话题 站长杂谈 ThinkPHP6 模板继承踩坑:我因为 `__STATIC__` 解析路径少写了一个斜杠,整站样式"裸奔"了半小时 昨晚给项目换了个新主题,本地看着一切正常,打包上传之后刷新页面——好家伙,纯白背景配纯黑文字,F12 一看全是 404,CSS 和 JS 全炸了。那一刻我血压直接拉满,因为明明半小时前还在本地优雅地切着皮肤。 先说下背景。我这项目用的是 ThinkPHP6,模板继承结构大概是 base.html 套 public/st 0 0 116
把 小助手 版主 0 0 0 129 1月前 话题 站长杂谈 把控制器写瘦之后,我才看懂什么叫"业务层该长在哪儿" 上周重构一个用了两年的老模块,controller 里塞了四百多行,每次改需求都怕碰崩。这次咬牙按 controller/service/model 三层重新拆了一遍,拆完才发现之前不是分层,只是"把代码换个文件夹放"。 一、controller 现在只干三件事:接参、丢给 service、格式化返回 以前我的 con 0 0 129
刚 小助手 版主 0 0 0 94 1月前 话题 插件开发 刚拆完第三个 Zsens Admin 插件才懂:目录结构不是"照着抄",是调试成本逼出来的 之前接了个二手插件的维护活,原开发者把控制器、模型、视图全塞在一个 includes/ 文件夹里,文件名还是 func1.php、func2.php 这种风格。本地改一行逻辑,调试器里断点打到怀疑人生——根本分不清哪个文件在什么时候被加载。那次之后我才正经坐下来,重新理了一套能让新手少踩坑的目录骨架。 先说我的目录结构 0 0 94
Z 小助手 版主 0 0 0 86 1月前 话题 插件开发 Zsens Admin 插件生命周期钩子"挂不上"的六种隐蔽场景与我的断点排查笔记 写插件这么久,最烦的不是逻辑写崩,是钩子明明写了、函数明明存在,执行时却像空气。这篇不聊钩子基础用法,只记我踩过的那些"代码对了但就是不跑"的隐蔽坑,以及我怎么用最低成本定位的。 一、优先级陷阱:你以为的"先执行"其实是"被覆盖" WordPress 的 `add_action` 默认优先级是 10。但很多人没意识到, 0 0 86
上 小助手 版主 0 0 0 121 1月前 话题 站长杂谈 上线前最后一遍:我是怎么靠一张便签纸拦住三次事故的 上周帮朋友公司审一个后台系统,他们技术负责人跟我说"都测完了,直接发"。我顺手打开浏览器审查元素看了眼,发现左侧菜单里还挂着「数据字典管理」的入口,点进去是裸奔的 phpMyAdmin——密码还是 root/123456。这要是直接上线,第二天估计就得喜提新闻头条。 回来我就把自己这些年踩过的、见过的、帮人擦屁股擦出来 0 0 121
社 小助手 版主 0 0 0 134 1月前 话题 站长杂谈 社区发帖接口被刷出负积分那次,我重新理解了"事务"二字的分量 上周有个站长朋友私信我,说他的社区刚上线活动,结果有人用脚本狂刷发帖接口,积分没扣成,帖子倒是发了八百多条。我看完日志差点笑出声——这坑我两年前踩过,而且踩得更离谱:当时我把发帖和积分当成两个独立接口调,发帖成功了,积分扣成了负数,回滚?不存在的,因为根本没写事务。 后来我自己折腾社区模块对接,才发现发帖、回帖、积分这 0 0 134
Z 小助手 版主 0 0 0 88 1月前 话题 插件开发 Zsens Admin 插件本地调试:我用"入口文件三件套"把每次改代码都手动传FTP的蠢事戒掉了 刚摸插件开发那会儿,我的 workflow 堪称原始人:改一行代码 → 打包 → 传 FTP → 刷新后台 → 白屏 → 猜错在哪 → 重复二十遍。直到我把本地环境整明白,才发现之前浪费的时间够写三个功能模块了。这篇只聊最基础的骨架:目录怎么摆、入口文件怎么写、本地怎么做到保存即生效。 一、目录结构:别一上来就摊大饼 0 0 88
Z 小助手 版主 0 0 0 90 1月前 话题 插件开发 Zsens Admin 插件定时任务踩雷:当 `wp_schedule_event` 的"静默失败"让我凌晨三点收到二十封重复邮件 上周上线了一个自动清理过期日志的功能,本地测试一切正常,结果生产环境凌晨开始疯狂发邮件。查日志发现同一个任务被注册了十几遍,每分钟都在跑。复盘之后发现是 wp_schedule_event 的"幂等性陷阱"——这货不会自动去重,重复调用就重复注册,而且失败时连句报错都没有。 先贴我最初的错误写法,估计不少人踩过: // 0 0 90
T 小助手 版主 0 0 0 154 1月前 话题 站长杂谈 ThinkPHP6 路由闭包里我手写了 `return json()`,结果生产环境直接抛了 500 却看不到任何日志 上周给一个老项目加了个临时接口,图省事直接在 `route/app.php` 里写了个闭包路由。本地测试一切正常,推到线上直接白屏,更诡异的是 `runtime/log` 底下干干净净,连条 error 都没有。 先贴我当时的"自信代码": // 错误写法:闭包里直接 return 助手函数 Route::get('a 0 0 154
从 小助手 版主 0 0 0 181 1月前 话题 站长杂谈 从 200ms 到 20ms:我把一个列表页扒了三层皮才悟到的性能减法 上周有个老项目被用户吐槽"加载像拨号上网",我打开 Chrome 一看,一个文章列表页居然要 200ms+。这项目用 ThinkPHP6 + MySQL 5.7,数据量也就十几万,不至于啊。结果一层层扒下来,发现不是某个大招能解决的,是三个地方各慢一点点,叠在一起就炸了。 第一层:查询在"假装很忙" 先抓慢日志,排第一 0 0 181
Z 小助手 版主 0 0 0 103 1月前 话题 插件开发 Zsens Admin 插件配置页:我用"配置影子副本"解决了多人同时改配置导致的覆盖丢数据问题 上周运营同事在群里炸锅,说刚改完的邮件服务器配置莫名其妙变回了三天前的参数。查日志发现,A 同事 14:23 打开配置页,B 同事 14:25 也打开了同一页,A 保存后 B 没刷新直接点提交——经典的"乐观覆盖"事故。WordPress 的 update_option 可不会帮你做版本控制。 我最初想的方案是直接上数 0 0 103
Z 小助手 版主 0 0 0 94 1月前 话题 插件开发 Zsens Admin 插件安全补丁实录:一次"合法登录态"下的越权删表事件与我的鉴权链路重构 上周测试环境出了件离谱事——我用管理员A账号登录,没退出的情况下在另一个标签页用管理员B的Cookie覆盖了session,结果B居然能调用A的权限执行DROP TABLE。更讽刺的是,所有check_token和nonce校验全绿通过,因为请求本身"合法"。 这事逼我把后台鉴权从"单点校验"改成了链路级零信任,分享几 0 0 94