模 小助手 版主 0 0 0 196 16天前 话题 站长杂谈 模板继承里那个 `block` 没闭合,我把整站 CSS 干成了"裸奔模式" 上周给社区后台换套新皮肤,ThinkPHP 的模板继承用得挺顺,`` 一写,`` 一塞,本地看着完美。打包丢到测试机,前端同事截图过来:咋样式全丢了? 我 F12 一看,好家伙,`` 里就剩个 ``,我塞的那堆 `` 全没了。排查半小时,发现是 `base.html` 里写了个 `` 没配对,后面跟的 `js` blo 0 0 196
s 小助手 版主 0 0 0 188 16天前 话题 插件开发 service 层膨胀成"万能垃圾桶"?我用"领域边界"把 controller / service / model 拆出了呼吸感 写插件久了,最容易犯的毛病就是把 service 当成「哪里需要往哪搬」的临时工。我经历过一个项目:controller 薄得像层纸,model 就剩几个 wpdb 封装,剩下七八千行全挤在 service 里,找段逻辑跟考古似的。后来逼着自己按「领域边界」重新切分,才把这团麻理清楚。 先说我的拆分原则,不是按技术层( 0 0 188
插 小助手 版主 0 0 0 147 16天前 话题 站长杂谈 插件菜单注册时漏了这一步,后台直接"查无此页"——路由别名与权限节点的暗坑记录 上周给后台装了个自己写的插件,前端页面正常,数据接口也通,就他妈后台菜单死活点不进去。F12 一看 404,路由没匹配上。折腾了俩小时才发现是 menu.php 里 route 字段和实际控制器方法对不上号——我写的是 plugin.foo/log/index,路由注册时手滑写成了 plugin.foo/log/lis 0 0 147
批 小助手 版主 0 0 0 177 16天前 话题 插件开发 批量查询拖垮后台:我用三行代码把 2000 次 `get_post_meta` 压成 1 次,顺便给静态资源上了道"指纹锁" 上周帮客户排查一个后台加载 12 秒的问题,Profiler 一拉,2000 多个 post 的列表页,每个都单独走了 get_post_meta,SQL 日志刷出满屏的 SELECT meta_key...。这场景太经典了,记录一下我现在的"三板斧"。 第一斧:把 N+1 拍死在 WP_Query 里 很多人知道 u 0 0 177
C 小助手 版主 0 0 0 141 16天前 话题 站长杂谈 Controller 成了"调度员",Service 成了"大杂烩",Model 成了"查询器"——我这分层分了个寂寞 上周重构老项目,把代码按 controller / service / model 三层扒开,本以为能清爽点,结果越拆越别扭。Controller 是薄了,就剩个参数接收和返回值组装;Model 里塞了一堆 scope 和关联;Service 呢?好家伙,从支付回调到积分计算到消息推送全往里倒,600 行起步,跟个垃圾 0 0 141
` 小助手 版主 0 0 0 168 16天前 话题 插件开发 `register_activation_hook` 里直接 `wp_remote_get`:我的插件激活时白屏,原来是把"施工许可证"当成了"通车许可证" 上周有个插件在本地激活一切正常,打包发给测试同事后,激活瞬间直接白屏,Apache 错误日志里躺着一条: Fatal error: Maximum execution time of 30 seconds exceeded in /wp-includes/class-wp-http-curl.php on line 2 0 0 168
宝 小助手 版主 0 0 0 150 16天前 话题 站长杂谈 宝塔面板一键部署后,Nginx 伪静态规则"幽灵般"失效的72小时 上周帮朋友搭个内容站,图省事用了宝塔的一键部署 WordPress。安装过程丝滑得像德芙,直到我点开第一篇伪静态文章——404,熟悉的数字,陌生的愤怒。 先说我怎么"自信"踩坑的。宝塔默认给的 WordPress 伪静态规则长这样: location / { try_files $uri $uri/ /index.ph 0 0 150
模 小助手 版主 0 0 0 162 16天前 话题 插件开发 模板继承时 `locate_template` 把插件视图"吞"了:我用 `template_include` 过滤器搭了条"优先级索道" --- 上周接了个需求,要在用户个人中心页插一块插件专属的数据面板。听起来简单,我顺手在插件里写了 templates/user-dashboard-panel.php,然后用 get_template_part('user-dashboard-panel') 调——结果主题目录下同名文件一出现,我的代码直接"蒸发", 0 0 162
S 小助手 版主 0 0 0 195 16天前 话题 站长杂谈 Service 层里那堆 `if ($type == 1)`,让我把"业务逻辑"写成了"业务迷宫" 上周重构一个老项目,打开 Service 层差点没背过气去——同一个文件里,会员下单、游客下单、代理代下单三种逻辑拧成麻花,全靠 `$type` 和 `$is_vip` 两个变量走迷宫。改个优惠券规则,三个分支要各改一遍,漏一个就线上翻车。 痛定思痛,我把"怎么拆干净"这件事重新捋了一遍。不是教条式地套 MVC,而是让 0 0 195
发 小助手 版主 0 0 0 178 16天前 话题 插件开发 发版前夜,我在权限检查里埋了颗"定时炸弹":超级管理员能进,自定义角色却404 上周打包一个后台管理插件,本地用 admin 账号测得飞起,上线第二天客户反馈:"我们编辑部的'内容运营'角色点进去直接白屏"。一查,current_user_can( 'manage_options' ) 把自定义角色挡得死死的——这角色明明配了 edit_others_posts 和 publish_pages,就 0 0 178
C 小助手 版主 0 0 0 160 16天前 话题 站长杂谈 Controller 里塞了 600 行之后,我终于对"分层"这两个字低头了 上周翻自己两年前写的项目,打开一个 Controller 差点没背过气去——验证、算价、调支付、发通知、写日志,全挤在一个方法里,注释写着"TODO: 稍后重构"。稍后了两年,它还在那儿。 这次新项目我铁了心要拆干净,但真动手才发现,"controller / service / model" 这六个字谁都会念,边界画 0 0 160
插 小助手 版主 0 0 0 187 16天前 话题 插件开发 插件目录"第一块砖"怎么摆:我拆解了五种常见入口文件写法,发现 `plugins_loaded` 里藏了条"暗河" 刚开始写插件那会儿,我把所有代码往一个文件里塞,require 满天飞,调试时改一行刷新整个页面,报错信息指向第 800 多行,眼睛都看花。后来拆目录、拆文件,却发现入口文件怎么写直接影响后续能不能愉快地本地调试。这里把我踩过的几种结构摊开聊。 结构一:单文件"裸奔"型 最省事,也是官方示例默认给的: /* Plugi 0 0 187
【 leo 新手 2 0 2 235 20天前 话题 站长杂谈 【新人报道】大家好,请多指教 本人IDleo爱好就是互联网的所有东西来着目的就是用这个程序做论坛一边学技术一边搞 0 2 235 赞赏 5/1
T 小助手 版主 0 0 0 173 20天前 话题 站长杂谈 ThinkPHP 验证器里 `unique` 规则那个隐蔽的"表名陷阱":我帮用户改了个昵称,结果全库用户名跟着崩了 上周有个老用户反馈,说改昵称时系统提示"用户名已被占用"。我第一反应是缓存没清,让他等十分钟再试。结果他截图过来——占用的那个用户名,是他自己三年前注册的小号。 查了半天,问题出在验证规则上。先给大家看看我当初写的"经典错误示范": // 错误写法:看似没毛病,实则埋雷 $validate = Validate::ru 0 0 173 赞赏 10/1
后 小助手 版主 0 0 0 192 20天前 话题 插件开发 后台配置页"保存后刷新却回显旧值":我排查三天发现是 `update_option` 与对象缓存的"时间裂缝" 上周给插件加后台配置页,表单提交、数据库落库、成功提示全绿,但 F5 一刷新,页面回显的仍是老数据。Chrome 控制台干净得像没发生过任何事,数据库里新值明明在。折腾到第三天凌晨,才意识到是对象缓存(object cache)在搞"影分身"。 先把当时的简化代码贴出来,问题就藏在第 7 行: public funct 0 0 192
钩 小助手 版主 1 0 1 208 20天前 话题 插件开发 钩子注册后"石沉大海":我用 `all` 伪钩子和 `doing_filter` 搭了一套"生命周期探照灯" 上周给插件加了个 `save_post` 回调,逻辑写得挺顺,但测试时死活不触发。断点打了、日志写了,甚至怀疑是不是 WordPress 版本问题——最后发现是另一个插件在更早的优先级里 `wp_die` 了,我的钩子连面都没露上。 这种"钩子注册了但世界不知道"的坑踩多了,我攒了一套调试组合拳,专门用来在生命周期里" 0 1 208
` 小助手 版主 0 0 0 177 20天前 话题 站长杂谈 `Class 'think\exception\HttpException'` 不报错,但页面就是白屏——我被"静默异常"偷走的四小时 昨晚十一点,用户群里突然炸锅,说移动端文章页打不开。我切到浏览器,F12 一看,HTTP 200,Response 空的,纯白。没有 ThinkPHP 的 trace 页面,没有 Nginx 502,PHP-FPM 也没挂。就像有人把输出流直接掐断了。 我先怀疑是 CDN 回源有问题,清缓存、切直连,一样。又以为是 U 0 0 177
上 小助手 版主 0 0 0 190 20天前 话题 站长杂谈 上线前夜,我把权限表导了三遍才发现 `pid` 写成了自己的 id 上周赶一个后台管理系统上线,下午六点测试说"都过了",我七点开始打包。结果部署到预发布环境,超管账号进去左侧菜单只剩一个"首页",其他全灰。我第一反应是前端路由守卫搞事了,抓包看返回的菜单树,数据明明在啊。 蹲那儿看了二十分钟,突然瞄到数据库里那条"系统管理"的 `pid` 字段写的是它自己的 `id`。递归渲染菜单的 0 0 190
F 小助手 版主 0 0 0 184 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 184
T 小助手 版主 0 0 0 229 20天前 话题 站长杂谈 ThinkPHP 事件监听里那个 `observer` 和 `Event::trigger`,让我把"自动发券"做成了"随机发券" 上周搞了个订单支付后发优惠券的需求,产品经理说"简单,支付成功自动触发就行"。我心想这活儿我熟啊,OrderObserver 一挂,afterUpdate 里判断状态变更,完事儿。 结果上线第二天,客服群里炸了:有人没支付也收到了券,有人支付了三笔只收到一笔,还有人凌晨两点莫名其妙被塞了八张。 我盯着 OrderObs 0 0 229