web-dev-qa-db-fra.com

Le hook 'user_has_cap' semble nécessiter deux charges de page pour se déclencher

Cette question se rapporte à une autre question que j'ai posée récemment (http://wordpress.stackexchange.com/questions/29009/how-to-assign-specific-users-the-capability-to-edit-specific-pages-posts-cus/ ), la réponse à ce qui m'a amené la plupart du chemin à ce que j'essayais de faire. Cependant, plutôt que de continuer à mettre à jour cette question, j’ai pensé qu’il était préférable d’en publier une nouvelle, car j’estime qu’il s’agit maintenant d’un nouveau numéro.

Je limite fondamentalement l'accès en lecture à un type de publication personnalisé (projets) utilisateur par utilisateur. J'utilise le hook user_has_cap et je vérifie si l'utilisateur qui tente de lire une page a l'ID du type de publication dans un tableau d'ID qui sont attribués à l'utilisateur, selon que le tableau comporte ou non l'identifiant de publication actuel, puis les fonctionnalités de lecture sont ajoutées/supprimées en conséquence. Ceci est fait avec le code suivant:

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

(Oui, j'ai utilisé un code différent de la réponse donnée à ma question précédente, je ne pense pas que cela contribue au problème ici, bien que ont utilisé l’autre méthode d’attribution des capacités, je préfère simplement utiliser la méthode ci-dessus.)

Quoi qu'il en soit, le problème que je rencontre avec ceci est qu'il faut deux charges de la page avant que le contenu de mes publications ne soit masqué. Le code que j'utilise sur ma page ressemble à ceci:

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

J'imaginais que le crochet n'était pas déclenché assez rapidement lors du chargement de la page pour afficher ou masquer le contenu lors du premier chargement, mais j'ai du mal à trouver une réponse lorsque user_has_cap est déclenché.

4
Rick Curran

J'ai finalement réussi à obtenir le comportement requis. J'ai finalement utilisé un code mis à jour à partir de l'exemple présenté dans ma question - et plus proche du code suggéré dans la question que j'ai citée dans le texte de ma question! Voici le code qui a fonctionné à la fin:

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

L'utilisation de ce code au lieu de ce que j'ai cité dans ma question semble se déclencher correctement lors du chargement de la première page, et mon contenu n'est pas visible pour la première fois. Je suis sûr que j'avais déjà essayé ce format et que je n'avais pas eu de succès, mais il fonctionne maintenant comme souhaité.

1
Rick Curran