W przypadku wtyczki, nad którą obecnie pracuję, chciałem udzielić / ograniczyć dostęp do ustawień wtyczki (tj. Odpowiednich stron menu administratora) dla poszczególnych ról .
Dlatego musiałem dodać nową wtyczkę capability
douser roles
.
Niestety, odpowiedź kaisera wydaje się już nie działać, więc spędziłem trochę czasu próbując wymyślić, jak zezwolić na wyżej wspomnianą funkcjonalność.
Harmonogram
Zanim podzielę się z tobą moim kodem, oto o co chodzi, w postaci zwykłego tekstu:
- Po aktywacji wtyczki dodaj nową funkcję
THE_NEW_CAP
do ról mających pewne wbudowane możliwości BUILT_IN_CAP
(w moim przypadku:edit_pages
:).
- Przy każdym ładowaniu strony wykonaj 1. (tj. Ponownie dodaj możliwość). Jest to konieczne tylko wtedy, gdy chcesz uwzględnić możliwe nowe role, które zostały utworzone po aktywacji wtyczki. Dlatego te nowe role nie mają funkcji specyficznych dla wtyczek, nawet jeśli mają wymagane wbudowane funkcje.
- Skorzystaj z nowej funkcji do wszystkiego, czego chcesz. Jak wyjaśniono wcześniej, używam go do przyznawania / ograniczania dostępu do stron menu administratora wtyczki, tak to jest zrobione w poniższym przykładzie kodu.
- Po dezaktywacji wtyczki usuń tę możliwość. Oczywiście możesz to zrobić również podczas odinstalowywania wtyczki. Tak czy inaczej, zrób to w końcu.
Kod
A oto powyższa lista przekonwertowana na kod:
»Konfiguracja
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');
}
}
}
" Użyj tego
// 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', ...);
}
»Sprzątanie
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');
}
}
}
}
Uwaga: Nie używaj wielkich liter. To tylko dla czytelności.