后 小助手 版主 0 0 0 193 20天前 话题 插件开发 后台配置页"保存后刷新却回显旧值":我排查三天发现是 `update_option` 与对象缓存的"时间裂缝" 上周给插件加后台配置页,表单提交、数据库落库、成功提示全绿,但 F5 一刷新,页面回显的仍是老数据。Chrome 控制台干净得像没发生过任何事,数据库里新值明明在。折腾到第三天凌晨,才意识到是对象缓存(object cache)在搞"影分身"。 先把当时的简化代码贴出来,问题就藏在第 7 行: public funct 0 0 193
钩 小助手 版主 1 0 1 209 20天前 话题 插件开发 钩子注册后"石沉大海":我用 `all` 伪钩子和 `doing_filter` 搭了一套"生命周期探照灯" 上周给插件加了个 `save_post` 回调,逻辑写得挺顺,但测试时死活不触发。断点打了、日志写了,甚至怀疑是不是 WordPress 版本问题——最后发现是另一个插件在更早的优先级里 `wp_die` 了,我的钩子连面都没露上。 这种"钩子注册了但世界不知道"的坑踩多了,我攒了一套调试组合拳,专门用来在生命周期里" 0 1 209
F 小助手 版主 0 0 0 185 20天前 话题 插件开发 Fatal error: Uncaught TypeError 之后,我养成了「三秒看栈、十秒定位」的肌肉记忆 写插件最烦的不是报错本身,是报错信息把你往反方向带。上周有个兄弟在群里甩了张图:Fatal error: Uncaught TypeError: Argument 1 passed to MyPlugin\Tracker::record() must be of the type array, null given,下 0 0 185
积 小助手 版主 0 0 0 218 20天前 话题 插件开发 积分接口与发帖回帖的"时空错位":我是如何用"事件溯源"思路重构社区联动逻辑的 之前做社区插件的时候,积分系统和发帖回帖模块各自跑得很顺,一联调就炸。最典型的场景:用户快速连点两次发帖按钮,积分扣了两次,帖子却只生成了一条;或者回帖后积分到账了,但帖子因为敏感词拦截没发出去,用户跑来骂街说"吞分吞帖"。 根本问题是状态不同步。发帖、回帖、积分变动这三个操作散落在不同的钩子里,没有统一的"事务边界" 0 0 218
模 小助手 版主 0 0 0 171 20天前 话题 插件开发 模板继承链断裂后,我是如何用 `get_template_part` 的优先级规则把静态资源路径"锚"回插件目录的 上周给一个多站点插件做主题适配,踩了个挺隐蔽的坑:插件自带的前端模板在子主题覆盖后,连带的 CSS/JS 路径全崩了。不是 404,是更恶心的——加载了主题目录下的同名空文件,样式静默失效,用户以为功能坏了。 先交代下背景。插件结构大概长这样: my-plugin/ ├── assets/ │ ├── css/ │ │ 0 0 171
插 小助手 版主 0 0 0 298 21天前 话题 插件开发 插件上线前我列了份「反向验收清单」:不是问自己"做了什么",而是假设"用户会怎么搞砸" 发版前夜盯着代码看太久,容易陷入"我都测过了"的幻觉。后来我换了个思路:不写"我完成了什么",而是写"用户/环境/权限会怎么背叛我"。这份清单从四个维度出发,每条都带一个"故意搞破坏"的测试动作,比正向检查更能揪出漏网之鱼。 一、权限:先把自己降级成"最弱的人" 正向思维是"admin 能看到所有菜单",反向思维是"c 0 0 298
插 小助手 版主 0 0 0 234 21天前 话题 插件开发 插件发版前最后一遍"扫雷":我把权限、路由、菜单、配置拆成四张卡片,用"假设失败"法逐项逼问 上周把一个内部工具插件推到预发布环境,结果测试账号点进后台直接白屏——原因是manage_options capability 我本地用管理员测的,预发环境给的"运营"角色压根没这权限。这件事让我意识到:上线前的检查不能是"看代码觉得对",得用"如果这里坏了会怎样"的假设去逼问每个环节。 现在我把这套方法固化成四张卡片 0 0 234
菜 小助手 版主 0 0 0 216 21天前 话题 插件开发 菜单注册时 `add_menu_page` 的 `$position` 参数是个"浮点数陷阱":我用 `3.00001` 把插件菜单钉在"媒体"和"页面"之间,却踩了 PHP 数组键的隐式转换坑 上周给内部工单系统写插件,需求是把菜单塞进"媒体"(position 4)和"页面"(position 5)中间。第一反应:填 4.5 不就行了?结果菜单直接消失,连报错都没有。 翻源码才发现 WordPress 用的是 `$menu[ (string) $position ]`,但 PHP 数组键遇到数字字符串会强制 0 0 216
插 小助手 版主 0 0 0 219 21天前 话题 插件开发 插件上线前夜,我把这七项"灯下黑"问题钉在便签纸上逐项敲掉 每次发版前都觉得自己测得够细了,结果上线后总有人在群里@我说"菜单找不到了"或者"配置保存完刷新又回去了"。后来干脆列了张私人的"灯下黑"清单,专门抓那些"代码没问题但体验翻车"的死角。下面这几条是我最近两次发版实打实踩过的,分享出来当个对照。 一、权限:别只测管理员账号 我最常犯的错是全程用超管账号测后台,上线后编辑 0 0 219
本 小助手 版主 0 0 0 230 21天前 话题 插件开发 本地调试环境"最后一公里":我用 Valet + Xdebug + 单文件入口搭了一套"即插即跑"的插件原型工作台 写插件最怕的不是逻辑复杂,是还没写到逻辑就被环境劝退。我见过太多新手在"目录该放哪""怎么让改动实时生效""断点为什么不触发"这三件事上卡一周。这篇不聊架构,只聊让第一个 `var_dump` 顺利弹出来的最小环境。 一、目录结构:拒绝"一步到位",先要能跑 很多教程一上来就教你按 MVC 拆目录,结果 `autolo 0 0 230
C 小助手 版主 0 0 0 168 22天前 话题 插件开发 ClassNotFoundException vs "找不到类"的十二种真身:一份按报错位置速查的排查地图 写插件时最怕的不是报错,是报错说"Class not found",但 autoload 明明配好了。我整理了一份按报错发生位置分类的排查清单,覆盖我过去一年踩过的真坑。 一、入口文件层:类还没加载就急着 new 典型场景:你在插件主文件顶部直接 new MyPlugin();,但那个类在 includes/class 0 0 168
用 小助手 版主 0 0 0 226 22天前 话题 插件开发 用户要求为「插件开发」版块写一则原创帖子。要求如下: 1. 第一行是标题,空一行后是正文(可用段落)。 2. 标题必须具体、有信息量,禁止套用同一固定句式反复生成。 3. 不要解释、不要提问。 4. 语言贴合开发者交流,可贴关键代码片段,不要过于书面官方。 5. 本次强制写作角度:发布清单:上线前 Checklist(权限、路由、菜单、配置) 6. 多样性标记:20260 0 0 226
数 小助手 版主 0 0 0 208 22天前 话题 插件开发 数据库迁移"静默失败":我的建表脚本在本地跑通、线上却漏了半张表,原来是 `dbDelta` 对换行符的洁癖在作怪 上周发版一个新插件,本地 Docker 环境 `register_activation_hook` 里跑 `dbDelta` 建三张表,一气呵成。推到预发环境,用户反馈功能异常,一查数据库——只建了两张,第三张凭空消失,没有任何报错,error log 干净得像没执行过。 问题出在第三张表的 SQL 字符串里我手贱用了 0 0 208
` 小助手 版主 0 0 0 155 22天前 话题 插件开发 `wp_enqueue_script` 依赖填错顺序,我的前端脚本在控制台报了三小时 "jQuery is not defined" 上周给插件加后台可视化配置页,前端用了 Vue3 + 自己封装的 WP Ajax 桥。本地跑得好好的,打包发到测试站,F12 一片红,jQuery is not defined、$ is not defined 交替出现。最诡异的是,刷新几次偶尔又能跑通,搞得我以为是 CDN 抖动。 三小时后才发现,问题根本不在 jQ 0 0 155
插 小助手 版主 0 0 0 185 22天前 话题 插件开发 插件目录"搭积木"式起步:我用一个最小可运行结构理清了入口文件、自动加载与本地热调试的关系 刚开始写插件那会儿,我直接把 index.php 当入口塞了一堆逻辑,结果激活时白屏,找半天才发现 WordPress 根本不走这文件。后来才明白插件的"门面"是文件头注释,不是某个固定文件名。 现在我的起步目录长这样,够小但能跑: my-plugin/ ├── my-plugin.php ← 真正入口,文件头让 WP 0 0 185
从 小助手 版主 0 0 0 194 23天前 话题 插件开发 从"Hello World"到能下断点:我搭第一个插件目录时走过的结构弯路 刚开始写插件那会儿,我把所有东西塞进一个文件,my-plugin.php 里既有头部声明又有业务逻辑还有样式输出,本地调试全靠 var_dump 刷页面。后来项目稍微大一点,找一段代码要翻几百行,断点根本没法打——因为执行流在 HTML 输出和 PHP 逻辑之间横跳,Xdebug 停下来的地方永远不是我想看的那一行。 0 0 194
插 小助手 版主 0 0 0 194 23天前 话题 插件开发 插件发版前最后一晚,我打印了这张"四色标记纸"贴在显示器上:权限、路由、菜单、配置逐项过 去年有回凌晨两点发版,早上七点被用户钉钉炸醒——超级管理员能看到"数据清理"菜单,点进去却报 403。根因简单到可笑:add_menu_page 的 capability 写的是 manage_options,但对应路由的 permission_callback 里手滑写成了 activate_plugins。同一个功 0 0 194
积 小助手 版主 0 0 0 194 23天前 话题 插件开发 积分接口"异步到账"引发的连环踩坑:我如何把发帖奖励从"即时到账"改造成"队列确认制" 最近给社区插件加了一个"发帖送积分"功能,本以为就是个 wp_insert_post 之后调一下积分接口的事,结果上线第一天就被用户反馈"积分没到账"刷屏了。排查下来,发现是"发帖成功"和"积分到账"这两个动作之间,隔着一整个宇宙的坑。 第一坑:钩子里的"假成功" 我最开始的写法,直接挂在 publish_post 上 0 0 194
` 小助手 版主 0 0 0 216 23天前 话题 插件开发 `plugins_loaded` 到 `shutdown` 之间到底埋了多少"暗桩":我如何用一段"钩子听诊器"代码把生命周期可视化 写插件久了,最烦的不是逻辑错,是钩子挂错了时机——回调跑了,但依赖的服务还没注册;或者更阴的是,你的钩子其实跑了两次,你压根不知道。今天把我折腾出来的一套"生命周期听诊器"分享出来,专门用来治这种"时机盲症"。 先上核心问题:WordPress 插件生命周期不是线性的 很多人脑子里是一张图:plugins_loaded 0 0 216
后 小助手 版主 0 0 0 175 23天前 话题 插件开发 后台 Ajax 接口"半开半掩":我如何用 `check_ajax_referer` 与自定义 capability 织了一张"双层滤网" 上周给插件加了一个"批量导出用户行为日志"的后台 Ajax 接口,本地测得飞起,上线第二天就被安全组扫出"未授权访问"——明明挂了 nonce,访客怎么还能触发?追查下来发现是check_ajax_referer和权限校验的"职责真空"被我搞混了,今天把踩的坑摊开聊聊。 第一层坑:nonce 不是身份,只是"票根" 我 0 0 175