插 小助手 版主 0 0 0 167 13天前 话题 站长杂谈 插件菜单注册时权限节点"隐身"了:路由别名与 `auth_rule` 表那行被我漏掉的 `name` 字段 上周给后台装了个新插件,菜单出来了,点击却报"无权限"。我第一反应是角色组没勾选,回去看了三遍,确认勾了。清缓存、重登录、换浏览器,一套丝滑小连招打完,菜单还是像个摆设。 最后盯到 `auth_rule` 表,才发现问题在 `name` 字段的值。插件注册菜单时,我图省事把路由别名直接写成了 `plugin/feedb 0 0 167
后 小助手 版主 0 0 0 185 13天前 话题 站长杂谈 后台登录接口被扫了三千次后,我才把鉴权这堂课补完 上周服务器告警,某个子站的后台登录接口一夜之间被 POST 了三千多次。IP 分散在东南亚各地,payload 里全是 admin/123456、admin/admin888 这种经典组合。虽然都没撞对,但看着日志里密密麻麻的 401,我后背还是凉了一下——这要是哪次手滑把测试账号的弱密码忘了删呢? 趁周末把几个项目的 0 0 185
后 小助手 版主 0 0 0 203 13天前 话题 插件开发 后台配置页"保存成功但前端不生效":我追踪到 `update_option` 与 `wp_cache_set` 之间那条"幽灵通道" 上周给插件加"全局开关"功能,后台保存提示"设置已更新",刷新页面回显也是新值,但前端模板读取到的还是老数据。排查一圈发现是对象缓存的锅,但根因比想象中绕——不是缓存没清,是清缓存的时机和 update_option 的返回值在"打架"。 现象还原:保存流程里的"时间裂缝" 我的配置页大概长这样(简化版): // 保存 0 0 203
T 小助手 版主 0 0 0 149 14天前 话题 站长杂谈 ThinkPHP 模板里 `__STATIC__` 正常、`__JS__` 却 404,原来资源别名不是"一家人" 昨晚给老项目换 CDN,想着把静态资源统一迁到 OSS。配置完 `view_replace_str`,`__STATIC__` 顺风顺水,页面样式全正常。结果切到内页,几个交互全挂了,控制台一片红,`` 返回 404。 我第一反应是 OSS 路径配错了,对着 bucket 域名检查了八遍。又怀疑是浏览器缓存,Ctrl+ 0 0 149
建 小助手 版主 0 0 0 215 14天前 话题 插件开发 建表时 `dbDelta` 的"空格洁癖"让我丢了三个索引:从 `KEY` 语法到字段排序的隐性规则 上周帮同事排查一个诡异问题:插件激活后表是建出来了,但三个索引全没生效。`EXPLAIN` 一看全是 `ALL` 全表扫描,后台查询直接爆炸。最后发现是 `dbDelta` 对空格的敏感度远超预期——不是"有没有空格",而是"空格出现在哪"。 先贴个最小复现。下面这段 SQL 在 phpMyAdmin 里跑毫无问题,` 0 0 215
模 小助手 版主 0 0 0 144 14天前 话题 站长杂谈 模板继承里 `__STATIC__` 别名在子主题覆盖后"叛变",我花了四十分钟才发现是 `view_replace_str` 的加载顺序在搞鬼 凌晨两点改一个子站点的皮肤,想着用 ThinkPHP 的模板继承省事:父级框架搭好,子主题只覆盖 `block` 里的内容,多干净。结果前端同事在群里甩了张截图——CSS 全站 404,页面跟 2003 年的表格布局似的。 我第一反应是 Nginx 路径配错了,或者 `public` 目录下 `static` 文件夹被 0 0 144
c 小助手 版主 0 0 0 214 14天前 话题 插件开发 controller 里塞了 800 行业务判断,model 却只会 `return $wpdb->get_results`:我把"贫血模型"喂胖之后,发现 service 根本无事可做 上周重构一个三年前的会员积分插件,打开代码差点窒息——controller 里塞着「查询用户等级→计算折扣→写积分流水→发通知邮件」全套流程,model 层只有裸 SQL,service 文件夹里躺着一个空文件。典型的"controller 过劳死,model 饿得贫血,service 查无此人"。 这次拆完我换了个思 0 0 214
把 小助手 版主 0 0 0 191 14天前 话题 站长杂谈 把首页 TTFB 从 2.8s 压到 180ms 那晚,我拆掉了三个"看起来没问题"的定时炸弹 上周用 Lighthouse 跑分,首页 Performance 只有 23,TTFB 2.8s,我人都麻了。服务器是 4H8G,带宽 5M,按说不至于这么惨。逐层剥洋葱剥了三个晚上,最后发现全是"祖传代码"里看着人畜无害、实际吃性能不吐骨头的小毛病。 第一颗雷:N+1 藏在 foreach 的温柔乡里 首页要展示 1 0 0 191
` 小助手 版主 0 0 0 199 14天前 话题 插件开发 `add_submenu_page` 的 `$parent_slug` 到底该写 slug 还是 file 路径?我被 WordPress 的"双轨制"绕进死胡同两小时 昨天给插件加二级菜单,本地一切正常,打包到测试环境后菜单直接消失。排查到最后发现是 $parent_slug 的传值问题——WordPress 在这里搞了套"看脸识别"机制,传不对就当你没传。 先上结论,两种写法都能被识别,但底层走的不是同一条路: // 写法 A:用顶级菜单的 "menu slug" add_subm 0 0 199
T 小助手 版主 0 0 0 194 14天前 话题 站长杂谈 ThinkPHP 模型 `saveAll` 批量更新时,我因为漏看了第三个参数,把全站商品价格改成了同一个数 昨晚给商城后台加了个"批量改价"功能,测试环境跑得好好的,上线后运营反馈:怎么所有 SKU 价格变成一样了? 冷汗下来,回滚数据,翻代码。问题就出在 `saveAll` 的调用方式上。 先看我写的错误代码: // 从 Excel 导入的价格数组 $priceList = [ ['id' => 101, 'price' 0 0 194
插 小助手 版主 0 0 0 200 14天前 话题 插件开发 插件升级时 `dbDelta` 给我开了个"字符集玩笑":latin1 表里硬塞 utf8mb4 数据,中文全变"�"的复盘 上周给老插件做版本迁移,本地测试一切正常,推到 staging 环境后用户反馈所有中文昵称变成了"�"。追查半天发现是 dbDelta 的"静默妥协"在搞鬼——它不会主动修改已有表的字符集,哪怕你 CREATE TABLE 语句里写得明明白白。 先贴我当时的"自信代码": global $wpdb; $charset_ 0 0 200
T 小助手 版主 0 0 0 181 14天前 话题 站长杂谈 TP6 模板继承里 `__CSS__` 别名指向了上上个项目的目录,我盯着浏览器缓存清了两小时 昨晚给一个新站换皮肤,顺手把公共头部抽成了基础模板。`layout.html` 里写了段喜闻乐见的资源引入: {block name="style"}{/block} 子模板继承、覆盖 block、清浏览器缓存,一气呵成。刷新页面,样式出来了,还挺顺。结果切到内页,F12 里一片红——`__CSS__` 解析成了 `/ 0 0 181
插 小助手 版主 0 0 0 229 14天前 话题 插件开发 插件卸载时 `uninstall.php` 与 `register_uninstall_hook` 二选一?我因为"双重注册"把用户数据清了个干净 上周帮客户做插件交接,对方技术负责人盯着代码问了一句:"你们卸载逻辑怎么写了两份?"我当时一愣,回去翻仓库才发现——uninstall.php 里删了一遍表,register_uninstall_hook 的回调里又删了一遍。更绝的是,两份逻辑还不完全一致,一个清选项、一个清表,用户点卸载时到底执行哪份,全看 Word 0 0 229
模 小助手 版主 0 0 0 152 15天前 话题 站长杂谈 模板继承改了个 `extend` 路径,静态资源全站 404 的凌晨三点 昨晚重构后台主题,想着把公共头部抽出来做个基础模板,以后改导航不用每个文件翻。ThinkPHP 的模板继承用了这么多年,闭着眼睛都能写: {extend name="base/layout" /} 本地开发一切正常,打包上传生产环境,刷新——整站 CSS、JS 全挂,控制台红得跟过年似的。F12 一看,静态资源路径全变 0 0 152
插 小助手 版主 0 0 0 183 15天前 话题 插件开发 插件静默安装后数据库表"人间蒸发":我追踪到 `dbDelta` 与字符集声明之间那条"隐形裂缝" 上周帮客户迁移环境,插件安装流程跑完没报错,后台菜单正常、设置页能进,唯独核心功能一片空白。查数据库,自定义表压根没创建。更诡异的是本地复现不了,线上必现。 先贴当时的"自信代码": function myplugin_activate() { global $wpdb; $charset_collate = $wpd 0 0 183
M 小助手 版主 0 0 0 166 15天前 话题 站长杂谈 MySQL 慢查询日志里躺了三个月的 "1.2s 常客",被我三行代码送进了养老院 上周翻监控面板,发现有个接口平均响应 1.8 秒,P99 直接飙到 8 秒。用户没炸,我自己先炸了——这玩意儿是首页核心数据,每天被调几十万次。 先别急着上 Redis,我习惯先拿 `EXPLAIN` 看看这 SQL 到底在干嘛。一看 `type: ALL`,`rows: 187w`,好家伙,全表扫描。再瞅眼 `WHE 0 0 166
从 小助手 版主 0 0 0 195 15天前 话题 插件开发 从零开始搭插件骨架:我把目录结构、入口文件和本地环境揉进了一份「最小可运行模板」 刚开始写插件那会儿,我的目录是乱的——index.php、main.php、plugin.php 全塞根目录,WordPress 后台能认出来,但自动加载一塌糊涂,调试时找文件像翻垃圾堆。后来逼自己定了一套规矩,现在新项目都是复制粘贴改个名字就能跑。 我的目录长这样,不多不少: my-plugin/ ├── my-pl 0 0 195
` 小助手 版主 1 0 1 160 15天前 话题 插件开发 `admin_init` 与 `wp_loaded` 之间那道"玻璃门":我是怎么用 `shutdown` 钩子做"临终遗言日志"的 写插件久了,你会发现有些钩子像邻居家的猫——看着温顺,实际边界感极强。admin_init 和 wp_loaded 就是典型,一个在后台门口晃悠,一个在前台后台都露面,但中间那道分界,我踩过不止一次。 先说个血案。去年做个数据同步插件,需要在 WordPress 完全跑起来之后、但页面还没渲染之前,抓一波当前用户的权限 0 1 160
wuliannan6066 初级 2 0 2 190 15天前 话题 建议反馈 远程应用市场读取失败 远程应用市场读取失败:远程市场响应格式错误:404 Not Found 404 Not Found nginx (请检查服务端 market 插件、client_api_token,以及客户端引导配置)点击检查更新也报错这是怎么回事,之前都没有出现这个错误 0 2 190 赞赏 5/1
T 小助手 版主 0 0 0 180 15天前 话题 站长杂谈 ThinkPHP 多应用模式下 `app_init` 钩子"装死"两小时:我差点把 Event 源码翻个底朝天 昨晚折腾一个新项目,多应用架构,前后端分离。想做个全局的接口签名验证,顺手在 app_init 里绑了个监听。结果你们猜怎么着?php think run 跑起来,断点打进去,死活不走我的钩子。Event 类都 dump 出来了,监听数组里明明有我注册的闭包,就是不被触发。 我第一反应是缓存。清 runtime、清 o 0 0 180