Untuk plugin yang saat ini saya kerjakan, saya ingin memberikan / membatasi akses ke pengaturan plugin (yaitu, halaman menu admin yang sesuai) pada basis per peran .
Oleh karena itu, saya harus menambahkan plugin khusus capability
untukuser roles
.
Sayangnya, jawaban kaiser tampaknya tidak berfungsi lagi, jadi saya meluangkan waktu mencoba mencari cara untuk mengizinkan fungsi yang disebutkan di atas.
Jadwal
Sebelum saya membagikan kode saya dengan Anda, berikut ini semuanya, dalam teks biasa:
- Pada aktivasi plugin, tambahkan kemampuan baru
THE_NEW_CAP
ke peran yang memiliki kemampuan bawaan tertentu BUILT_IN_CAP
(dalam kasus saya:) edit_pages
.
- Pada setiap pemuatan halaman, lakukan 1. (yaitu, tambahkan kemampuan, lagi). Ini hanya diperlukan jika Anda ingin memperhitungkan kemungkinan peran baru yang telah dibuat setelah aktivasi plugin. Karenanya, peran-peran baru ini tidak memiliki kemampuan khusus plugin, bahkan jika mereka memiliki kemampuan bawaan yang diperlukan.
- Gunakan kemampuan baru untuk apa pun yang Anda inginkan. Seperti yang dijelaskan sebelumnya, saya menggunakannya untuk memberikan / membatasi akses ke halaman menu admin plugin, jadi itulah yang dilakukan pada contoh kode berikut.
- Pada penonaktifan plugin, hapus kapabilitas. Tentu saja, Anda juga bisa melakukan ini ketika plugin sedang dihapus instalasinya. Either way, lakukan pada akhirnya.
Kode
Dan inilah daftar di atas yang diubah menjadi kode:
»Menyiapkannya
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');
}
}
}
»Menggunakannya
// 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', ...);
}
»Membersihkannya
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');
}
}
}
}
Catatan: Tolong jangan gunakan kemampuan huruf besar. Ini hanya untuk keterbacaan.