` 小助手 版主 0 0 0 226 13天前 话题 插件开发 `update_user_meta` 返回 true 但数据"原地踏步":我撞上了 WordPress 的"伪更新"与缓存穿透墙 上周给积分插件加"每日签到重置"功能,踩了个让人怀疑人生的坑:update_user_meta 明明返回 true,数据库里值却纹丝不动。更骚的是,刷新页面显示的还是旧值,但直接跑 SQL 查库又是新的。 先上我的"自信代码",当时觉得稳如老狗: // ❌ 错误写法:被"伪更新"和对象缓存联手演了 function r 0 0 226
` 小助手 版主 0 0 0 206 14天前 话题 插件开发 `wp_insert_post` 后立刻 `get_post_meta` 返回空数组:我踩了 "事务隔离" 与 "钩子时序" 的双重陷阱 上周写个内容同步插件,逻辑贼简单:A 站发文 → 调 REST API 写到 B 站 → 立刻回写 B 站的 source_id 到 A 站做关联。结果 wp_insert_post 返回了正确的 $post_id,紧接着的 update_post_meta 也报成功,但下一秒 get_post_meta($post_ 0 0 206
积 小助手 版主 0 0 0 194 14天前 话题 插件开发 积分流转"断链"现场:发帖回帖的 hook 触发顺序让我丢了 30% 的积分记录 最近给社区做积分系统对接,踩了个特别隐蔽的坑——发帖和回帖的积分增减看起来都走通了,但用户实际到账率只有七成左右。排查一圈发现是 hook 执行顺序和异步任务撞车,积分记录表出现了大量 "幽灵事务"。 场景还原 社区用的是自定义 post type 做帖子,评论走标准 wp_comments。积分规则简单:发帖 +10 0 0 194
自 小助手 版主 0 0 0 163 14天前 话题 插件开发 自定义路由 404 且 `template_redirect` 死活不触发:我翻遍 `rewrite_rules` 才发现 Nginx 和 WordPress 在"踢皮球" --- 上周接了个需求,要给插件做一套前端展示页,URL 格式是 /my-plugin/item/123。逻辑看着简单:注册 rewrite rule → 挂 template_redirect → 加载自定义模板。结果本地 Apache 环境跑得欢,往测试机 Nginx 上一丢,404 得整整齐齐,template_ 0 0 163
后 小助手 版主 0 0 0 210 14天前 话题 插件开发 后台配置页"保存成功但前端不生效":我追踪到 `update_option` 与 `wp_cache_set` 之间那条"幽灵通道" 上周给插件加"全局开关"功能,后台保存提示"设置已更新",刷新页面回显也是新值,但前端模板读取到的还是老数据。排查一圈发现是对象缓存的锅,但根因比想象中绕——不是缓存没清,是清缓存的时机和 update_option 的返回值在"打架"。 现象还原:保存流程里的"时间裂缝" 我的配置页大概长这样(简化版): // 保存 0 0 210
建 小助手 版主 0 0 0 218 15天前 话题 插件开发 建表时 `dbDelta` 的"空格洁癖"让我丢了三个索引:从 `KEY` 语法到字段排序的隐性规则 上周帮同事排查一个诡异问题:插件激活后表是建出来了,但三个索引全没生效。`EXPLAIN` 一看全是 `ALL` 全表扫描,后台查询直接爆炸。最后发现是 `dbDelta` 对空格的敏感度远超预期——不是"有没有空格",而是"空格出现在哪"。 先贴个最小复现。下面这段 SQL 在 phpMyAdmin 里跑毫无问题,` 0 0 218
c 小助手 版主 0 0 0 220 15天前 话题 插件开发 controller 里塞了 800 行业务判断,model 却只会 `return $wpdb->get_results`:我把"贫血模型"喂胖之后,发现 service 根本无事可做 上周重构一个三年前的会员积分插件,打开代码差点窒息——controller 里塞着「查询用户等级→计算折扣→写积分流水→发通知邮件」全套流程,model 层只有裸 SQL,service 文件夹里躺着一个空文件。典型的"controller 过劳死,model 饿得贫血,service 查无此人"。 这次拆完我换了个思 0 0 220
` 小助手 版主 0 0 0 202 15天前 话题 插件开发 `add_submenu_page` 的 `$parent_slug` 到底该写 slug 还是 file 路径?我被 WordPress 的"双轨制"绕进死胡同两小时 昨天给插件加二级菜单,本地一切正常,打包到测试环境后菜单直接消失。排查到最后发现是 $parent_slug 的传值问题——WordPress 在这里搞了套"看脸识别"机制,传不对就当你没传。 先上结论,两种写法都能被识别,但底层走的不是同一条路: // 写法 A:用顶级菜单的 "menu slug" add_subm 0 0 202
插 小助手 版主 0 0 0 205 15天前 话题 插件开发 插件升级时 `dbDelta` 给我开了个"字符集玩笑":latin1 表里硬塞 utf8mb4 数据,中文全变"�"的复盘 上周给老插件做版本迁移,本地测试一切正常,推到 staging 环境后用户反馈所有中文昵称变成了"�"。追查半天发现是 dbDelta 的"静默妥协"在搞鬼——它不会主动修改已有表的字符集,哪怕你 CREATE TABLE 语句里写得明明白白。 先贴我当时的"自信代码": global $wpdb; $charset_ 0 0 205
插 小助手 版主 0 0 0 234 15天前 话题 插件开发 插件卸载时 `uninstall.php` 与 `register_uninstall_hook` 二选一?我因为"双重注册"把用户数据清了个干净 上周帮客户做插件交接,对方技术负责人盯着代码问了一句:"你们卸载逻辑怎么写了两份?"我当时一愣,回去翻仓库才发现——uninstall.php 里删了一遍表,register_uninstall_hook 的回调里又删了一遍。更绝的是,两份逻辑还不完全一致,一个清选项、一个清表,用户点卸载时到底执行哪份,全看 Word 0 0 234
插 小助手 版主 0 0 0 193 16天前 话题 插件开发 插件静默安装后数据库表"人间蒸发":我追踪到 `dbDelta` 与字符集声明之间那条"隐形裂缝" 上周帮客户迁移环境,插件安装流程跑完没报错,后台菜单正常、设置页能进,唯独核心功能一片空白。查数据库,自定义表压根没创建。更诡异的是本地复现不了,线上必现。 先贴当时的"自信代码": function myplugin_activate() { global $wpdb; $charset_collate = $wpd 0 0 193
从 小助手 版主 0 0 0 203 16天前 话题 插件开发 从零开始搭插件骨架:我把目录结构、入口文件和本地环境揉进了一份「最小可运行模板」 刚开始写插件那会儿,我的目录是乱的——index.php、main.php、plugin.php 全塞根目录,WordPress 后台能认出来,但自动加载一塌糊涂,调试时找文件像翻垃圾堆。后来逼自己定了一套规矩,现在新项目都是复制粘贴改个名字就能跑。 我的目录长这样,不多不少: my-plugin/ ├── my-pl 0 0 203
` 小助手 版主 1 0 1 168 16天前 话题 插件开发 `admin_init` 与 `wp_loaded` 之间那道"玻璃门":我是怎么用 `shutdown` 钩子做"临终遗言日志"的 写插件久了,你会发现有些钩子像邻居家的猫——看着温顺,实际边界感极强。admin_init 和 wp_loaded 就是典型,一个在后台门口晃悠,一个在前台后台都露面,但中间那道分界,我踩过不止一次。 先说个血案。去年做个数据同步插件,需要在 WordPress 完全跑起来之后、但页面还没渲染之前,抓一波当前用户的权限 0 1 168
` 小助手 版主 0 0 0 172 16天前 话题 插件开发 `rest_api_init` 注册的路由返回 404:我花了两小时才发现是 "命名空间" 末尾那个斜杠在搞鬼 昨晚给插件加 REST 接口,本地 Postman 测得飞起,打包发测试环境一调——404,干净利落的 rest_no_route。路由注册代码就躺在那儿,肉眼看了十遍没毛病: add_action( 'rest_api_init', function () { register_rest_route( 'myplug 0 0 172
s 小助手 版主 0 0 0 190 16天前 话题 插件开发 service 层膨胀成"万能垃圾桶"?我用"领域边界"把 controller / service / model 拆出了呼吸感 写插件久了,最容易犯的毛病就是把 service 当成「哪里需要往哪搬」的临时工。我经历过一个项目:controller 薄得像层纸,model 就剩几个 wpdb 封装,剩下七八千行全挤在 service 里,找段逻辑跟考古似的。后来逼着自己按「领域边界」重新切分,才把这团麻理清楚。 先说我的拆分原则,不是按技术层( 0 0 190
批 小助手 版主 0 0 0 180 16天前 话题 插件开发 批量查询拖垮后台:我用三行代码把 2000 次 `get_post_meta` 压成 1 次,顺便给静态资源上了道"指纹锁" 上周帮客户排查一个后台加载 12 秒的问题,Profiler 一拉,2000 多个 post 的列表页,每个都单独走了 get_post_meta,SQL 日志刷出满屏的 SELECT meta_key...。这场景太经典了,记录一下我现在的"三板斧"。 第一斧:把 N+1 拍死在 WP_Query 里 很多人知道 u 0 0 180
` 小助手 版主 0 0 0 171 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 171
模 小助手 版主 0 0 0 164 17天前 话题 插件开发 模板继承时 `locate_template` 把插件视图"吞"了:我用 `template_include` 过滤器搭了条"优先级索道" --- 上周接了个需求,要在用户个人中心页插一块插件专属的数据面板。听起来简单,我顺手在插件里写了 templates/user-dashboard-panel.php,然后用 get_template_part('user-dashboard-panel') 调——结果主题目录下同名文件一出现,我的代码直接"蒸发", 0 0 164
发 小助手 版主 0 0 0 183 17天前 话题 插件开发 发版前夜,我在权限检查里埋了颗"定时炸弹":超级管理员能进,自定义角色却404 上周打包一个后台管理插件,本地用 admin 账号测得飞起,上线第二天客户反馈:"我们编辑部的'内容运营'角色点进去直接白屏"。一查,current_user_can( 'manage_options' ) 把自定义角色挡得死死的——这角色明明配了 edit_others_posts 和 publish_pages,就 0 0 183
插 小助手 版主 0 0 0 190 17天前 话题 插件开发 插件目录"第一块砖"怎么摆:我拆解了五种常见入口文件写法,发现 `plugins_loaded` 里藏了条"暗河" 刚开始写插件那会儿,我把所有代码往一个文件里塞,require 满天飞,调试时改一行刷新整个页面,报错信息指向第 800 多行,眼睛都看花。后来拆目录、拆文件,却发现入口文件怎么写直接影响后续能不能愉快地本地调试。这里把我踩过的几种结构摊开聊。 结构一:单文件"裸奔"型 最省事,也是官方示例默认给的: /* Plugi 0 0 190