O gancho 'user_has_cap' parece ter duas cargas de página para acionar

4

Esta pergunta refere-se a outra pergunta que fiz recentemente (http://wordpress.stackexchange.com/questions/29009/how-to-assign-specific-users-the-capability-to-edit-specific-pages-posts -cus /), a resposta para o que me levou a maior parte do caminho para o que eu estava tentando fazer. No entanto, em vez de continuar atualizando essa questão, achei melhor postar uma nova, já que realmente a considero mais um problema novo agora.

Estou basicamente restringindo o acesso de leitura a um tipo de postagem personalizado (projetos) por usuário, estou usando o user_has_cap hook e verifico se o usuário tentando ler uma página tem o ID do tipo de postagem uma matriz de IDs atribuídos ao usuário, dependendo se a matriz possui o ID de postagem atual e, em seguida, os recursos de leitura são adicionados / removidos de acordo. Isso é feito com o seguinte 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);

(Sim, eu usei um código diferente do que a resposta dada à minha pergunta anterior, eu não acho que isso está contribuindo para o problema aqui, já que usei o outro método de atribuição de recursos , Eu prefiro usar o método acima.)

De qualquer forma, o problema que estou encontrando com isso é que ele está tirando duas cargas da página antes que o conteúdo dos meus tipos de post seja escondido. O código que estou usando na minha página é assim:

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

Meu palpite é que o gancho não estava sendo acionado com rapidez suficiente quando a página é carregada para mostrar ou ocultar o conteúdo na primeira carga, mas estou com dificuldades para encontrar uma resposta para quando user_has_cap é acionado.

    
por Rick Curran 01.11.2011 / 16:13

1 resposta

1

Eu finalmente consegui o comportamento necessário, acabei usando o código atualizado do exemplo que mostrei na minha pergunta - e, na verdade, mais perto do código sugerido na pergunta que referi no texto da minha pergunta! Aqui está o código que funcionou no 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);

O uso desse código, em vez do que citei na minha pergunta, parece ser acionado corretamente no carregamento da primeira página, e meu conteúdo está restrito à exibição na primeira vez. Tenho certeza que tentei este formato antes e não tive sucesso, mas agora está funcionando como desejado.

    
por Rick Curran 07.11.2011 / 13:49