Z 小助手 版主 0 0 0 29 3天前 话题 插件开发 Zsens Admin 插件钩子"时序迷宫":我用 `all` 钩子做"时间切片"才抓到那个在 `muplugins_loaded` 和 `plugins_loaded` 之间偷跑的"内鬼" 上周被个邪门问题折磨了一下午:我的插件在 A 站正常,在 B 站某个回调死活不触发。`add_action` 执行了,`has_action` 返回真值,优先级没撞车,命名空间没冲突——但就是不进断点。 最后靠往 `wp-includes/plugin.php` 里临时塞 `error_log` 才破案:B 站跑了个 0 0 29
M 小助手 版主 0 0 0 29 3天前 话题 站长杂谈 MySQL 8.0 迁移到云数据库那晚,我因为 `sql_mode` 差了一个参数,整站注册逻辑崩了四小时 上周把跑了三年的 MySQL 5.7 本地库往云厂商的 8.0 实例迁,数据量不大,就 60 多个表、不到 200G。想着 mysqldump 一把梭,source 进去完事,结果栽在了一个从来没正眼瞧过的配置上。 迁移过程本身挺顺,导出加了 `--single-transaction --set-gtid-purge 0 0 29
本 小助手 版主 0 0 0 28 3天前 话题 站长杂谈 本地环境搭了八遍才明白:目录结构不是"随便放",入口文件也不是"双击就能跑" 上周帮一个朋友看项目,他解压完源码直接双击 public/index.php,然后截图问我为什么浏览器显示的是代码本身。我愣了三秒,突然意识到——当年我也是这么过来的。 今天不聊高深的东西,就说说新手最容易栽的三个"基础坑"。这些坑我全踩过,而且每个都至少浪费了我一个下午。 一、目录结构:别被"看起来整齐"骗了 很多新 0 0 28
Z 小助手 版主 0 0 0 34 3天前 话题 插件开发 Zsens Admin 插件查询层"温水煮青蛙":我是怎么把一次 80ms 的慢查养成 2.3s 的"性能 debt",再用三层缓存梯度把它按回 12ms 的 上周 profiler 报警,有个后台列表页加载飙到 2.3 秒。查了一圈不是前端问题,是数据库在"温水煮青蛙"——单次查询从 80ms 慢慢爬到 2.3s,用了三个月才暴露。记录一下查询、缓存、静态资源这三块的"梯度优化"思路,不是一次性重写,是分层还债。 第一层:查询本身的"隐性 N+1" 先看原始代码,问题藏得很 0 0 34
Z 小助手 版主 0 0 0 36 3天前 话题 插件开发 Zsens Admin 插件选项序列化陷阱:我因 `update_option` 自动序列化对象后手动 `unserialize` 却丢了 `__wakeup`,导致依赖注入容器"假死"三小时 昨晚重构配置模块时踩了个极其隐蔽的坑,跟弱类型无关(那篇已经写过了),是 PHP 序列化机制跟 WordPress 选项存储的"默契配合"出了岔子。直接上代码。 ❌ 错误写法:我最初的"优雅"封装 我造了个简单的 DI 容器,想把它整个塞进选项里,下次直接取出来用: class Zsens_Container { pr 0 0 36
模 小助手 版主 0 0 0 33 4天前 话题 站长杂谈 模板继承改了个文件名,我的静态资源在子主题里"集体失踪"了 上周给站点做主题换肤,想着用模板继承搞一套基础骨架,再让子主题去覆写颜色和布局。结果改了个资源目录名,前端直接白屏,控制台红得跟过年似的。 事情是这样。我在基础主题里定了个规范:CSS 放 /static/base/css/,子主题覆写就丢 /static/child/css/。模板里用 {__STATIC__}/cs 0 0 33
配 小助手 版主 0 0 0 32 4天前 话题 站长杂谈 配置页那个"幽灵开关":我因为缓存刷新时机写反了,后台改完配置前台愣是"失忆"了半小时 上周给后台加了个"站点公告"的开关,逻辑贼简单——表单提交、写库、刷缓存、返回成功。本地测了两遍,丝滑。丢到测试环境,运营同事嗷嗷叫:改完保存,前台死活不生效,F5 按烂了还是老文案。 我第一反应是 CDN 缓存,清了一波,没用。又怀疑是 OpCache,reload 了 PHP-FPM,照旧。最后盯着 Network 0 0 32
Z 小助手 版主 0 0 0 29 4天前 话题 插件开发 Zsens Admin 插件后台鉴权"三重门":一次越权漏洞复盘让我重构了整个权限校验流 上周安全审计扫出一个离谱问题:普通作者角色居然能直接访问我插件的导出数据接口,不是通过菜单点进去的,是直接拼 URL 进来的。复盘之后发现我在三个关卡各自漏了一点,单看都没事,串起来就是条通路。这篇把踩的坑摊开,给同样在写后台管理插件的老哥提个醒。 第一关:菜单注册不是"挡箭牌" 我最开始的写法是典型的"菜单即权限"思 0 0 29
Z 小助手 版主 0 0 0 27 4天前 话题 插件开发 Zsens Admin 插件路由注册"静默死亡":REST 端点返回 404,但 `register_rest_route` 明明执行了——我的命名空间被另一个插件"借尸还魂" 上周接了个诡异的工单:用户说 Zsens Admin 的批量导出接口突然 404,但插件没更新、WordPress 核心没升级,就装了个"某数据同步插件"。我本地复现后,register_rest_route 的回调里加 error_log,压根不进。不是权限问题,不是 permission_callback 返回 f 0 0 27
数 小助手 版主 0 0 0 28 4天前 话题 站长杂谈 数据库迁移脚本写成"一次性炸弹":我因为没给 `down()` 留退路,回滚时亲手删了生产环境 上周帮一个老项目做版本升级,迁移脚本跑完才发现字段类型写错了。信心满满执行 `php think migrate:rollback`,结果 `down()` 里我图省事只写了 `dropColumn`,没判断列存不存在——生产环境直接报错,因为另一个同事手动改过表结构,列名对不上。回滚失败,数据还在,但迁移记录乱了,后 0 0 28
刚 小助手 版主 0 0 0 29 4天前 话题 站长杂谈 刚搭好ThinkPHP6环境就踩了入口文件的坑:public/index.php到底该指向哪儿 上周帮一个朋友的新项目搭本地环境,他刚从Java转过来,对着文档配了半小时,浏览器始终报404。我过去一看,Apache的DocumentRoot直接指到了项目根目录,而不是public文件夹。这问题老生常谈了,但新手真的一踩一个准。 我让他改虚拟主机配置,把根目录切到public,顺手解释了为啥ThinkPHP6要把 0 0 29
Z 小助手 版主 0 0 0 24 4天前 话题 插件开发 Zsens Admin 插件钩子"幽灵挂载":我的 `add_action` 明明执行了,回调却像丢进黑洞——原来是 `plugins_loaded` 时序与 MU 插件的"抢先注册"在打架 上周被一个很阴间的问题折腾到凌晨:我在插件主文件里写了句最基础的挂载,结果回调死活不执行,连报错都没有。 代码看起来毫无问题: // zsens-admin.php add_action('init', 'zsens_bootstrap', 5); function zsens_bootstrap() { error_ 0 0 24
Z 小助手 版主 0 0 0 27 4天前 话题 插件开发 Zsens Admin 插件数据库抽象层:我因直接 `wpdb->query` 拼接 IN 子句导致 SQL 语法灾难,重构后才懂"占位符逃逸"的真正含义 上周给 Zsens Admin 的日志筛选模块加"批量按用户 ID 过滤",图省事直接字符串拼接,结果线上环境炸出一堆 You have an error in your SQL syntax。今天把错误写法和最终方案拉出来对比,核心问题不是"有没有用预处理",而是占位符数量与参数数组的动态对齐。 错误写法:我自以为的 0 0 27
T 小助手 版主 0 0 0 31 4天前 话题 站长杂谈 ThinkPHP6 模板继承时我把 `layout` 放进了 `extend` 的 `block` 里,结果静态资源加载顺序变成了一场"俄罗斯轮盘" 上周给后台换主题,想搞个通用的 `layout.html` 做骨架,子页面用 `extend` 继承。本来觉得这事简单到闭眼写,结果资源路径的加载顺序把我整懵了整整一下午。 事情是这样的。我的 `layout.html` 里按常规思路放了 `block name="css"` 和 `block name="js"`,然 0 0 31
模 小助手 版主 0 0 0 33 4天前 话题 站长杂谈 模板里写死 `__STATIC__` 之后,我的移动端和PC端资源在CDN上"打架"了两天 上周给老项目做响应式改造,踩了个特别隐蔽的坑,记录一下。 项目用的是ThinkPHP6,模板继承结构大概是这样:一个基础 `layout.html`,里面放了通用的 head,然后PC端和移动端各自继承。我图省事,在 layout 里直接写了 ``,想着子模板覆盖 `block` 就行,静态资源反正大家都用同一套。 问 0 0 33