Для плагина, над которым я сейчас работаю, я хотел предоставить / ограничить доступ к настройкам плагина (то есть соответствующим страницам меню администратора) для каждой роли .
Поэтому мне пришлось добавить новый плагин, специфичный capability
дляuser roles
.
К сожалению, ответ kaiser, похоже, больше не работает, поэтому я потратил некоторое время, пытаясь выяснить, как включить вышеупомянутую функциональность.
Расписание
Прежде чем я поделюсь с вами своим кодом, вот что это такое, в виде простого текста:
- При активации плагина добавьте новую возможность
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');
}
}
}
}
Примечание. Пожалуйста, не используйте заглавные буквы. Это только для удобства чтения.