La capacidad personalizada de rol de WordPress se establece en verdadero pero devuelve falso

6 minutos de lectura

avatar de usuario
amable

Intento crear un rol de usuario con algunas capacidades personalizadas. Eso funciona hasta ahora. Pero si quiero verificar los permisos de usuario de una capacidad específica con la función current_user_can() devuelve falso. Pero dentro de la matriz de capacidades del nuevo rol creado, la capacidad específica se establece en verdadero.

Entonces, para darle a mis palabras un poco más de trasfondo de codificación:

EL OBJETO DEL ROL

WP_Role {
  ["name"]=> "organizer"
  ["capabilities"]=> {
       ["edit_posts"]              => bool(false)
       ["delete_posts"]            => bool(false)
       ["publish_posts"]           => bool(false)
       ["upload_files"]            => bool(true)
       ["edit_event"]              => bool(true)
       ["read_event"]              => bool(true)
       ["delete_event"]            => bool(true)
       ["edit_events"]             => bool(true)
       ["edit_others_events"]      => bool(false)
       ["publish_events"]          => bool(false)
       ["read_private_events"]     => bool(true)
       ["read"]                    => bool(true)
       ["delete_events"]           => bool(true)
       ["delete_private_events"]   => bool(false)
       ["delete_published_events"] => bool(true)
       ["delete_others_events"]    => bool(false)
       ["edit_private_events"]     => bool(false)
       ["edit_published_events"]   => bool(true)
       ["manage_event_terms"]      => bool(true)
       ["edit_event_terms"]        => bool(true)
       ["delete_event_terms"]      => bool(true)
       ["assign_event_terms"]      => bool(true)
  }

MI FUNCIÓN AÑADIR ROL

add_role( 'organizer', __( 'Organizer', 'eventtool' ), array(
            // General
            'edit_posts'              => false,
            'delete_posts'            => false,
            'publish_posts'           => false,
            'upload_files'            => true,
            'edit_event'              => true,
            'read_event'              => true,
            'delete_event'            => true,

            // Primitive capabilities used outside of map_meta_cap():
            'edit_events'             => true,
            'edit_others_events'      => false,
            'publish_events'          => false,
            'read_private_events'     => true,

            // Primitive capabilities used within map_meta_cap():
            'read'                    => true,
            'delete_events'           => true,
            'delete_private_events'   => false,
            'delete_published_events' => true,
            'delete_others_events'    => false,
            'edit_private_events'     => false,
            'edit_published_events'   => true,
            'edit_events'             => true,

            // Terms
            'manage_event_terms'      => true,
            'edit_event_terms'        => true,
            'delete_event_terms'      => true,
            'assign_event_terms'      => true
        )
);

POSTE PERSONALIZADO TIPO ARGS

register_post_type( 'event', array(
                'labels'              => $labels,
                'description'         => __( 'This is where you can add new events to your page.', 'eventtool' ),
                'public'              => true,
                'show_ui'             => true,
                'capability_type'     => 'event',
                'map_meta_cap'        => true,
                'publicly_queryable'  => true,
                'exclude_from_search' => false,
                'hierarchical'        => false,
                'rewrite'             => _x( 'event', 'slug', 'eventtool' ),
                'query_var'           => true,
                'supports'            => array( 'title', 'editor', 'excerpt', 'thumbnail' ),
                'show_in_nav_menus'   => true
            )
        );

[UPDATE]

function et_modify_map_meta_cap( $caps, $cap, $user_id, $args ) {

    var_dump($cap)

}
add_filter( 'map_meta_cap', 'et_modify_map_meta_cap', 10, 4 );

Muestra ‘edit_post’ en lugar de ‘edit_event’

¿Alguna sugerencia, por qué surge este comportamiento incorrecto?

  • No estás mostrando dónde estás usando current_user_can… y que hace el filtro map_meta_cap tiene que ver con esto? . . . Mi var_dump($cap) espectáculos edit_events está bien…

    – brasofilo

    31 de enero de 2016 a las 7:31

  • Gracias brasofilo. Su respuesta me ha llevado a pensar fuera de la caja. 🙂

    – amable

    04/02/2016 a las 21:52

avatar de usuario
amable

Hoy lo resolví.

Es necesario asignar un id de objeto para el segundo parámetro al current_user_can() función para obtener el retorno correcto de las capacidades de un solo punto (por ejemplo, ‘edit_post’). De lo contrario, la función devolverá falso, si este parámetro no está configurado.

como dentro del Documentación de WordPress:

Si se omite, puede recibir una advertencia de ‘Desplazamiento indefinido: 0’ (esto se debe a que el current_user_can la función eventualmente llama map_meta_cap que al verificar las capacidades meta espera una matriz pero solo se proporciona un valor único)

Trate de registrar estos capabilities al tipo de publicación personalizada event primero, y luego asignar esos capabilities a organiser

Como esto :

function create_my_post_types() {
    register_post_type(
        'movie',
        array(
            'public' => true,
            'capability_type' => 'movie',
            'capabilities' => array(
                'publish_posts' => 'publish_movies',
                'edit_posts' => 'edit_movies',
                'edit_others_posts' => 'edit_others_movies',
                'delete_posts' => 'delete_movies',
                'delete_others_posts' => 'delete_others_movies',
                'read_private_posts' => 'read_private_movies',
                'edit_post' => 'edit_movie',
                'delete_post' => 'delete_movie',
                'read_post' => 'read_movie',
            ),
        )
    );
}

Cambia el código a event tipo de mensaje.

Y verifique las capacidades del usuario con el siguiente código:

add_filter( 'map_meta_cap', 'my_map_meta_cap', 10, 4 );

function my_map_meta_cap( $caps, $cap, $user_id, $args ) {

    /* If editing, deleting, or reading a movie, get the post and post type object. */
    if ( 'edit_movie' == $cap || 'delete_movie' == $cap || 'read_movie' == $cap ) {
        $post = get_post( $args[0] );
        $post_type = get_post_type_object( $post->post_type );

        /* Set an empty array for the caps. */
        $caps = array();
    }

    /* If editing a movie, assign the required capability. */
    if ( 'edit_movie' == $cap ) {
        if ( $user_id == $post->post_author )
            $caps[] = $post_type->cap->edit_posts;
        else
            $caps[] = $post_type->cap->edit_others_posts;
    }

    /* If deleting a movie, assign the required capability. */
    elseif ( 'delete_movie' == $cap ) {
        if ( $user_id == $post->post_author )
            $caps[] = $post_type->cap->delete_posts;
        else
            $caps[] = $post_type->cap->delete_others_posts;
    }

    /* If reading a private movie, assign the required capability. */
    elseif ( 'read_movie' == $cap ) {

        if ( 'private' != $post->post_status )
            $caps[] = 'read';
        elseif ( $user_id == $post->post_author )
            $caps[] = 'read';
        else
            $caps[] = $post_type->cap->read_private_posts;
    }

    /* Return the capabilities required by the user. */
    return $caps;
}

  • 1. Para asignar un extra capabilities matriz a la register_post_type La función no es necesaria en este caso. El argumento capability_type hará esto por ti. Es necesario si tiene el tipo de publicación ‘memoria’, por ejemplo. Entonces se autogenera edit_others_memorys en vez de edit_others_memories. Por lo tanto, puede ajustar eso dentro del capabilities argumento

    – amable

    29 de enero de 2016 a las 18:33

  • 2. Eso no funcionará. Las capacidades se configuran en el organizador y están dentro de la base de datos de WordPress, por lo que no importa si agrego las capacidades antes o después del register_post_type función al rol. Lo que importa es que se establezcan dentro del objeto de rol y lo son.

    – amable

    29 de enero de 2016 a las 18:33

Probar usuario_puede(). Deberá pasar la ID de usuario como primer parámetro. Puedes pasarlo get_current_user_id().

  • Eso también devolverá falso, porque user_can() y get_current_user_id() están llamando a la misma función para verificar la capacidad Ver aquí, Línea 501 return call_user_func_array( array( $user, 'has_cap' ), $args );

    – amable

    30 de enero de 2016 a las 13:54


  • Entonces tienes dos formas de hacerlo. Primero, trate WP_Role como un objeto OOP y verifique si existe un determinado elemento en la matriz de propiedades ‘capacidades’. O puede verificar a través de la consulta $wpdp.

    – Loai Abdelhalim

    30 de enero de 2016 a las 14:10


¿Ha sido útil esta solución?