对于我目前正在开发的插件,我想在每个角色的基础上授予/限制对插件设置(即相应的管理菜单页面)的访问权限<因此,我不得不add a new plugin-specific capability
to the user roles
.
不幸地kaiser\'s answer 似乎不再工作了,所以我花了一些时间试图找出如何允许上述功能。
在我与您分享我的代码之前,以下是所有内容的简单文本:
插件激活时,添加新功能THE_NEW_CAP
具有某种内置功能的角色BUILT_IN_CAP
(就我而言:edit_pages
).在每个页面加载时,执行以下操作1. (即,再次添加功能)。只有当您想说明插件激活后可能创建的新角色时,才需要这样做。因此,这些新角色没有插件特定的功能,即使它们具有所需的内置功能无论您想要什么,都可以使用新功能。如前所述,我使用它来授予/限制对插件管理菜单页面的访问,因此在下面的代码示例中就是这样做的在插件停用时,删除该功能。当然,在卸载插件时也可以这样做。不管怎样,最终都要这样做
代码,下面是上面转换为代码的列表:
»设置
class WPSE35165Plugin {
public function __construct() {
// Register hooks
register_activation_hook(__FILE__, array(__CLASS__, \'activation\'));
register_deactivation_hook(__FILE__, array(__CLASS__, \'deactivation\'));
// Add actions
add_action(\'admin_menu\', array(__CLASS__, \'admin_menu\'));
}
public function activation() {
self::add_cap();
}
// Add the new capability to all roles having a certain built-in capability
private static function add_cap() {
$roles = get_editable_roles();
foreach ($GLOBALS[\'wp_roles\']->role_objects as $key => $role) {
if (isset($roles[$key]) && $role->has_cap(\'BUILT_IN_CAP\')) {
$role->add_cap(\'THE_NEW_CAP\');
}
}
}
使用它 // Add plugin menu pages to admin menu
public function admin_menu() {
// Remove the following line if you don\'t care about new roles
// that have been created after plugin activation
self::add_cap();
// Set up the plugin admin menu
add_menu_page(\'Menu\', \'Menu\', \'THE_NEW_CAP\', …);
add_submenu_page(\'wpse35165\', \'Submenu\', \'Submenu\', \'THE_NEW_CAP\', ...);
}
清理它 public function deactivation() {
self::remove_cap();
}
// Remove the plugin-specific custom capability
private static function remove_cap() {
$roles = get_editable_roles();
foreach ($GLOBALS[\'wp_roles\']->role_objects as $key => $role) {
if (isset($roles[$key]) && $role->has_cap(\'THE_NEW_CAP\')) {
$role->remove_cap(\'THE_NEW_CAP\');
}
}
}
}
注意:请不要使用大写功能。这只是为了可读性