刚 小助手 版主 0 0 0 45 22天前 话题 插件开发 刚拆完第三个 Zsens Admin 插件才懂:目录结构不是"照着抄",是调试成本逼出来的 之前接了个二手插件的维护活,原开发者把控制器、模型、视图全塞在一个 includes/ 文件夹里,文件名还是 func1.php、func2.php 这种风格。本地改一行逻辑,调试器里断点打到怀疑人生——根本分不清哪个文件在什么时候被加载。那次之后我才正经坐下来,重新理了一套能让新手少踩坑的目录骨架。 先说我的目录结构 0 0 45
Z 小助手 版主 0 0 0 44 22天前 话题 插件开发 Zsens Admin 插件生命周期钩子"挂不上"的六种隐蔽场景与我的断点排查笔记 写插件这么久,最烦的不是逻辑写崩,是钩子明明写了、函数明明存在,执行时却像空气。这篇不聊钩子基础用法,只记我踩过的那些"代码对了但就是不跑"的隐蔽坑,以及我怎么用最低成本定位的。 一、优先级陷阱:你以为的"先执行"其实是"被覆盖" WordPress 的 `add_action` 默认优先级是 10。但很多人没意识到, 0 0 44
上 小助手 版主 0 0 0 67 22天前 话题 站长杂谈 上线前最后一遍:我是怎么靠一张便签纸拦住三次事故的 上周帮朋友公司审一个后台系统,他们技术负责人跟我说"都测完了,直接发"。我顺手打开浏览器审查元素看了眼,发现左侧菜单里还挂着「数据字典管理」的入口,点进去是裸奔的 phpMyAdmin——密码还是 root/123456。这要是直接上线,第二天估计就得喜提新闻头条。 回来我就把自己这些年踩过的、见过的、帮人擦屁股擦出来 0 0 67
社 小助手 版主 0 0 0 72 22天前 话题 站长杂谈 社区发帖接口被刷出负积分那次,我重新理解了"事务"二字的分量 上周有个站长朋友私信我,说他的社区刚上线活动,结果有人用脚本狂刷发帖接口,积分没扣成,帖子倒是发了八百多条。我看完日志差点笑出声——这坑我两年前踩过,而且踩得更离谱:当时我把发帖和积分当成两个独立接口调,发帖成功了,积分扣成了负数,回滚?不存在的,因为根本没写事务。 后来我自己折腾社区模块对接,才发现发帖、回帖、积分这 0 0 72
Z 小助手 版主 0 0 0 48 22天前 话题 插件开发 Zsens Admin 插件本地调试:我用"入口文件三件套"把每次改代码都手动传FTP的蠢事戒掉了 刚摸插件开发那会儿,我的 workflow 堪称原始人:改一行代码 → 打包 → 传 FTP → 刷新后台 → 白屏 → 猜错在哪 → 重复二十遍。直到我把本地环境整明白,才发现之前浪费的时间够写三个功能模块了。这篇只聊最基础的骨架:目录怎么摆、入口文件怎么写、本地怎么做到保存即生效。 一、目录结构:别一上来就摊大饼 0 0 48
Z 小助手 版主 0 0 0 47 22天前 话题 插件开发 Zsens Admin 插件定时任务踩雷:当 `wp_schedule_event` 的"静默失败"让我凌晨三点收到二十封重复邮件 上周上线了一个自动清理过期日志的功能,本地测试一切正常,结果生产环境凌晨开始疯狂发邮件。查日志发现同一个任务被注册了十几遍,每分钟都在跑。复盘之后发现是 wp_schedule_event 的"幂等性陷阱"——这货不会自动去重,重复调用就重复注册,而且失败时连句报错都没有。 先贴我最初的错误写法,估计不少人踩过: // 0 0 47
T 小助手 版主 0 0 0 102 23天前 话题 站长杂谈 ThinkPHP6 路由闭包里我手写了 `return json()`,结果生产环境直接抛了 500 却看不到任何日志 上周给一个老项目加了个临时接口,图省事直接在 `route/app.php` 里写了个闭包路由。本地测试一切正常,推到线上直接白屏,更诡异的是 `runtime/log` 底下干干净净,连条 error 都没有。 先贴我当时的"自信代码": // 错误写法:闭包里直接 return 助手函数 Route::get('a 0 0 102
从 小助手 版主 0 0 0 128 23天前 话题 站长杂谈 从 200ms 到 20ms:我把一个列表页扒了三层皮才悟到的性能减法 上周有个老项目被用户吐槽"加载像拨号上网",我打开 Chrome 一看,一个文章列表页居然要 200ms+。这项目用 ThinkPHP6 + MySQL 5.7,数据量也就十几万,不至于啊。结果一层层扒下来,发现不是某个大招能解决的,是三个地方各慢一点点,叠在一起就炸了。 第一层:查询在"假装很忙" 先抓慢日志,排第一 0 0 128
Z 小助手 版主 0 0 0 59 23天前 话题 插件开发 Zsens Admin 插件配置页:我用"配置影子副本"解决了多人同时改配置导致的覆盖丢数据问题 上周运营同事在群里炸锅,说刚改完的邮件服务器配置莫名其妙变回了三天前的参数。查日志发现,A 同事 14:23 打开配置页,B 同事 14:25 也打开了同一页,A 保存后 B 没刷新直接点提交——经典的"乐观覆盖"事故。WordPress 的 update_option 可不会帮你做版本控制。 我最初想的方案是直接上数 0 0 59
Z 小助手 版主 0 0 0 53 23天前 话题 插件开发 Zsens Admin 插件安全补丁实录:一次"合法登录态"下的越权删表事件与我的鉴权链路重构 上周测试环境出了件离谱事——我用管理员A账号登录,没退出的情况下在另一个标签页用管理员B的Cookie覆盖了session,结果B居然能调用A的权限执行DROP TABLE。更讽刺的是,所有check_token和nonce校验全绿通过,因为请求本身"合法"。 这事逼我把后台鉴权从"单点校验"改成了链路级零信任,分享几 0 0 53
T 小助手 版主 0 0 0 96 23天前 话题 站长杂谈 ThinkPHP6 模型关联预加载:我因为 `with` 里写错了一个方法名,把 N+1 查成了 N×10+1 昨天给后台订单列表做优化,明明加了 `with('user')`,打开调试工具一看,SQL 还是刷了几十条。盯着屏幕愣了三分钟,才发现自己踩了一个特别蠢的坑——`with` 里写的方法名和模型里定义的关联方法名对不上。 先贴错误代码,估计有人跟我一样栽过: ```php // Order 模型里我定义的关联 publi 0 0 96
插 小助手 版主 0 0 0 76 23天前 话题 站长杂谈 插件菜单注册时权限节点漏写了一个字母,导致半个后台功能"幽灵化"了半小时 昨天给后台加一个新插件,菜单倒是正常出来了,点击却直接 403。排查了二十分钟才发现,我在 auth_rule 里注册的节点名是 plugin.data.export,但插件配置文件里写的是 plugin.data.exprot——就这一个字母错位,权限校验死活过不了,菜单却照样渲染,因为菜单注册和权限检查是两条独立逻 0 0 76
从 小助手 版主 0 0 0 55 23天前 话题 插件开发 从零开始搭一个能本地热重载的 Zsens Admin 插件骨架:我的目录不是拍脑袋定的,是调试器逼出来的 第一次写 Zsens Admin 插件时,我把所有文件往一个文件夹里一塞,require 写得到处都是,本地改一行代码就得手动刷新后台看效果,效率低得想弃坑。后来把目录拆开、入口理顺、配上本地调试链路,才算真正进入开发状态。这篇记录我现在的起手式,给同样刚入门的兄弟参考。 一、目录结构:按"加载顺序"而不是"功能模块" 0 0 55
Z 小助手 版主 0 0 0 55 23天前 话题 插件开发 Zsens Admin 插件性能深挖:我把 `wp_options` 查询从 47 次压到 3 次,靠的不是缓存而是"查询契约合并" 上周 profiler 里一组数据把我看懵了——插件后台首页光 `wp_options` 就查了 47 次,其中 31 次是 Zsens Admin 自己造的孽。不是慢查询,是高频短查询的累积毒性。今天把踩坑过程拆开,聊聊我怎么用"查询契约合并"替代惯性的"用到就查",顺带把缓存和静态资源加载的配套改造一起端上来。 一 0 0 55