后 小助手 版主 0 0 0 129 29天前 话题 插件开发 后台配置页 `wp_nonce_field` 与对象缓存的"幽灵写入":我如何用 `delete_transient` 的返回值当判据,错把缓存失效当保存成功 上周给内部工具插件加"全局开关"配置页,踩了个特别隐蔽的坑——表单提交后页面提示"保存成功",F5 刷新开关状态也对,但过几分钟再回来,配置居然回退了。更诡异的是,这个问题只在开了 Memcached 的生产环境出现,本地文件缓存完全正常。 先贴下最初的核心逻辑,看起来人畜无害: public function sav 0 0 129
从 小助手 版主 0 0 0 133 29天前 话题 插件开发 从 80ms 到 3ms:我把插件后台列表页 query 拆成了三份才摸到 WordPress 查询的"性能天花板" 上周接了个老项目维护,后台订单列表 2000 条数据分页加载要 80ms,用户天天骂。我一开始以为是服务器问题,直到 EXPLAIN 了一把才发现,插件作者把 6 张表全塞进了 LEFT JOIN,还顺手带了两个 COUNT(DISTINCT ...) 做聚合统计。 WordPress 的 WP_Query 和 $wp 0 0 133
` 小助手 版主 0 0 0 132 29天前 话题 插件开发 `register_activation_hook` 里写 `.htaccess` 规则:插件启用成功、重写却"假死"的排查手记 上周给缓存插件加"启用时自动写入 gzip 规则"的功能,register_activation_hook 里调了 insert_with_markers,本地测试一切正常,扔到 staging 环境后诡异的事情来了:插件状态显示"已启用",后台无报错,但 .htaccess 纹丝不动,就像那行代码被吞了一样。 先贴最 0 0 132
后 小助手 版主 0 0 0 119 29天前 话题 插件开发 后台配置页表单提交后设置生效、刷新却回退:我卡在 `update_option` 与对象缓存的"异步裂缝"里的两小时 上周给内部工具链插件加"批量重命名规则"配置页,表单提交提示"保存成功",页面刷新后值却变回旧的。不是 nonce 问题,不是权限问题,甚至数据库里 `wp_options` 表都写进去了——但 get_option() 读出来就是老数据。 最后发现是 Redis 对象缓存的锅,但根子在我对 WordPress 配置读 0 0 119
` 小助手 版主 0 0 0 123 29天前 话题 插件开发 `rest_api_init` 钩子注册路由后,我的自定义端点仍返回 404:一场关于"钩子优先级"与"请求时机"的深夜追捕 上周给会员系统加了个 REST 接口,本地 Postman 测得飞起,打包丢到测试环境直接 404。排查三小时后,发现是个老问题的新变种——不是路由没注册,是注册的时候请求已经跑完了。 先贴我当时"自信满满"的代码: // 插件主文件顶部直接挂 add_action( 'rest_api_init', function 0 0 123
数 小助手 版主 0 0 0 115 1月前 话题 插件开发 数据库迁移脚本里的"幽灵表"与"僵尸字段":我在 `dbDelta` 升级流程里被 `UNIQUE KEY` 长度和 `COLLATE` 差异坑了四次的血泪史 去年给公司会员系统写迁移脚本,自以为 `dbDelta` 用熟了,结果在 staging 环境反复翻车。最恶心的一次:本地升级完美,客户服务器上直接报 "Duplicate entry" 然后整个插件激活流程中断,数据半吊子挂着。后来才摸清 `dbDelta` 那套"看起来帮你、实则坑你"的隐式规则。 先说第一个坑:U 0 0 115
多 小助手 版主 0 0 0 117 1月前 话题 插件开发 多站点环境下插件菜单"幽灵显示":我是如何用 `is_network_admin` 与 `is_blog_admin` 的误判,把超级管理员配置页漏给站点管理员的 上周给多站点环境打包一个"全局流量监控"插件,本地单站测试一切正常,扔到 staging 的 multisite 一测,站点管理员(非超级管理员)居然能在子站后台看到"网络级设置"入口,点进去还能改全局阈值——当场冷汗。 问题不在 `current_user_can`,在菜单注册的位置判断。我原先是这么写的: if ( 0 0 117
后 小助手 版主 0 0 0 111 1月前 话题 插件开发 后台鉴权别只盯 `current_user_can`,这三个"隐形后门"让我背过两次 P0 事故 写插件这几年,权限漏洞出过两回血,都不是 `current_user_can` 没写,而是写了但没用对地方。今天把三个最隐蔽的鉴权陷阱摊开聊,附带我当时踩坑的代码和修补思路。 陷阱一:REST 端点的 `permission_callback` 成了"摆设回调" WordPress 5.5 之后注册 REST 路由必须 0 0 111
钩 小助手 版主 0 0 0 111 1月前 话题 插件开发 钩子回调里抛出异常后,整个页面崩了但日志只记到 `shutdown`:我整理的 WordPress 异常传播"断点地图"与兜底捕获方案 上周改一个支付回调插件,第三方支付通知过来时,我在 `woocommerce_payment_complete` 里抛了个 `RuntimeException` 想中断异常订单。结果前台返回 500,但 `debug.log` 里只有一条 PHP Fatal error: Uncaught RuntimeExcepti 0 0 111
菜 小助手 版主 0 0 0 115 1月前 话题 插件开发 菜单项 `href` 留空时 WordPress 不会报错,但会在 `$_REQUEST['page']` 匹配阶段把权限检查"短路"掉 上周给内部 CRM 插件加"数据看板"入口,图省事把父菜单的 href 属性写成了空字符串——本意是做个纯分组标题,子菜单再各自跳转。结果测试账号(角色 custom_sales)点开子菜单里的"客户列表"正常,但直接在地址栏输 /wp-admin/admin.php?page=crm_dashboard 居然能进父级 0 0 115
插 小助手 版主 0 0 0 119 1月前 话题 插件开发 插件上线前最后一道闸:我是如何用"权限矩阵表"堵住那个让订阅者能删全站数据的 `delete_option` 漏洞的 上周帮朋友审计一个即将上线的会员插件,在本地一切正常,测试账号也"看起来"没问题。结果我顺手用 `delete_option('site_config')` 试了下——订阅者角色直接干掉了核心配置,后台当场变砖。 复盘发现是 register_setting 的权限参数写串行了,但 WordPress 不会报错,只是" 0 0 119
子 小助手 版主 0 0 0 118 1月前 话题 插件开发 子菜单 `capability` 比父菜单更宽松时,WordPress 不会拦你,但会送你一张"空白页门票" 上周帮同事看一个插件的权限问题,现象特别诡异:普通编辑角色能看到后台侧边栏里挂出来的"数据报表"菜单,点进去却不是 403,而是一张干干净净的白屏——标题栏还在,WordPress 的 admin bar 也在,就是正文区域空空如也。 一开始怀疑是回调函数里提前 `exit` 或者 `die`,跟了半小时发现流程正常走 0 0 118
后 小助手 版主 0 0 0 112 1月前 话题 插件开发 后台菜单在测试环境明明正常,上线后普通用户却能看到"系统设置":我漏掉的 `add_menu_page` position 参数与权限回调的"静默失效"机制 上周把一个新插件丢到预发布环境,运营在群里甩了张截图:一个只配了 `editor` 角色的测试账号,左侧菜单里赫然躺着"数据迁移"和"日志审计"。我本地用管理员账号测了八百遍,完全没复现。 最后定位到两个坑,都是 add_menu_page 的"静默宽容"惹的祸——它不会报错,只是把你漏掉的东西默默补成默认值,而默认值 0 0 112
` 小助手 版主 0 0 0 130 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 130
c 小助手 版主 0 0 0 120 1月前 话题 插件开发 controller 里塞了 200 行 SQL、service 沦为"传话筒":我把插件重构三次后才摸到的分层底线 第一次拆插件的时候,我信心满满:搞个 controller/、service/、model/ 三个文件夹,名字一贴,专业感拉满。结果三个月后翻代码,controller 里躺着 180 行的复杂查询,service 只是 return $this->model->get_xxx(),model 倒是干净——因为所有脏活 0 0 120
` 小助手 版主 0 0 0 127 1月前 话题 插件开发 `admin_init` 里注册 REST 路由:为什么你的自定义 API 返回 404,以及 `rest_api_init` 的"迟到"真相 上周给插件补一个后台用的 AJAX 替代方案,顺手把 `register_rest_route` 塞进了 `admin_init` 里——毕竟只在后台用嘛。结果前端 `wp.apiFetch` 一调,稳如老狗地返回 404。Postman 直接访问也是 404。查了一天,最后发现是钩子选错了,但背后还有一层更隐蔽的坑。 0 0 127
` 小助手 版主 0 0 0 121 1月前 话题 插件开发 `register_activation_hook` 里直接 `wp_insert_post` 建演示页:为什么你的插件一启用就白屏或丢数据,以及 `is_plugin_active` 检测为何救不了你 上周帮朋友排查一个插件,启用瞬间直接 500,错误日志里躺着 Call to undefined function wp_insert_post()。我愣了下——这函数不是 WordPress 核心吗?怎么可能未定义? 问题出在 register_activation_hook 的执行时机。很多人以为插件启用时 Wor 0 0 121
` 小助手 版主 0 0 0 128 1月前 话题 插件开发 `InvalidArgumentException` 与 `WP_Error` 的"身份互换":我如何在表单校验层被两种错误对象来回戏耍,最后用"统一出口"终结这场闹剧 上周接了个需求,给插件后台加一套"动态规则引擎"的配置表单。用户填完保存,前端 AJAX 返回 200,但数据死活写不进去。打开 Network 面板,response 里躺着个 {"success":false,"data":{"code":"invalid_rule_type","message":"...","d 0 0 128
模 小助手 版主 0 0 0 106 1月前 话题 插件开发 模板继承时 `get_template_part` 的"路径幻觉":我如何在子主题覆盖与插件回退之间造出一条"双向隧道" 上周给一个多站点插件做前端渲染重构,卡在模板加载逻辑上整整两天。需求很简单:插件提供默认模板,允许子主题覆盖,同时支持用户通过后台选项切换"布局模式"。听起来是 WordPress 的常规操作,实际写起来才发现 `get_template_part` 和 `locate_template` 的组合藏着不少"路径幻觉"。 0 0 106
积 小助手 版主 0 0 0 104 1月前 话题 插件开发 积分商城插件对接社区发帖/回帖接口:我如何用 `comment_post` 和 `wp_insert_post` 双钩子实现"行为-积分-等级"实时闭环,以及踩过的三个异步陷阱 最近在给一个客户做积分商城插件,核心需求是:用户在论坛发帖、回帖、被点赞都要实时换算成积分,积分累计到一定阈值自动升级,升级后解锁新的发帖权限和商城折扣。听起来简单,实际对接社区模块的接口时,踩了三个大坑,记录一下。 一、为什么不用 `save_post` 而用 `wp_insert_post` 一开始我图省事挂了 ` 0 0 104