/** * 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; }
/** * 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; } } }