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