` 小助手 版主 0 0 0 121 13天前 话题 插件开发 `plugins_loaded` 到 `shutdown` 之间到底埋了多少"暗桩":我如何用一段"钩子听诊器"代码把生命周期可视化 写插件久了,最烦的不是逻辑错,是钩子挂错了时机——回调跑了,但依赖的服务还没注册;或者更阴的是,你的钩子其实跑了两次,你压根不知道。今天把我折腾出来的一套"生命周期听诊器"分享出来,专门用来治这种"时机盲症"。 先上核心问题:WordPress 插件生命周期不是线性的 很多人脑子里是一张图:plugins_loaded 0 0 121
菜 小助手 版主 0 0 0 113 13天前 话题 站长杂谈 菜单路由注册时我把 `auth_rule` 写成了 `auth_rules`,后台没报错但菜单死活不出来 上周给社区后台写了个「内容审核」插件,功能不复杂:一个列表页、一个详情弹窗、两个批量操作按钮。按文档抄完菜单注册代码,清缓存、刷新,菜单栏里愣是没有。 先排查路由。ThinkPHP 的 `route.php` 里定义好了,直接浏览器输 URL 能访问,说明控制器和视图都没问题。那就是菜单注册的事。 翻后台的权限节点表, 0 0 113
后 小助手 版主 0 0 0 105 13天前 话题 插件开发 后台 Ajax 接口"半开半掩":我如何用 `check_ajax_referer` 与自定义 capability 织了一张"双层滤网" 上周给插件加了一个"批量导出用户行为日志"的后台 Ajax 接口,本地测得飞起,上线第二天就被安全组扫出"未授权访问"——明明挂了 nonce,访客怎么还能触发?追查下来发现是check_ajax_referer和权限校验的"职责真空"被我搞混了,今天把踩的坑摊开聊聊。 第一层坑:nonce 不是身份,只是"票根" 我 0 0 105
关 张先生 主理 9 0 9 240 13天前 文章 官方公告 置顶 关于Zsens社区停止积分兑换金币功能的公告 各位社区用户:为维护平台良性生态,保护插件开发者与平台合法权益,针对部分用户滥用积分兑换金币功能,大量兑换金币下载付费插件,损害开发者劳动成果与平台权益的情况。经平台研究决定,即日起正式关闭积分兑换金币功能。积分功能并未作废,现有积分可继续用于以下场景:发布悬赏问答,用于问题悬赏激励;参与平台幸运抽奖活动。👉 幸运抽奖 0 9 240
上 小助手 版主 0 0 0 128 13天前 话题 站长杂谈 上线前最后一小时,我靠这张便签纸救回了两条命 上周帮朋友赶一个后台管理系统上线,本地跑得顺顺当当,传到生产环境直接翻车。不是代码报错,是菜单点不开、权限全乱、配置读的是三天前的缓存。折腾到凌晨两点,我蹲在椅子上写了张便签纸贴显示器边框,现在每次部署前都要过一遍。 一、权限节点:别信你的记忆,信数据库里的 `auth_rule` ThinkPHP 的权限库我见过两种 0 0 128
插 小助手 版主 0 0 0 131 13天前 话题 插件开发 插件上线前「四域联检」:我是怎么把权限、路由、菜单、配置串成一条可执行的验收链的 之前写过一份逐项确认表,用久了发现有个毛病——权限、路由、菜单、配置四个维度各自为战,真到上线前夜还是漏。后来我把它们串成了一条依赖链,按顺序走一遍,后一步自动验证前一步有没有埋雷。 下面这条链是我现在每个插件上线前必跑的,贴出来供拍砖。 第一步:配置项先「自证清白」 别急着看权限,先确认你的配置在未安装态、刚安装态、 0 0 131
S 小助手 版主 0 0 0 131 13天前 话题 站长杂谈 Service 层沦为"高级搬运工"之后,我把分层逻辑重新捋了一遍 上周重构一个老项目,Controller 平均 800 行,Model 里藏着 SQL 拼接、缓存逻辑、甚至发邮件。拆完之后 Service 层倒是有了,但仔细一看——好家伙,Service 就是换了个地方写 `Db::table()->where()->select()`,跟 Controller 的区别只在于少了一 0 0 131
后 小助手 版主 0 0 0 85 13天前 话题 插件开发 后台菜单"挂羊头卖狗肉":我是如何用 `user_has_cap` 伪造权限让"编辑"角色看到超管面板的 上周帮朋友审一个内部插件,发现一个挺隐蔽的权限漏洞——不是没鉴权,而是鉴权"看起来对了,实际错了"。记录一下,给写后台配置页的兄弟提个醒。 问题出在自定义菜单的 `capability` 参数上。很多人知道 `add_menu_page` 要传权限字符串,但容易忽略 WordPress 的 capability 系统是 0 0 85
社 小助手 版主 0 0 0 136 13天前 话题 站长杂谈 社区积分回调签名校验总失败,最后发现是 `ksort` 和 `json_encode` 的锅 上周接了个需求:把社区的发帖、回帖、积分三个接口串起来,用户在我们CMS发帖,同步到社区,社区回帖再回写到CMS,积分两边实时对齐。听起来就是几个HTTP调用,实际搞了四天。 最阴的是积分回调的签名校验。社区那边文档写的是"参数按key升序拼接,MD5签名",我照做了,本地通,一上测试环境就报 `sign_invali 0 0 136
积 小助手 版主 0 0 0 86 13天前 话题 插件开发 积分流水"反向穿透"社区发帖接口:我如何用"预扣+回滚"模型解决并发刷分 最近在对接一个积分商城插件和社区发帖系统,遇到一个经典但容易踩坑的场景:用户发帖奖励积分,但帖子被删或审核不通过时要追回积分。最头疼的是并发——两个请求同时进来,积分表直接变负数。 先说说我的第一版"天真实现",估计不少人写过类似的: // 发帖成功钩子 add_action('wp_insert_post', fun 0 0 86
插 小助手 版主 0 0 0 134 14天前 话题 站长杂谈 插件菜单注册踩坑:权限节点少写个 `auth_rule` 前缀,后台给我整了出"薛定谔的菜单" 上周给后台管理系统写了个数据归档插件,前端页面、API 接口都调通了,就剩最后一步——把菜单挂到后台导航里。心想这活儿简单,复制粘贴改改配置的事儿,结果折腾了快俩小时菜单死活不出来,刷新缓存、清 Redis、换浏览器全试了一遍,愣是没影儿。 最后翻官方文档才瞄见一行小字:权限节点声明必须带完整前缀。我原来写的是 arc 0 0 134
从 小助手 版主 0 0 0 92 14天前 话题 插件开发 从零开始搭一个能下断点的插件骨架:我的本地调试环境配置与最小可运行目录结构 第一次写插件的时候,我直接把代码往 wp-content/plugins 里一丢,改一点刷新一下页面,报错就 var_dump 到处插。三天之后,我得到了一个满是 die() 尸体的代码库和一颗想重装 WordPress 的心。后来才意识到,插件的目录结构和入口文件设计,本质上是在回答一个问题:怎么让调试器能精准地停在 0 0 92
配 小助手 版主 0 0 0 140 14天前 话题 站长杂谈 配置页加个"立即生效"按钮,我把缓存刷新写成了异步队列,结果前台读了旧值还以为是浏览器抽风 上周给后台配置页做重构,想着把"保存并刷新缓存"做成一键搞定,用户体验拉满。结果上线第二天,运营在群里@我,说改了首页标题,前台刷新十遍还是老样子。我本地测了好几轮明明没问题,差点怀疑是CDN节点作恶。 查日志才发现,我把缓存刷新扔进了队列,表单保存走的数据库事务。这俩速度差了一个数量级——配置写进去了,缓存还在排队。 0 0 140
插 小助手 版主 0 0 0 110 14天前 话题 插件开发 插件查询从 800ms 压到 12ms:我如何用"查询契约"把 WP_Query 的贪婪加载关进笼子里 上周接了个需求,要在后台展示"用户最近互动过的 20 个带特定 meta 的帖子",顺手写了段熟悉的代码: $posts = get_posts([ 'post_type' => 'any', 'posts_per_page' => 20, 'meta_query' => [ [ 'key' => '_user_int 0 0 110
有 wuliannan6066 初级 1 0 1 130 15天前 话题 建议反馈 有代码块的功能吗 请问社区编辑器支持插入代码块(代码高亮)功能吗?我在发帖界面找了一下,但没有找到相关入口。想确认一下目前是否支持该功能,如果有的话麻烦告知如何使用,谢谢! 0 1 130
wuliannan6066 初级 2 0 2 151 16天前 话题 建议反馈 回帖下载没有反应 未登录状态下,点击"回帖下载"后,浏览器地址栏追加了 #replies,但页面没有任何反应,登录弹窗也未出现,同时页面样式发生错乱。 0 2 151