El gancho 'user_has_cap' parece tomar dos cargas de página para disparar

4

Esta pregunta se relaciona con otra pregunta que formulé recientemente (http://wordpress.stackexchange.com/questions/29009/how-to-assign-specific-users-the-capability-to-edit-specific-pages-posts -cus /), la respuesta a la que llegué la mayor parte del camino hacia lo que estaba tratando de hacer. Sin embargo, en lugar de seguir actualizando esa pregunta, pensé que sería mejor publicar una nueva, ya que realmente la considero más un problema nuevo.

Básicamente, estoy restringiendo el acceso de lectura a un tipo de publicación personalizada (proyectos) por usuario, uso el enganche user_has_cap y verifico si el usuario que intenta leer una página tiene el ID del tipo de publicación en una matriz de ID que se asigna al Usuario, dependiendo de si la matriz tiene la ID de publicación actual, entonces las capacidades de Lectura se agregan / eliminan en consecuencia. Esto se hace con el siguiente código:

function allow_user_to_read_cpt_filter($allcaps, $cap, $args) {
    global $current_user; // Get user id
    get_currentuserinfo(); //...
    $userid = $current_user->ID; //...
    $wos_uspr_checked_read_ids = explode(',',esc_attr(get_the_author_meta('wos_uspr_read_data', $userid)));
    /* The above is a comma separated list of IDS, e.g. 724,736,784 */
    global $wpdb;
    $post = get_post($args[2]);
    if (!in_array($post->ID, $wos_uspr_checked_read_ids)) {
        $user = wp_get_current_user();
        $user->remove_cap('read_project');
        $user->remove_cap('read_projects');
        $user->remove_cap('read_others_projects');
        $user->remove_cap('read_published_projects');       
    } else {
        $user = wp_get_current_user();
        $user->add_cap('read_project');
        $user->add_cap('read_projects');
        $user->add_cap('read_others_projects');
        $user->add_cap('read_published_projects');
    }

    return $allcaps;
}

add_filter('user_has_cap', 'allow_user_to_read_cpt_filter', 100, 3);

(Sí, he usado un código diferente al de la respuesta dada a mi pregunta anterior, no pienso , esto está contribuyendo al problema aquí, ya que he usado el otro método para asignar capacidades. , Yo prefiero usar el método anterior.

De todos modos, el problema que me encuentro con esto es que está tomando dos cargas de la página antes de que se oculte el contenido de mi tipo de publicación. El código que estoy usando en mi página se ve así:

if (current_user_can('read_projects')) {
    echo '<p>Yes, you can read this.</p>';
} else if (!current_user_can('read_projects')) {
    echo '<p>No, you cannot read this.</p>';
}

Supongo que el gancho no se activó lo suficientemente rápido cuando se cargó la página para mostrar u ocultar el contenido en la primera carga, pero me cuesta encontrar una respuesta cuando se activa user_has_cap .

    
pregunta Rick Curran 01.11.2011 - 16:13

1 respuesta

1

Finalmente logré obtener el comportamiento requerido, terminé usando el código actualizado del ejemplo que mostraba en mi pregunta, ¡y en realidad estaba más cerca del código sugerido en la pregunta a la que hice referencia en el texto de mi pregunta! Aquí está el código que funcionó al final:

function allow_user_to_edit_cpt_filter($allcaps, $cap, $args) {
    global $current_user; // Get user id
    get_currentuserinfo(); //...
    $userid = $current_user->ID; //...
    $a_user = new WP_User($userid); // Get user details
    if ($a_user->roles[0] != 'administrator')  { // Don't apply if administrator
        $wos_uspr_checked_edit_ids = explode(',',esc_attr(get_the_author_meta('wos_uspr_edit_data', $userid)));
        global $wpdb;
        $post = get_post($args[2]);
            // UPDATED CODE BLOCK BEGINS
        if (!in_array($post->ID, $wos_uspr_checked_edit_ids)) {
            if (($args[0] == "edit_project") || ($args[0] == "edit_others_projects") || ($args[0] == "edit_published_projects")) {
                foreach((array) $cap as $capasuppr) {
                   if (array_key_exists($capasuppr, $allcaps)) {
                      $allcaps[$capasuppr] = 0;
                   }
                }
            }
        }
            // UPDATED CODE BLOCK ENDS
    }
    return $allcaps;
}
add_filter('user_has_cap', 'allow_user_to_edit_cpt_filter', 100, 3);

El uso de este código en lugar de lo que he citado en mi pregunta parece activarse correctamente en la primera carga de la página, y mi contenido no puede verse la primera vez. Estoy seguro de que probé este formato antes y no tuve éxito, pero ahora está funcionando como se desea.

    
respondido por el Rick Curran 07.11.2011 - 13:49

Lea otras preguntas en las etiquetas