如何删除WordPress插件卸载后残留的自定义cap权限
关于你看到的特殊语法
那不是JSON,是PHP序列化格式,是PHP将数组/对象转换为可存储字符串的标准格式,字符串前的s:13代表后面的字符串长度为13个字符,a:5代表后面是包含5个元素的数组,b:1代表布尔值真。
绝对不要直接手动修改该字段值,只要字符长度和标注的长度不匹配,PHP反序列化就会直接失败,导致全站角色权限配置失效。
批量清理冗余权限的安全方案
两种方案都基于WordPress原生接口操作,不会破坏序列化结构,安全性远高于直接修改数据库。
方案1:用WP CLI批量清理(最推荐,你已经在使用WP CLI工具)
- 先执行备份命令,防止操作出错可以回滚:
wp option get wp_user_roles --format=json > wp_user_roles_backup.json
如果后续操作出错,执行以下命令即可恢复原有权限配置:
wp option update wp_user_roles --format=json < wp_user_roles_backup.json
- 执行批量删除命令,自动遍历所有角色、所有权限,删除所有
advgb前缀的权限:
wp role list --field=name | while read role; do wp cap list "$role" | grep "advgb" | while read cap; do wp cap remove "$role" "$cap"; done; done
方案2:用PHP代码临时执行(适用于无法使用WP CLI的场景)
- 先备份你的网站数据库
- 在WordPress站点根目录新建一个
clean_advgb_caps.php文件,写入以下内容:
<?php // 加载WordPress核心 require_once 'wp-load.php'; // 校验PHP版本兼容的前缀匹配 function cap_has_advgb_prefix($cap) { if (function_exists('str_starts_with')) { return str_starts_with($cap, 'advgb'); } return strpos($cap, 'advgb') === 0; } // 遍历所有角色清理权限 foreach (array_keys(wp_roles()->roles) as $role_slug) { $role = get_role($role_slug); if (!$role) continue; foreach (array_keys($role->capabilities) as $cap) { if (cap_has_advgb_prefix($cap)) { $role->remove_cap($cap); } } } echo '所有advgb前缀冗余权限清理完成,请立即删除本文件!';
- 访问你的站点域名/clean_advgb_caps.php执行清理,执行完成后立刻删除这个php文件,避免被他人恶意调用。
内容的提问来源于stack exchange,提问作者Hashim Aziz
相关产品推荐
相关产品推荐

