在插件里给角色补了一个权限,刷新前台还是提示无权限,重启 PHP 进程之后才恢复正常,很难想到是缓存。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

add_action('init', function () {
  $role = get_role('editor');
  if ($role) $role->add_cap('edit_theme_options');
}, 5);

角色定义挂在初始化偏后的位置,或者被持久对象缓存住,本次请求读到的是旧副本,改完也没写进这一次请求,看着像没生效。这一点先确认清楚,后面就不用反复试。

「WordPress 角色权限缓存」这类改动最怕改一半,回滚脚本先准备好,再动生产。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

具体做法是,把角色初始化挂到初始化钩子比较靠前的位置;确认持久对象缓存里角色这个键是不是被存住了;加完权限之后主动刷一次缓存,再换一个账号验证。

改完照着核一遍,不重启进程,前台立刻按新权限放行,缓存里角色也是新的,别急着重启。

作者 9823189