/** * Conditional tag to check if a user can view a specific post. A user cannot view a post if their * user role has not been selected in the 'Content Permissions' meta box on the edit post screen in * the admin. Non-logged in site visitors cannot view posts if roles were selected. If no roles * were selected, all users and site visitors can view the content. * * There are exceptions to this rule though. The post author, any user with the `restrict_content` * capability, and users that have the ability to edit the post can always view the post, even if * their role was not granted permission to view it. * * @since 0.2.0 * @access public * @param int $user_id * @param int $post_id * @return bool */ function members_can_user_view_post($user_id, $post_id = '') { // If no post ID is given, assume we're in The Loop and get the current post's ID. if (!$post_id) { $post_id = get_the_ID(); } // Assume the user can view the post at this point. */ $can_view = true; // The plugin is only going to handle permissions if the 'content permissions' feature // is active. If not active, the user can always view the post. However, developers // can roll their own handling of this and filter `members_can_user_view_post`. if (members_content_permissions_enabled()) { // Get the roles selected by the user. $roles = members_get_post_roles($post_id); // Check if there are any old roles with the '_role' meta key. if (empty($roles)) { $roles = members_convert_old_post_meta($post_id); } // If we have an array of roles, let's get to work. if (!empty($roles) && is_array($roles)) { // Since specific roles were given, let's assume the user can't view // the post at this point. The rest of this functionality should try // to disprove this. $can_view = false; // Get the post object. $post = get_post($post_id); // Get the post type object. $post_type = get_post_type_object($post->post_type); // If viewing a feed or if the user's not logged in, assume it's blocked at this point. if (is_feed() || !is_user_logged_in()) { $can_view = false; } elseif ($post->post_author == $user_id || user_can($user_id, 'restrict_content') || user_can($user_id, $post_type->cap->edit_post, $post_id)) { $can_view = true; } else { // Loop through each role and set $can_view to true if the user has one of the roles. foreach ($roles as $role) { if (members_user_has_role($user_id, $role)) { $can_view = true; break; } } } } } // Set the check for the parent post based on whether we have permissions for this post. $check_parent = empty($roles) && $can_view; // Set to `FALSE` to avoid hierarchical checking. if (apply_filters('members_check_parent_post_permission', $check_parent, $post_id, $user_id)) { $parent_id = get_post($post_id)->post_parent; // If the post has a parent, check if the user has permission to view it. if (0 < $parent_id) { $can_view = members_can_user_view_post($user_id, $parent_id); } } // Allow developers to overwrite the final return value. return apply_filters('members_can_user_view_post', $can_view, $user_id, $post_id); }
/** * Conditional tag to check whether the currently logged-in user has a specific role. * * @since 1.0.0 * @access public * @param string $role * @return bool */ function members_current_user_has_role($role) { return is_user_logged_in() ? members_user_has_role(get_current_user_id(), $role) : false; }