+ switch ( $cap ) {
+ case 'remove_user':
+ $caps[] = 'remove_users';
+ break;
+ case 'promote_user':
+ $caps[] = 'promote_users';
+ break;
+ case 'edit_user':
+ // Allow user to edit itself
+ if ( isset( $args[0] ) && $user_id == $args[0] )
+ break;
+ // Fall through
+ case 'edit_users':
+ // If multisite these caps are allowed only for super admins.
+ if ( is_multisite() && !is_super_admin( $user_id ) )
+ $caps[] = 'do_not_allow';
+ else
+ $caps[] = 'edit_users'; // Explicit due to primitive fall through
+ break;
+ case 'delete_post':
+ $author_data = get_userdata( $user_id );
+ //echo "post ID: {$args[0]}<br />";
+ $post = get_post( $args[0] );
+ $post_type = get_post_type_object( $post->post_type );
+ if ( $post_type && 'post' != $post_type->capability_type ) {
+ $args = array_merge( array( $post_type->cap->delete_post, $user_id ), $args );
+ return call_user_func_array( 'map_meta_cap', $args );
+ }
+
+ if ( '' != $post->post_author ) {
+ $post_author_data = get_userdata( $post->post_author );
+ } else {
+ //No author set yet so default to current user for cap checks
+ $post_author_data = $author_data;
+ }
+
+ // If the user is the author...
+ if ( is_object( $post_author_data ) && $user_id == $post_author_data->ID ) {
+ // If the post is published...
+ if ( 'publish' == $post->post_status ) {
+ $caps[] = 'delete_published_posts';
+ } elseif ( 'trash' == $post->post_status ) {
+ if ('publish' == get_post_meta($post->ID, '_wp_trash_meta_status', true) )
+ $caps[] = 'delete_published_posts';
+ } else {
+ // If the post is draft...
+ $caps[] = 'delete_posts';
+ }
+ } else {
+ // The user is trying to edit someone else's post.
+ $caps[] = 'delete_others_posts';
+ // The post is published, extra cap required.
+ if ( 'publish' == $post->post_status )
+ $caps[] = 'delete_published_posts';
+ elseif ( 'private' == $post->post_status )
+ $caps[] = 'delete_private_posts';
+ }
+ break;
+ case 'delete_page':
+ $author_data = get_userdata( $user_id );
+ //echo "post ID: {$args[0]}<br />";
+ $page = get_page( $args[0] );
+ $page_author_data = get_userdata( $page->post_author );
+ //echo "current user id : $user_id, page author id: " . $page_author_data->ID . "<br />";
+ // If the user is the author...
+
+ if ('' != $page->post_author) {
+ $page_author_data = get_userdata( $page->post_author );
+ } else {
+ //No author set yet so default to current user for cap checks
+ $page_author_data = $author_data;
+ }
+
+ if ( is_object( $page_author_data ) && $user_id == $page_author_data->ID ) {
+ // If the page is published...
+ if ( $page->post_status == 'publish' ) {
+ $caps[] = 'delete_published_pages';
+ } elseif ( 'trash' == $page->post_status ) {
+ if ('publish' == get_post_meta($page->ID, '_wp_trash_meta_status', true) )
+ $caps[] = 'delete_published_pages';
+ } else {
+ // If the page is draft...
+ $caps[] = 'delete_pages';
+ }
+ } else {
+ // The user is trying to edit someone else's page.
+ $caps[] = 'delete_others_pages';
+ // The page is published, extra cap required.
+ if ( $page->post_status == 'publish' )
+ $caps[] = 'delete_published_pages';
+ elseif ( $page->post_status == 'private' )
+ $caps[] = 'delete_private_pages';
+ }
+ break;