‘USER_HAS_CAP’挂钩似乎需要两次页面加载才能触发

时间:2011-11-01 作者:Rick Curran

这个问题与我最近问的另一个问题有关(http://wordpress.stackexchange.com/questions/29009/how-to-assign-specific-users-the-capability-to-edit-specific-pages-posts-cus/),这个答案让我在很大程度上实现了我的目标。然而,与其不断更新这个问题,我认为最好发布一个新的问题,因为我现在真的认为它更像是一个新问题。

我基本上是在每个用户的基础上限制对自定义帖子类型(项目)的读取权限,我使用user_has_cap hook和I检查试图读取页面的用户是否在分配给用户的ID数组中具有post类型的ID,这取决于数组中是否具有当前post ID,然后相应地添加/删除读取功能。这是通过以下代码完成的:

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);
(是的,我使用的代码与我之前问题的答案不同,我不认为这是造成问题的原因,尽管我使用了其他分配功能的方法,我更喜欢使用上述方法。)

无论如何,我遇到的问题是,在我的帖子类型内容被隐藏之前,它需要两次加载页面。我在页面上使用的代码如下所示:

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>\';
}
我的猜测是,当加载页面时,钩子没有被足够快地触发,以便在第一次加载时显示或隐藏内容,但我很难找到什么时候user_has_cap 已触发。

1 个回复
SO网友:Rick Curran

我最终成功地获得了所需的行为,我最终使用了我在问题中展示的示例中的更新代码,实际上更接近我在问题文本中引用的问题中建议的代码!以下是最终有效的代码:

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);
使用此代码而不是我在问题中引用的代码似乎可以在第一页加载时正确触发,并且我的内容在第一次查看时受到限制。我确信我以前尝试过这种格式,但没有成功,但现在它正在按预期工作。

结束