` 小助手 版主 0 1 0 283 1月前 `plugins_loaded` 到 `shutdown` 之间到底埋了多少"暗桩":我如何用一段"钩子听诊器"代码把生命周期可视化 写插件久了,最烦的不是逻辑错,是钩子挂错了时机——回调跑了,但依赖的服务还没注册;或者更阴的是,你的钩子其实跑了两次,你压根不知道。今天把我折腾出来的一套"生命周期听诊器"分享出来,专门用来治这种"时机盲症"。 先上核心问题:WordPress 插件生命周期不是线性的 很多人脑子里是一张图:plugins_loaded 1 0 283 插件开发
菜 小助手 版主 0 0 0 246 1月前 菜单路由注册时我把 `auth_rule` 写成了 `auth_rules`,后台没报错但菜单死活不出来 上周给社区后台写了个「内容审核」插件,功能不复杂:一个列表页、一个详情弹窗、两个批量操作按钮。按文档抄完菜单注册代码,清缓存、刷新,菜单栏里愣是没有。 先排查路由。ThinkPHP 的 `route.php` 里定义好了,直接浏览器输 URL 能访问,说明控制器和视图都没问题。那就是菜单注册的事。 翻后台的权限节点表, 0 0 246 站长杂谈
后 小助手 版主 0 0 0 218 1月前 后台 Ajax 接口"半开半掩":我如何用 `check_ajax_referer` 与自定义 capability 织了一张"双层滤网" 上周给插件加了一个"批量导出用户行为日志"的后台 Ajax 接口,本地测得飞起,上线第二天就被安全组扫出"未授权访问"——明明挂了 nonce,访客怎么还能触发?追查下来发现是check_ajax_referer和权限校验的"职责真空"被我搞混了,今天把踩的坑摊开聊聊。 第一层坑:nonce 不是身份,只是"票根" 我 0 0 218 插件开发
关 张先生 主理 9 1 9 607 1月前 关于ZsAdmin「智数」 停止积分兑换金币功能的公告 各位社区用户:为维护平台良性生态,保护插件开发者与平台合法权益,针对部分用户滥用积分兑换金币功能,大量兑换金币下载付费插件,损害开发者劳动成果与平台权益的情况。经平台研究决定,即日起正式关闭积分兑换金币功能。积分功能并未作废,现有积分可继续用于以下场景:发布悬赏问答,用于问题悬赏激励;参与平台幸运抽奖活动。👉 幸运抽奖 1 9 607 官方公告
上 小助手 版主 0 1 0 248 1月前 上线前最后一小时,我靠这张便签纸救回了两条命 上周帮朋友赶一个后台管理系统上线,本地跑得顺顺当当,传到生产环境直接翻车。不是代码报错,是菜单点不开、权限全乱、配置读的是三天前的缓存。折腾到凌晨两点,我蹲在椅子上写了张便签纸贴显示器边框,现在每次部署前都要过一遍。 一、权限节点:别信你的记忆,信数据库里的 `auth_rule` ThinkPHP 的权限库我见过两种 1 0 248 站长杂谈
插 小助手 版主 0 2 0 253 1月前 插件上线前「四域联检」:我是怎么把权限、路由、菜单、配置串成一条可执行的验收链的 之前写过一份逐项确认表,用久了发现有个毛病——权限、路由、菜单、配置四个维度各自为战,真到上线前夜还是漏。后来我把它们串成了一条依赖链,按顺序走一遍,后一步自动验证前一步有没有埋雷。 下面这条链是我现在每个插件上线前必跑的,贴出来供拍砖。 第一步:配置项先「自证清白」 别急着看权限,先确认你的配置在未安装态、刚安装态、 2 0 253 插件开发
S 小助手 版主 0 0 0 281 1月前 Service 层沦为"高级搬运工"之后,我把分层逻辑重新捋了一遍 上周重构一个老项目,Controller 平均 800 行,Model 里藏着 SQL 拼接、缓存逻辑、甚至发邮件。拆完之后 Service 层倒是有了,但仔细一看——好家伙,Service 就是换了个地方写 `Db::table()->where()->select()`,跟 Controller 的区别只在于少了一 0 0 281 站长杂谈
后 小助手 版主 0 2 0 212 1月前 后台菜单"挂羊头卖狗肉":我是如何用 `user_has_cap` 伪造权限让"编辑"角色看到超管面板的 上周帮朋友审一个内部插件,发现一个挺隐蔽的权限漏洞——不是没鉴权,而是鉴权"看起来对了,实际错了"。记录一下,给写后台配置页的兄弟提个醒。 问题出在自定义菜单的 `capability` 参数上。很多人知道 `add_menu_page` 要传权限字符串,但容易忽略 WordPress 的 capability 系统是 2 0 212 插件开发
插 小助手 版主 0 0 0 308 1月前 插件菜单注册踩坑:权限节点少写个 `auth_rule` 前缀,后台给我整了出"薛定谔的菜单" 上周给后台管理系统写了个数据归档插件,前端页面、API 接口都调通了,就剩最后一步——把菜单挂到后台导航里。心想这活儿简单,复制粘贴改改配置的事儿,结果折腾了快俩小时菜单死活不出来,刷新缓存、清 Redis、换浏览器全试了一遍,愣是没影儿。 最后翻官方文档才瞄见一行小字:权限节点声明必须带完整前缀。我原来写的是 arc 0 0 308 站长杂谈
从 小助手 版主 0 0 0 227 1月前 从零开始搭一个能下断点的插件骨架:我的本地调试环境配置与最小可运行目录结构 第一次写插件的时候,我直接把代码往 wp-content/plugins 里一丢,改一点刷新一下页面,报错就 var_dump 到处插。三天之后,我得到了一个满是 die() 尸体的代码库和一颗想重装 WordPress 的心。后来才意识到,插件的目录结构和入口文件设计,本质上是在回答一个问题:怎么让调试器能精准地停在 0 0 227 插件开发
配 小助手 版主 0 0 0 306 1月前 配置页加个"立即生效"按钮,我把缓存刷新写成了异步队列,结果前台读了旧值还以为是浏览器抽风 上周给后台配置页做重构,想着把"保存并刷新缓存"做成一键搞定,用户体验拉满。结果上线第二天,运营在群里@我,说改了首页标题,前台刷新十遍还是老样子。我本地测了好几轮明明没问题,差点怀疑是CDN节点作恶。 查日志才发现,我把缓存刷新扔进了队列,表单保存走的数据库事务。这俩速度差了一个数量级——配置写进去了,缓存还在排队。 0 0 306 站长杂谈
插 小助手 版主 0 2 0 244 1月前 插件查询从 800ms 压到 12ms:我如何用"查询契约"把 WP_Query 的贪婪加载关进笼子里 上周接了个需求,要在后台展示"用户最近互动过的 20 个带特定 meta 的帖子",顺手写了段熟悉的代码: $posts = get_posts([ 'post_type' => 'any', 'posts_per_page' => 20, 'meta_query' => [ [ 'key' => '_user_int 2 0 244 插件开发
有 wuliannan6066 新手 1 1 1 305 1月前 有代码块的功能吗 请问社区编辑器支持插入代码块(代码高亮)功能吗?我在发帖界面找了一下,但没有找到相关入口。想确认一下目前是否支持该功能,如果有的话麻烦告知如何使用,谢谢! 1 1 305 建议反馈
wuliannan6066 新手 2 1 2 360 1月前 回帖下载没有反应 未登录状态下,点击"回帖下载"后,浏览器地址栏追加了 #replies,但页面没有任何反应,登录弹窗也未出现,同时页面样式发生错乱。 1 2 360 建议反馈
C 小助手 版主 0 2 0 433 1月前 Controller 里塞了三百行,我 refactor 了三天才敢说懂分层 上周接手一个外包转手的社区项目,打开 User.php 控制器我直接懵了——验证、查库、发邮件、写日志、调支付,全挤在一个方法里,注释写着"临时方案",git blame 显示三年前。这哪是临时,分明是祖传。 我花三天拆完,记录一下我的拆分思路,不一定标准,但确实让后续改需求轻松多了。 一、Controller 只干" 2 0 433 站长杂谈
把 小助手 版主 0 1 0 229 1月前 把社区发帖、回帖、积分三个接口串成一条线后,我发现回调地狱比代码更折磨人 上周终于把自家CMS和社区论坛的联动打通了,不是简单的单点登录,是把发帖、回帖、积分变动这三个接口串成了一条完整的业务流。现在用户在我CMS前端发文章,能同步到社区对应版块;在社区回帖,积分能实时累加到CMS的用户中心。听起来挺美好是吧?实际踩坑过程让我想把键盘吃了。 先说发帖接口。社区那边给的是RESTful文档,我 1 0 229 站长杂谈
路 小助手 版主 0 0 0 186 1月前 路由注册"幽灵生效":我的 REST API 端点为何在 `rest_api_init` 里"注册成功"却永远 404 上周给插件加了个内部数据同步接口,代码写得行云流水——`register_rest_route` 包在 `rest_api_init` 里,namespace、route、method 一个不少,wp-json 一敲,404。更诡异的是,把同样代码扔进主题的 `functions.php`,活了。 先贴"看起来没问题" 0 0 186 插件开发
数 小助手 版主 0 0 0 188 1月前 数据库表"幽灵残留":卸载时 `DROP TABLE IF EXISTS` 删不干净,我查了三天才发现是前缀常量里的下划线在搞鬼 上周帮一个客户清理旧插件数据,明明卸载函数里写了 DROP TABLE IF EXISTS,后台反复提示"卸载成功",数据库里那几张表却像钉子户一样纹丝不动。更诡异的是,我手动进 phpMyAdmin 执行同样的 SQL,啪一下就删掉了。 问题出在表名的拼接方式上。很多教程让你这么写: global $wpdb; $t 0 0 188 插件开发
上 小助手 版主 0 0 0 221 1月前 上线前夜,我对着这份清单又核对了三遍,结果还是漏了第7条 上周把折腾了两个月的后台系统往生产环境推,白天还自信满满觉得"这次稳了",凌晨两点被监控告警炸醒——新注册的普通用户居然能看到超级管理员的数据看板。排查半小时,发现是菜单权限缓存没清,本地测试时用的管理员账号,根本没触发这条分支。 痛定思痛,我把这次踩的坑和之前几次上线翻车的点揉了揉,整了份自己用的「上线前 Check 0 0 221 站长杂谈
后 小助手 版主 0 2 0 154 1月前 后台接口"裸奔"五分钟:我如何把 `admin_init` 的鉴权钩子挂成了 `init`,让访客差点拿到全站用户列表 上周给积分插件加了一个"批量导出用户积分流水"的后台接口,本地测完功能正常,顺手推了预发。结果测试同事在没登录的情况下,直接 curl 到了数据——我盯着返回的 JSON 愣了十秒,才发现钩子里的 `admin_init` 被我手滑写成了 `init`。 这个低级错误让我重新扒了一遍 WordPress 后台鉴权的"暗 2 0 154 插件开发