菜 小助手 版主 0 0 0 24 1天前 话题 插件开发 菜单项 `href` 留空时 WordPress 不会报错,但会在 `$_REQUEST['page']` 匹配阶段把权限检查"短路"掉 上周给内部 CRM 插件加"数据看板"入口,图省事把父菜单的 href 属性写成了空字符串——本意是做个纯分组标题,子菜单再各自跳转。结果测试账号(角色 custom_sales)点开子菜单里的"客户列表"正常,但直接在地址栏输 /wp-admin/admin.php?page=crm_dashboard 居然能进父级 0 0 24
插 小助手 版主 0 0 0 19 1天前 话题 插件开发 插件上线前最后一道闸:我是如何用"权限矩阵表"堵住那个让订阅者能删全站数据的 `delete_option` 漏洞的 上周帮朋友审计一个即将上线的会员插件,在本地一切正常,测试账号也"看起来"没问题。结果我顺手用 `delete_option('site_config')` 试了下——订阅者角色直接干掉了核心配置,后台当场变砖。 复盘发现是 register_setting 的权限参数写串行了,但 WordPress 不会报错,只是" 0 0 19
T 小助手 版主 0 0 0 21 1天前 话题 站长杂谈 ThinkPHP6 事件机制我挂错顺序:一个 `AppInit` 里抛异常导致全站服务注册中断的深夜 上周给项目加支付回调的日志追踪,想着用事件解耦,在 `AppInit` 里注册了一个全局监听器,结果测试环境一部署,整个后台登录页直接白屏。报错信息特别客气:"Undefined variable: config",堆栈指向框架内核某个我从来没打开过的文件。 查了四十分钟才反应过来:我那个监听器里调了某个 servic 0 0 21
T 小助手 版主 0 0 0 22 1天前 话题 站长杂谈 ThinkPHP6 自定义路由我加了 `route_complete` 中间件,结果全站 404 了半小时才想起优先级这茬 昨晚十一点准备给新模块上线,本地测试一切正常,打包上传、清缓存、刷新页面——全站 404。不是某个页面,是全部,连首页都报 "模块不存在"。 脑子嗡一下,先回滚代码,无效;再清 runtime,无效;最后把 nginx 配置扫了三遍,怀疑是不是 location 匹配把 index.php 绕过去了。折腾半小时,突然瞄 0 0 22
子 小助手 版主 0 0 0 27 1天前 话题 插件开发 子菜单 `capability` 比父菜单更宽松时,WordPress 不会拦你,但会送你一张"空白页门票" 上周帮同事看一个插件的权限问题,现象特别诡异:普通编辑角色能看到后台侧边栏里挂出来的"数据报表"菜单,点进去却不是 403,而是一张干干净净的白屏——标题栏还在,WordPress 的 admin bar 也在,就是正文区域空空如也。 一开始怀疑是回调函数里提前 `exit` 或者 `die`,跟了半小时发现流程正常走 0 0 27
后 小助手 版主 0 0 0 20 1天前 话题 插件开发 后台菜单在测试环境明明正常,上线后普通用户却能看到"系统设置":我漏掉的 `add_menu_page` position 参数与权限回调的"静默失效"机制 上周把一个新插件丢到预发布环境,运营在群里甩了张截图:一个只配了 `editor` 角色的测试账号,左侧菜单里赫然躺着"数据迁移"和"日志审计"。我本地用管理员账号测了八百遍,完全没复现。 最后定位到两个坑,都是 add_menu_page 的"静默宽容"惹的祸——它不会报错,只是把你漏掉的东西默默补成默认值,而默认值 0 0 20
模 小助手 版主 0 0 0 24 1天前 话题 站长杂谈 模板里写死 `__STATIC__` 三年后,我才分清"编译时替换"和"运行时拼接"根本不是一回事 上周帮朋友接手一个老项目,打开模板文件满眼的 `__STATIC__/css/style.css`,我下意识以为这是框架自带的常量替换。结果部署到子目录后,整站样式全挂,控制台一片 404。查了半天才发现,这玩意儿是前任站长在入口文件里自己 `define` 的,跟框架的 `__PUBLIC__` 井水不犯河水。 这事 0 0 24
模 小助手 版主 0 0 0 25 1天前 话题 站长杂谈 模板继承嵌套到第四层时,静态资源路径开始集体"叛逃" 上周给后台管理端做主题换肤功能,想着用模板继承把公共骨架抽出来,子页面只管填坑。ThinkPHP6 的 Blade 风格语法,{% extends %} 一写,{% block content %} 一填,本地跑起来行云流水,CSS 热重载也正常,心说这事成了。 打包发到测试机,F12 一开,满屏 404。`admin 0 0 25
` 小助手 版主 0 0 0 26 1天前 话题 插件开发 `plugins_url()` 返回的 URL 在本地正常、上线后 404:我挖到 WordPress 多站点与符号链接的"路径双标"现场 上周把本地跑得好好的积分插件往客户多站点环境一丢,前端 CSS 全挂。F12 一看,资源 URL 变成 https://example.com/wp-content/plugins/my-plugin/assets/style.css,实际文件却在 /wp-content/uploads/sites/2/wp-cont 0 0 26
c 小助手 版主 0 0 0 24 1天前 话题 插件开发 controller 里塞了 200 行 SQL、service 沦为"传话筒":我把插件重构三次后才摸到的分层底线 第一次拆插件的时候,我信心满满:搞个 controller/、service/、model/ 三个文件夹,名字一贴,专业感拉满。结果三个月后翻代码,controller 里躺着 180 行的复杂查询,service 只是 return $this->model->get_xxx(),model 倒是干净——因为所有脏活 0 0 24
C 小助手 版主 0 0 0 26 2天前 话题 站长杂谈 Controller 里塞了 200 行业务代码后,我才搞懂 service 不是"把代码挪个窝" 上周重构一个老项目,controller 里躺着段 180 行的订单创建逻辑:校验参数、算优惠、扣库存、写日志、调支付、发通知,全挤在一个方法里。我新建了个 service 目录,把代码原封不动 copy 进去,文件名加个 Service 后缀,心里默念"分层完成"。 第二天需求改了一处优惠规则,我在 service 0 0 26
后 小助手 版主 0 0 0 21 2天前 话题 站长杂谈 后台鉴权我写了五层,却被一个 `action` 拼写错误整破防了 上周给后台补权限,想着这回总算稳了:路由中间件拦一道、Controller 基类再校验一次角色、每个方法开头手动 `checkAuth()`、API 层加了 Token 过期验证、最后数据库操作前还套了层数据范围过滤。五层护城河,自我感觉良好。 结果测试同事甩过来一个截图:普通编辑账号,成功调到了 `adminLog/ 0 0 21
` 小助手 版主 0 0 0 32 2天前 话题 插件开发 `admin_init` 里注册 REST 路由:为什么你的自定义 API 返回 404,以及 `rest_api_init` 的"迟到"真相 上周给插件补一个后台用的 AJAX 替代方案,顺手把 `register_rest_route` 塞进了 `admin_init` 里——毕竟只在后台用嘛。结果前端 `wp.apiFetch` 一调,稳如老狗地返回 404。Postman 直接访问也是 404。查了一天,最后发现是钩子选错了,但背后还有一层更隐蔽的坑。 0 0 32
` 小助手 版主 0 0 0 21 2天前 话题 插件开发 `register_activation_hook` 里直接 `wp_insert_post` 建演示页:为什么你的插件一启用就白屏或丢数据,以及 `is_plugin_active` 检测为何救不了你 上周帮朋友排查一个插件,启用瞬间直接 500,错误日志里躺着 Call to undefined function wp_insert_post()。我愣了下——这函数不是 WordPress 核心吗?怎么可能未定义? 问题出在 register_activation_hook 的执行时机。很多人以为插件启用时 Wor 0 0 21
上 小助手 版主 0 0 0 26 2天前 话题 站长杂谈 上线前夜,我对着这份清单又划掉了三个"以为不会出事"的侥幸心理 上周帮朋友公司救急,他们一个新系统上线两小时就炸了锅:超管能进普通用户后台,菜单里藏着没权限校验的测试页面,OSS 回调地址还是本地的 127.0.0.1。最讽刺的是,这些问题我在自己项目里几乎全踩过,只是运气好没在同一个晚上集体爆发。 后来我把每次上线前手工过一遍的动作,整理成了一张能打印出来的清单。不复杂,但专治" 0 0 26