Example #1
0
/**
 * Gets all caps by level.
 * 
 * Loops over all collected rules and sees each one matches current user.
 * 
 * @global type $wpcf_access
 * @param type $level
 * @param type $context
 * @return type 
 */
function wpcf_access_user_get_caps_by_type($user_id, $context = 'types')
{
    global $wpcf_access;
    static $cache = array();
    if (isset($cache[$user_id][$context])) {
        return $cache[$user_id][$context];
    }
    list($role, $level) = wpcf_access_rank_user($user_id);
    if (empty($role) || $level === false || empty($wpcf_access->settings->{$context})) {
        return array();
    }
    $caps = array();
    foreach ($wpcf_access->settings->{$context} as $type => $data) {
        if (!empty($data['permissions']) && is_array($data['permissions'])) {
            foreach ($data['permissions'] as $_cap => $_data) {
                if (isset($_data['role'])) {
                    $can = wpcf_access_is_level_ranked_higher($level, wpcf_access_role_to_level($_data['role']));
                    $cap_data['context'] = $context;
                    $cap_data['parent'] = $type;
                    $cap_data['caps'][$_cap] = (bool) $can;
                    $caps[$type] = $cap_data;
                }
            }
        }
    }
    $cache[$user_id][$context] = $caps;
    return $caps;
}
Example #2
0
/**
 * Hides post type on frontend.
 * 
 * Checks if user is logged and if has required level to read posts.
 * This is determined only by role.
 * 
 * @todo Check if checking by user_id is needed
 * 
 * @global type $wpcf_access
 * @global type $wp_post_types
 * @global type $current_user
 * @param type $role
 * @param type $post_type 
 */
function wpcf_access_hide_post_type($role, $post_type)
{
    global $wpcf_access, $wp_post_types;
    $current_user = wp_get_current_user();
    $hide = false;
    // Hide posts if user not logged and role is different than 'guest'
    if (empty($current_user->ID) && $role != 'guest') {
        $hide = true;
    }
    // Check if user has required level according to role.
    // Instead may use:
    // wpcf_access_is_role_ranked_higher($role, $compare);
    // /embedded.php
    $level = wpcf_access_role_to_level($role);
    if ($level && (empty($current_user->ID) || !array_key_exists($level, $current_user->allcaps))) {
        $hide = true;
    }
    // Set post type properties to hide on frontend
    if ($hide && isset($wp_post_types[$post_type])) {
        $wp_post_types[$post_type]->public = false;
        $wp_post_types[$post_type]->publicly_queryable = false;
        $wp_post_types[$post_type]->show_in_nav_menus = false;
        $wp_post_types[$post_type]->exclude_from_search = true;
        $wpcf_access->debug_hidden_post_types[] = $post_type;
        // Trigger change for posts and pages
        // Built-in post types can only be excluded from search
        // using following filters: 'posts_where', 'get_pages', 'the_comments'
        if (in_array($post_type, array('post', 'page'))) {
            // If debug mode - record call
            $wpcf_access->hide_built_in[] = $post_type;
            // Register filters
            add_filter('posts_where', 'wpcf_access_filter_posts');
            add_filter('get_pages', 'wpcf_access_exclude_pages');
            add_filter('the_comments', 'wpcf_access_filter_comments');
        }
    } else {
        if ($wp_post_types[$post_type]) {
            $wp_post_types[$post_type]->public = true;
            $wp_post_types[$post_type]->publicly_queryable = true;
            $wp_post_types[$post_type]->show_in_nav_menus = true;
            $wp_post_types[$post_type]->exclude_from_search = false;
            $wpcf_access->debug_visible_post_types[] = $post_type;
        }
    }
}