¿Cómo creo una función de rol personalizada?

23

Deseo crear una capacidad personalizada para acceder a la interfaz de mi complemento.

  • ¿Debería administrar el complemento agregando esta capacidad a todas las cuentas de administrador en la activación?
  • Si es así: ¿WordPress administra la capacidad de agregar a todos los administradores de subblogs y súper administradores en instalaciones de varios sitios, o esa función debe ser manejada por el complemento?
pregunta rsman 30.11.2011 - 18:15

3 respuestas

10

Eliminar lo que agregas

Primero, asegúrese de que todo lo que agregue en la activación también se elimine al desinstalar . Obtuve un breve tutorial que incluye un código de ejemplo para ti.

Prueba con un pequeño complemento:

Realmente no sé mucho sobre MU, pero por lo que puedo decir, el objeto roles es global en todos los blogs. Solo intente este pequeño plugin y vea lo que puede obtener:

<?php
/*
Plugin Name:    MU Roles check
Plugin URI:     https://github.com/franz-josef-kaiser/
Description:    Check roles during viewing a blog
Author:     Franz Josef Kaiser
Author URI:     https://plus.google.com/u/0/107110219316412982437
Version:        0.1
Text Domain:    murc
License:        GPL v2 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*/

/**
 * Show the blog data and the role names in this blog
 * Also shows if the custom capability was successfully added, or displays n/a for the role
 * 
 * @return void
 */
function wpse35165_role_check()
{
    $blog = get_current_site();
    $custom_cap = 'name_of_your_custom_capability';

    $html = "<hr /><table>";
    $html .= "<caption>List roles in (Blog) {$blog->site_name} / ID#{$blog->id}</caption>"
    $html .= "<thead><tr><th>Role Name</th><th>Capabilties</th></tr></thead><tbody>";
    foreach ( $GLOBALS['wp_roles'] as $name => $role_obj )
    {
        $cap = in_array( $custom_cap, $role_obj->caps ) ? $custom_cap : 'n/a';
        $cap = $cap OR in_array( $custom_cap, $role_obj->allcaps ) ? $custom_cap : 'n/a';
        $html .= "<tr><td>{$name}</td><td>{$cap}</td></tr>";
    }
    $html .= '</tbody></table>';

    print $html;
}
add_action( 'shutdown', 'wpse35165_role_check' );

Agregar capacidades

/**
 * Add the capability to the role objects
 * Should be in your activation function and done before you inspect with your plugin
 * 
 * @return void
 */
function wpse35165_add_cap()
{
    $custom_cap = 'name_of_your_custom_capability';
    $min_cap    = 'the_minimum_required_built_in_cap'; // Check "Roles and objects table in codex!
    $grant      = true; 

    foreach ( $GLOBALS['wp_roles'] as $role_obj )
    {
        if ( 
            ! $role_obj->has_cap( $custom_cap ) 
            AND $role_obj->has_cap( $min_cap )
        )
            $role_obj->add_cap( $custom_cap, $grant );
    }
}

Nota: puede agregar la capacidad a la función sin otorgarle acceso, simplemente configure el segundo argumento $grant = false; . Esto permite a usuarios individuales en la lista blanca simplemente agregando el límite que incluye el último argumento como verdadero.

    
respondido por el kaiser 30.11.2011 - 22:26
17

Para un complemento en el que estoy trabajando actualmente, quería otorgar / restringir el acceso a la configuración del complemento (es decir, las páginas del menú de administración correspondientes) en una base por función .
Por lo tanto, tuve que agregar un nuevo complemento específico capability al user roles .

Lamentablemente, la respuesta del kaiser parece que ya no funciona, así que dediqué un tiempo a intentar averiguar cómo para permitir la funcionalidad mencionada anteriormente.

El horario

Antes de compartir mi código contigo, aquí está de qué se trata, en texto simple:

  1. En la activación del complemento, agregue la nueva capacidad THE_NEW_CAP a los roles que tengan cierta capacidad incorporada BUILT_IN_CAP (en mi caso: edit_pages ).
  2. En cada carga de página, haga 1. (es decir, agregue la capacidad, otra vez). Esto solo es necesario si desea tener en cuenta los nuevos roles posibles que se han creado después de la activación del complemento. Por lo tanto, estos nuevos roles no tienen la capacidad específica del complemento, incluso si tienen la capacidad incorporada requerida.
  3. Usa la nueva capacidad para lo que quieras. Como se explicó anteriormente, lo uso para otorgar / restringir el acceso a las páginas del menú de administración del complemento, así es como se hace en el siguiente ejemplo de código.
  4. En la desactivación del complemento, elimine la capacidad. Por supuesto, también puede hacer esto cuando se desinstala el complemento. De cualquier manera, hazlo eventualmente.

El Código

Y aquí está la lista anterior convertida en código:

»Configurándolo

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');
            }
        }
    }

»Usándolo

    // 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', ...);
    }

»Limpiándolo

    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: No utilice las mayúsculas. Esto es solo para facilitar la lectura.

    
respondido por el tfrommen 14.03.2013 - 03:24
0

Esto funciona para mí:

    add_action('admin_init', 'add_custom_cap');
    function add_custom_cap()
    {
        $custom_cap = 'test_cap';
        $min_cap    = 'read';
        $grant      = true;
        $to_role = 'your_user_role';
        $role = 'user_role';

        foreach ( $GLOBALS['wp_roles'] as $role_obj )
        {
            if (is_object($role_obj[$role])) {
                if (!$role_obj[$role]->has_cap( $custom_cap ) && $role_obj[$role]->has_cap( $min_cap )) {
                    $role_obj[$role]->add_cap( $custom_cap, $grant );
                }
            }
        }
    }
    
respondido por el Vitaly Konurin 31.08.2018 - 13:48

Lea otras preguntas en las etiquetas