2016-01-18 13 views
13

Provo a creare un ruolo utente con alcune funzionalità personalizzate. Funziona così lontano. Ma se voglio verificare le autorizzazioni utente di una capacità specifica con la funzione current_user_can() restituisce false. Ma all'interno della gamma di funzionalità del nuovo ruolo creato, la capacità specifica è impostata su true.La funzionalità personalizzata del ruolo di Wordpress è impostata su true ma restituisce false

Quindi, per dare le mie parole un po 'più di fondo di codifica:

IL RUOLO OGGETTO

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


MIO RUOLO ADD FUNZIONE

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


CUSTOM POST TIPO ARG

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] 'edit_post'

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

uscite invece di 'edit_event'



Qualsiasi suggerimento, perché questo comportamento sbagliato viene su?

+1

Non stai mostrando dove stai usando 'current_user_can' ...e cosa c'entra il filtro 'map_meta_cap'? . . . Il mio 'var_dump ($ cap)' mostra 'edit_events' tutto bene ... – brasofilo

+0

Grazie brasofilo. La tua risposta mi ha portato a pensare fuori dagli schemi. :) – kindisch

risposta

1

Oggi l'ho risolto.

È necessario assegnare un ID oggetto per il secondo parametro alla funzione current_user_can() per ottenere il corretto ritorno delle funzionalità a punta singola (ad esempio "edit_post"). Altrimenti la funzione restituirà false, se questo parametro non è impostato.

Come all'interno della documentazione di WordPress:

Se omesso è possibile ricevere un 'indefinito offset: 0' avvertimento (questo è perché la funzione current_user_can chiama infine map_meta_cap che al momento del check contro capacità meta aspetta una matrice, ma è fornito solo un singolo valore)

0

tenta di registrare questi capabilities l'usanza Post Tipo event prima, e poi assegnare quelli capabilities-organiser

Ti piace questa:

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

Modificare il codice per event tipo messaggio.

e controllare il capababilities utente di codice qui sotto invece:

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; 
} 
+0

1. Per assegnare un'array 'capabilities' in più alla funzione' register_post_type' non è necessario in questo caso. L'argomento 'capability_type' farà questo per te. È necessario se si dispone del tipo di memoria "post", ad esempio. Quindi genera automaticamente 'edit_others_memorys' invece di 'edit_others_memories'. Pertanto, è possibile farlo all'interno dell'argomento 'capabilities' – kindisch

+0

2. Ciò non funzionerà. Le funzionalità sono impostate sull'organizzatore e all'interno del database di WordPress, quindi non importa se aggiungo le funzionalità prima o dopo la funzione 'register_post_type' al ruolo. Ciò che importa è che sono impostati all'interno dell'oggetto Role e lo sono. – kindisch

0

Prova user_can(). Dovrai passare l'ID utente come primo parametro. Puoi farlo tramite get_current_user_id().

+0

Anche questo restituirà false, poiché 'user_can()' e 'get_current_user_id()' chiamano la stessa funzione per verificare la capacità [Vedere qui, Riga 501] (https://core.trac.wordpress.org/ browser/tag/4.4.1/src/wp-includes/capabilities.php # L501) 'return call_user_func_array (array ($ utente, 'has_cap'), $ args);' – kindisch

+0

Quindi hai due modi per farlo . Innanzitutto, considera WP_Role come un oggetto OOP e controlla se esiste un determinato elemento nell'array delle proprietà 'capabilities'. Oppure puoi verificare tramite la query $ wpdp. –