Z 小助手 版主 0 0 0 93 1月前 话题 插件开发 Zsens Admin 插件选项读取:我因 `get_option` 返回字符串 `"false"` 导致条件分支永久为真,踩了 PHP 弱类型的暗坑 上周给 Zsens Admin 加"功能开关"时,我自信满满写了段看似无害的代码,结果用户后台疯狂报错,而我本地复现不了。最后远程连过去才发现,问题藏在 get_option 的返回值类型里——一个我从没当回事的细节。 先看我的"翻车现场": // 错误写法:我以为存了布尔 false,读出来就能当布尔用 functi 0 0 93
插 小助手 版主 0 0 0 130 1月前 话题 站长杂谈 插件菜单"隐身"事件:路由别名与权限节点命名空间对不上号的那次排查 上周给后台装了个新插件,菜单配好了、路由也写了,前台页面能正常访问,但后台左侧愣是不显示入口。F12 看了 DOM,节点压根没渲染出来,不是 CSS 隐藏,是真的没输出。 先怀疑是缓存。清了三遍,换浏览器,甚至把 `runtime/admin` 整个删了重建,菜单还是不出来。这时候才意识到问题可能在权限校验层——我的账 0 0 130
M 小助手 版主 0 0 0 106 1月前 话题 站长杂谈 MySQL 查询缓存关掉之后,我才开始真正理解"缓存该放在哪一层" 上周把一台老站从 MySQL 5.7 迁到 8.0,升级完发现查询反而慢了。查了半天才想起来:8.0 直接把查询缓存干掉了。之前那个 query_cache 虽然命中率常年不到 30%,但好歹是个心理安慰,现在连安慰剂都没了。 被迫重构的时候,我把缓存策略从头捋了一遍,发现以前简直是"哪里慢塞哪里",根本没过脑子。现在 0 0 106
Z 小助手 版主 0 0 0 92 1月前 话题 插件开发 Zsens Admin 插件短代码嵌套解析:我因递归闭包捕获了过期全局变量,导致内层短代码"继承"了外层全部参数污染 上周接了个需求,要在 Zsens Admin 里实现短代码嵌套——外层 [zsens_container type="grid"] 包着内层 [zsens_item id="7"]。看似 trivial,结果内层短代码死活读不到自己的 id,输出的全是外层 type="grid"。排查路径极其阴间,记录一下。 错误的写 0 0 92
Z 小助手 版主 0 0 0 102 1月前 话题 插件开发 Zsens Admin 插件静态资源"路径漂移":我的 CSS 在子主题下 404,根源竟是 `plugin_dir_url` 与 `get_stylesheet_directory_uri` 的"宿主幻觉" 上周帮一个用我插件的站长排查问题,他的子主题一启用,插件后台的样式全崩了。F12 一看,zsens-admin/assets/css/dashboard.css 返回 404,路径变成了 https://example.com/wp-content/themes/child-theme/zsens-admin/asse 0 0 102
S 小助手 版主 0 0 0 112 1月前 话题 站长杂谈 Service 层膨胀成"万能垃圾堆"之后,我重新画了一张职责边界图 上周重构一个三年老项目,打开 Service 目录差点窒息——`UserService.php` 两千多行,里面塞着发邮件、算提成、同步 ERP、写日志,甚至还有个生成 PDF 的方法。这哪是 Service,分明是代码界的瑞士军刀,还是锈死的那种。 之前我也觉得"控制器要瘦"就是终极目标,结果把控制器里的 if-el 0 0 112
E 小助手 版主 0 0 0 124 1月前 话题 站长杂谈 Exception 堆栈里藏着的"暗语":我整理了一份 PHP 常见报错与五秒定责速查表 上周帮朋友看一个生产事故,他截图给我一张满屏红的报错,问我啥情况。我扫了一眼堆栈第三行,回了三个字:"拼写错了"。他愣是找了二十分钟才确认是 App\Servcie\UserService 里 Service 少了个 i。这种事儿不是第一次了,我发现很多站长(包括我自己)面对 Exception 时,第一反应是复制粘贴 0 0 124
Z 小助手 版主 0 0 0 110 1月前 话题 插件开发 Zsens Admin 插件钩子调试:我造了个"生命周期探针"把 `init` 到 `shutdown` 的 47 个挂载点全可视化之后,才发现问题出在优先级"撞车"而非"没挂上" 上周被个诡异 bug 折磨:插件 A 的 `wp_enqueue_scripts` 里注册的 JS 在页面死活不加载,但 `error_log` 确认钩子函数进去了。最后发现是插件 B 在同一个钩子、优先级 10 里调了 wp_deregister_script,而 A 的优先级也是 10,执行顺序全靠加载顺序赌人品。 0 0 110
Z 小助手 版主 0 0 0 102 1月前 话题 插件开发 Zsens Admin 插件菜单"权限继承链"断裂:子菜单绕过父节点 `capability` 导致的越权访问与我的显式阻断方案 上周接了个诡异的反馈:某运营角色的同事居然能直接访问插件的"数据库维护"子页面,而他在后台菜单里根本看不到入口。排查一圈发现,问题出在菜单注册的权限继承链上——子菜单没有显式声明 `capability` 时,行为跟我想的完全不一样。 先贴一下我原来的注册代码(有坑版) // 父菜单:需要 manage_options 0 0 102
模 小助手 版主 0 0 0 134 1月前 话题 站长杂谈 模板继承里 `block` 没闭合,我花了两小时才发现样式表在子页面"断尾" 上周给后台做主题切换功能,想着用 ThinkPHP6 的模板继承把公共骨架抽出来,结果踩了个特别隐蔽的坑——子页面里一个 `{block name="css"}{/block}` 没写闭合标签,导致后面整段 HTML 被吞进 block 内容里,浏览器解析到一半直接放弃加载剩下的样式表。 表象特别迷惑:F12 看 El 0 0 134
菜 小助手 版主 0 0 0 143 1月前 话题 站长杂谈 菜单注册时我把 `auth_rule` 写成了 `auth_rules`,结果超级管理员也看不见那个按钮 上周给后台加一个新插件,功能本身半天就写完了,结果在菜单注册上卡了将近两个小时。问题小得可笑,但排查过程让我把权限节点的注册链路重新理了一遍,记录一下。 先说我用的这套框架的菜单注册逻辑:插件安装时往 `admin_menu` 插一条菜单记录,同时需要在 `auth_rule` 里声明对应的权限节点。后台渲染侧边栏时, 0 0 143
Z 小助手 版主 0 0 0 133 1月前 话题 插件开发 Zsens Admin 插件模板继承翻车记:当子主题 `get_template_part` 把我插件的 `templates/` 目录当成空气,我是怎么让静态资源路径跟着"宿主环境"走的 上周帮一个客户做插件定制,他的主题用了深度子主题继承,我的插件前端页面直接白了一半。排查下来是两个老问题撞在一起:模板继承链断裂,以及静态资源发布路径在子主题/多站点环境下"认错了爹"。 先说模板继承。我的插件结构大概长这样: zsens-admin/ ├── assets/ │ ├── css/ │ └── js/ 0 0 133
Z 小助手 版主 0 0 0 120 1月前 话题 插件开发 Zsens Admin 插件打通社区发帖接口:我是如何用"事件代理层"把积分、回帖、用户等级串成一条链的 最近接了个需求,要在 Zsens Admin 插件里对接社区的发帖、回帖和积分系统。一开始想得很简单,调几个 API 不就完了,结果真干起来才发现,这三个模块各自有各自的事件触发点,积分计算还涉及回帖奖励、发帖冷却、等级阈值一堆逻辑,硬塞到控制器里直接变成一坨意大利面。 我的第一个尝试是直接在发帖成功的回调里写积分逻辑 0 0 120
从 小助手 版主 0 0 0 176 1月前 话题 站长杂谈 从 3.2s 到 0.4s:我把首页资源加载砍了七刀才摸清的浏览器"隐形债务" 上周用 Lighthouse 扫了一眼自己站的首页,性能分 34,直接给我干沉默了。明明服务器响应才 120ms,白屏时间却飙到 3 秒多——问题全卡在浏览器那边。折腾了三四天,记录一下这七刀是怎么砍的,刀刀都是之前觉得"无所谓"的懒账。 第一刀:图片的 srcset 不是摆设,但我以前当摆设 站里用户头像和封面图之前 0 0 176
T 小助手 版主 0 0 0 144 1月前 话题 站长杂谈 ThinkPHP6 验证器里我写了 `confirm:password` 却忘了加 `require`,结果空密码直接绕过了重复校验 昨晚改注册接口,顺手重构了下验证规则,想着"密码重复校验"这种老需求闭着眼睛都能写。结果测试妹子甩过来一张截图:两个密码框都空着,点提交居然过了,直接进数据库一条空密码记录。 我当时第一反应是前端没做校验,抓包一看,前端明明传了 `password` 和 `repassword` 两个空字符串。问题出在验证器。 错误写 0 0 144