Only show current author posts and content in wp-admin
By default, WordPress allows Authors to see the titles of other users posts, unpublished drafts, and all media, even though they cannot be edited. This long snippet fixes this situation and only shows content of the currently logged in author.
/** * Snippet Name: Only show current author posts and content in wp-admin * Snippet URL: https://wpcustoms.net/snippets/only-show-current-author-posts-and-content-in-wp-admin/ */ // Show only posts and media related to logged in author function query_set_only_author( $wp_query ) { global $current_user; if( is_admin() && !current_user_can('edit_others_posts') ) { $wp_query->set( 'author', $current_user->ID ); add_filter('views_edit-post', 'fix_post_counts'); add_filter('views_upload', 'fix_media_counts'); } } add_action('pre_get_posts', 'query_set_only_author' ); // Fix post counts function fix_post_counts($views) { global $current_user, $wp_query; unset($views['mine']); $types = array( array( 'status' => NULL ), array( 'status' => 'publish' ), array( 'status' => 'draft' ), array( 'status' => 'pending' ), array( 'status' => 'trash' ) ); foreach( $types as $type ) { $query = array( 'author' => $current_user->ID, 'post_type' => 'post', 'post_status' => $type['status'] ); $result = new WP_Query($query); if( $type['status'] == NULL ): $class = ($wp_query->query_vars['post_status'] == NULL) ? ' class="current"' : ''; $views['all'] = sprintf(__('All (%d)', 'all'), admin_url('edit.php?post_type=post'), $result->found_posts); elseif( $type['status'] == 'publish' ): $class = ($wp_query->query_vars['post_status'] == 'publish') ? ' class="current"' : ''; $views['publish'] = sprintf(__('Published (%d)', 'publish'), admin_url('edit.php?post_status=publish&post_type=post'), $result->found_posts); elseif( $type['status'] == 'draft' ): $class = ($wp_query->query_vars['post_status'] == 'draft') ? ' class="current"' : ''; $views['draft'] = sprintf(__('Draft'. ((sizeof($result->posts) > 1) ? "s" : "") .' (%d)', 'draft'), admin_url('edit.php?post_status=draft&post_type=post'), $result->found_posts); elseif( $type['status'] == 'pending' ): $class = ($wp_query->query_vars['post_status'] == 'pending') ? ' class="current"' : ''; $views['pending'] = sprintf(__('Pending (%d)', 'pending'), admin_url('edit.php?post_status=pending&post_type=post'), $result->found_posts); elseif( $type['status'] == 'trash' ): $class = ($wp_query->query_vars['post_status'] == 'trash') ? ' class="current"' : ''; $views['trash'] = sprintf(__('Trash (%d)', 'trash'), admin_url('edit.php?post_status=trash&post_type=post'), $result->found_posts); endif; } return $views; } // Fix media counts function fix_media_counts($views) { global $wpdb, $current_user, $post_mime_types, $avail_post_mime_types; $views = array(); $_num_posts = array(); $count = $wpdb->get_results( " SELECT post_mime_type, COUNT( * ) AS num_posts FROM $wpdb->posts WHERE post_type = 'attachment' AND post_author = $current_user->ID AND post_status != 'trash' GROUP BY post_mime_type ", ARRAY_A ); foreach( $count as $row ) $_num_posts[$row['post_mime_type']] = $row['num_posts']; $_total_posts = array_sum($_num_posts); $detached = isset( $_REQUEST['detached'] ) || isset( $_REQUEST['find_detached'] ); if ( !isset( $total_orphans ) ) $total_orphans = $wpdb->get_var(" SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_author = $current_user->ID AND post_status != 'trash' AND post_parent < 1 "); $matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts)); foreach ( $matches as $type => $reals ) foreach ( $reals as $real ) $num_posts[$type] = ( isset( $num_posts[$type] ) ) ? $num_posts[$type] + $_num_posts[$real] : $_num_posts[$real]; $class = ( empty($_GET['post_mime_type']) && !$detached && !isset($_GET['status']) ) ? ' class="current"' : ''; $views['all'] = "" . sprintf( __('All (%s)', 'uploaded files' ), number_format_i18n( $_total_posts )) . ''; foreach ( $post_mime_types as $mime_type => $label ) { $class = ''; if ( !wp_match_mime_types($mime_type, $avail_post_mime_types) ) continue; if ( !empty($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) ) $class = ' class="current"'; if ( !empty( $num_posts[$mime_type] ) ) $views[$mime_type] = "" . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), $num_posts[$mime_type] ) . ''; } $views['detached'] = '' . sprintf( __( 'Unattached (%s)', 'detached files' ), $total_orphans ) . ''; return $views; }