Beispiel #1
0
/**
 * 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);
}
 /**
  * Saves the post meta.
  *
  * @since  1.0.0
  * @access public
  * @param  int     $post_id
  * @param  object  $post
  * @return void
  */
 public function update($post_id, $post = '')
 {
     // Fix for attachment save issue in WordPress 3.5.
     // @link http://core.trac.wordpress.org/ticket/21963
     if (!is_object($post)) {
         $post = get_post();
     }
     // Verify the nonce.
     if (!isset($_POST['members_cp_meta']) || !wp_verify_nonce($_POST['members_cp_meta'], 'members_cp_meta_nonce')) {
         return;
     }
     /* === Roles === */
     // Get the current roles.
     $current_roles = members_get_post_roles($post_id);
     // Get the new roles.
     $new_roles = isset($_POST['members_access_role']) ? $_POST['members_access_role'] : '';
     // If we have an array of new roles, set the roles.
     if (is_array($new_roles)) {
         members_set_post_roles($post_id, array_map('members_sanitize_role', $new_roles));
     } elseif (!empty($current_roles)) {
         members_delete_post_roles($post_id);
     }
     /* === Error Message === */
     // Get the old access message.
     $old_message = members_get_post_access_message($post_id);
     // Get the new message.
     $new_message = isset($_POST['members_access_error']) ? stripslashes(wp_filter_post_kses(addslashes($_POST['members_access_error']))) : '';
     // If we have don't have a new message but do have an old one, delete it.
     if ('' == $new_message && $old_message) {
         members_delete_post_access_message($post_id);
     } else {
         if ($new_message !== $old_message) {
             members_set_post_access_message($post_id, $new_message);
         }
     }
 }