Одной из задач администратора при управлении блогом с несколькими пользователями, наделенными правами автора, является разграничение доступа к файлам, которые закачивают эти пользователи на сайт. Например, нужно, чтобы один пользователь не имел доступа к изображениям, закачанным другим пользователям, чтобы случайно не удалить нужные, либо не иметь возможности использовать их в своих публикациях. А лучше не ограничить доступ не только к файлам, но и к постам.
Доступ к файлам и постам разных пользователей — код
Для разграничения доступа к файлам и постам между пользователями можно использовать следующий код:
// посты и файлы только текущего пользователя add_action('pre_get_posts', 'query_set_only_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'); } } // правильное количество постов 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( '%4$s <span class="count">(%3$d)</span>', admin_url('edit.php?post_type=post'), $class, $result->found_posts, __('All') ); elseif( $type['status'] == 'publish' ): $class = ($wp_query->query_vars['post_status'] == 'publish') ? ' class="current"' : ''; $views['publish'] = sprintf( '%4$s <span class="count">(%3$d)</span>', admin_url('edit.php?post_type=post'), $class, $result->found_posts, __('Publish') ); elseif( $type['status'] == 'draft' ): $class = ($wp_query->query_vars['post_status'] == 'draft') ? ' class="current"' : ''; $views['draft'] = sprintf( '%4$s <span class="count">(%3$d)</span>', admin_url('edit.php?post_type=post'), $class, $result->found_posts, __('Draft') ); elseif( $type['status'] == 'pending' ): $class = ($wp_query->query_vars['post_status'] == 'pending') ? ' class="current"' : ''; $views['pending'] = sprintf( '%4$s <span class="count">(%3$d)</span>', admin_url('edit.php?post_type=post'), $class, $result->found_posts, __('Pending') ); elseif( $type['status'] == 'trash' ): $class = ($wp_query->query_vars['post_status'] == 'trash') ? ' class="current"' : ''; $views['trash'] = sprintf( '%4$s <span class="count">(%3$d)</span>', admin_url('edit.php?post_type=post'), $class, $result->found_posts, __('Trash') ); endif; } return $views; } // правильное количество файлов function fix_media_counts($views) { global $wpdb, $current_user, $post_mime_types, $avail_post_mime_types; $views = 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 $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 <span class="count">(%s)</span>', '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 <span class="count">(%s)</span>', 'detached files' ), $total_orphans ) . ''; return $views; }
Если поместить этот код в файл functions.php, то пользователи будут иметь доступ только к файлам и постам, которые они закачали и создали, остальные будут им невидимы и недоступны.
Доступ к файлам и постам разных пользователей — плагины
Если нужно использовать разграничение к постам глобально, то можно использовать плагин Manage Your Posts Only WordPress Plugin.
Если кто-то хочет использовать разграничение доступа к файлам глобально, независимо от используемой темы, то можно использовать плагин WP Users Media.
