Para um plug-in no qual estou trabalhando, eu queria conceder / restringir o acesso às configurações do plug-in (ou seja, as páginas do menu de administração) de acordo com a função .
Portanto, tive que adicionar um novo plugin específico capability
ao arquivouser roles
.
Infelizmente, a resposta do kaiser parece não estar mais funcionando, então passei algum tempo tentando descobrir como permitir a funcionalidade mencionada acima.
O horário
Antes de compartilhar meu código com você, aqui está o que se trata, em texto simples:
- Na ativação do plug-in, adicione o novo recurso
THE_NEW_CAP
a funções com um determinado recurso interno BUILT_IN_CAP
(no meu caso edit_pages
:).
- Em cada carregamento de página, faça 1. (por exemplo, adicione o recurso novamente). Isso é necessário apenas se você desejar contabilizar possíveis novas funções que foram criadas após a ativação do plug-in. Portanto, essas novas funções não têm o recurso específico do plug-in, mesmo que tenham o recurso interno necessário.
- Use o novo recurso para o que você quiser. Como explicado anteriormente, eu o uso para conceder / restringir o acesso às páginas do menu de administração do plug-in, e é assim que é feito no exemplo de código a seguir.
- Na desativação do plug-in, remova o recurso. Obviamente, você também pode fazer isso quando o plug-in estiver sendo desinstalado. De qualquer maneira, faça-o eventualmente.
O código
E aqui está a lista acima convertida em código:
»Configurando
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');
}
}
}
" Usando isso
// 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', ...);
}
»Limpando
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');
}
}
}
}
Nota: Por favor, não use recursos em maiúsculas. Isso é apenas para facilitar a leitura.