删除插件留下的自定义 Wordpress 上限

Delete custom Wordpress caps left behind by plugins

我最近从 PublishPress 安装然后卸载了一个名为 Advanced Gutenberg 的插件。

为多个角色执行 wp cap list <role> 显示它留下的自定义上限,所有前缀都带有 advgb 。除了为使用 wp cap remove <role> <cap> 逐一修改的每个角色删除这些功能中的每一项之外,是否有办法删除插件本应自行删除的所有这些垃圾功能?

仔细观察数据库,Advanced Gutenberg 似乎直接将大写字母添加到 wp_options table 的 wp_user_roles 选项中。这个选项的值是在一些我不理解并且不想冒险手动编辑的类似 JSON 的语法中:

a:5:{s:13:"administrator";a:2:{s:4:"name";s:13:"Administrator";s:12:"capabilities";a:69:{s:13:"switch_themes";b:1;s:11:"edit_themes";b:1;s:16:"activate_plugins";b:1;s:12:"edit_plugins";b:1;s:10:"edit_users";b:1;s:10:"edit_files";b:1;s:14:"manage_options";b:1;s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:6:"import";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:8:"level_10";b:1;s:7:"level_9";b:1;s:7:"level_8";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;s:12:"delete_users";b:1;s:12:"create_users";b:1;s:17:"unfiltered_upload";b:1;s:14:"edit_dashboard";b:1;s:14:"update_plugins";b:1;s:14:"delete_plugins";b:1;s:15:"install_plugins";b:1;s:13:"update_themes";b:1;s:14:"install_themes";b:1;s:11:"update_core";b:1;s:10:"list_users";b:1;s:12:"remove_users";b:1;s:13:"promote_users";b:1;s:18:"edit_theme_options";b:1;s:13:"delete_themes";b:1;s:6:"export";b:1;s:19:"edit_advgb_profiles";b:1;s:26:"edit_others_advgb_profiles";b:1;s:21:"create_advgb_profiles";b:1;s:22:"publish_advgb_profiles";b:1;s:21:"delete_advgb_profiles";b:1;s:28:"delete_others_advgb_profiles";b:1;s:18:"read_advgb_profile";b:1;s:27:"read_private_advgb_profiles";b:1;s:17:"edit_others_posts";b:1;}}s:6:"editor";a:2:{s:4:"name";s:6:"Editor";s:12:"capabilities";a:37:{s:17:"moderate_comments";b:1;s:17:"manage_categories";b:1;s:12:"manage_links";b:1;s:12:"upload_files";b:1;s:15:"unfiltered_html";b:1;s:10:"edit_posts";b:1;s:17:"edit_others_posts";b:1;s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:10:"edit_pages";b:1;s:4:"read";b:1;s:7:"level_7";b:1;s:7:"level_6";b:1;s:7:"level_5";b:1;s:7:"level_4";b:1;s:7:"level_3";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:17:"edit_others_pages";b:1;s:20:"edit_published_pages";b:1;s:13:"publish_pages";b:1;s:12:"delete_pages";b:1;s:19:"delete_others_pages";b:1;s:22:"delete_published_pages";b:1;s:12:"delete_posts";b:1;s:19:"delete_others_posts";b:1;s:22:"delete_published_posts";b:1;s:20:"delete_private_posts";b:1;s:18:"edit_private_posts";b:1;s:18:"read_private_posts";b:1;s:20:"delete_private_pages";b:1;s:18:"edit_private_pages";b:1;s:18:"read_private_pages";b:1;s:18:"read_advgb_profile";b:1;s:27:"read_private_advgb_profiles";b:1;s:19:"edit_advgb_profiles";b:1;}}s:6:"author";a:2:{s:4:"name";s:6:"Author";s:12:"capabilities";a:15:{s:20:"edit_published_posts";b:1;s:13:"publish_posts";b:1;s:4:"read";b:1;s:7:"level_2";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:22:"delete_published_posts";b:1;s:12:"upload_files";b:1;s:19:"edit_advgb_profiles";b:1;s:18:"read_advgb_profile";b:1;s:27:"read_private_advgb_profiles";b:1;s:17:"moderate_comments";b:1;s:20:"delete_private_posts";b:1;s:12:"delete_posts";b:1;s:10:"edit_posts";b:1;}}s:11:"contributor";a:2:{s:4:"name";s:11:"Contributor";s:12:"capabilities";a:7:{s:10:"edit_posts";b:1;s:4:"read";b:1;s:7:"level_1";b:1;s:7:"level_0";b:1;s:12:"delete_posts";b:1;s:18:"read_advgb_profile";b:1;s:27:"read_private_advgb_profiles";b:1;}}s:10:"subscriber";a:2:{s:4:"name";s:10:"Subscriber";s:12:"capabilities";a:2:{s:4:"read";b:1;s:7:"level_0";b:1;}}}

这是什么语法,我怎样才能只删除其中包含 advgb 的键值对?

因为我已经使用了 wp-cli(强烈推荐用于 Wordpress 开发工作),我设法通过快速 Bash for 循环解决了这个问题:

for i in `wp role list --field=role`; do wp cap remove "$i" <cap1> <cap2> <cap3>; done

我在 Cygwin 中 运行,但它在 WSL 或 Mac 终端中同样容易工作。

只需确保 wp-cli 已安装并将 <cap1><cap2> 等替换为插件添加到您的角色的每个功能(您可能只需要检查一个角色来获得这些) - 然后代码将遍历你的每个角色并从中删除所有给定的上限。

$ for i in `wp role list --field=role`; do wp cap remove "$i" read_advgb_profile read_private_advgb_profiles edit_advgb_profiles; done
Success: Removed 3 capabilities from 'administrator' role.
Success: Removed 3 capabilities from 'editor' role.
Success: Removed 3 capabilities from 'author' role.
Success: Removed 3 capabilities from 'contributor' role.
Success: Removed 3 capabilities from 'subscriber' role.