Как разрешить пользователям видеть только те медиафайлы в админке, которые они сами и загрузили

Когда вы открываете регистрацию на сайте и пускаете всех в админку, вам следует предусмотреть множество мелочей. Конечно тут всё зависит от целей, которые преследуются на сайте, но лично я столкнулся с ситуацией, когда от пользователей нужно было скрыть все медиафайлы, которые были загружены не ими (как правило это касается пользователей с правами автора и выше, потому как участники не видят медиафайлов вообще, а про подписчиков я и вовсе молчу).

Скрыть по сути нужно в двух местах — во всплывающем окне вставки медиафайла здесь:

Скрываем медиафайлы, загруженные другими пользователями из всплывающего окна медиазагрузчика.

И собственно в самой библиотеке тут:

Библиотека медиафайлов в WordPress.

Сейчас я покажу вам, как этого достичь — решение задачи сводится к простой вставке готового кода в functions.php.

add_filter( 'posts_where', 'true_hide_attachments_from_another_author' );
 
function true_hide_attachments_from_another_author( $where ){
    global $current_user;
 
    if( !current_user_can( 'administrator' ) // пользователь - не администратор, но можно это убрать
       && isset( $_POST['action'] ) // придётся использовать это условие, если не хотите получать Notices при включенном WP_DEBUG
       && $_POST['action'] == 'query-attachments') // вложения загружаются AJAX запросом, в котором POST-параметр action равен query-attachments
        $where .= ' AND post_author=' . $current_user->data->ID; // добавляем автора в SQL запрос
 
    return $where;
}

Есть и второй способ.

Этот способ более глобальный и затрагивает все запросы, а если убрать из него проверку is_admin(), то он ещё и на сайте вложения сможет попрятать. Но не беспокойтесь — из самих постов изображения не пропадут ни при каких случаях.

if( is_admin() ) // мы ведь только в админке скрываем, да?
    add_filter('parse_query', 'true_hide_attachments_2' );
 
function true_hide_attachments_2( $wp_query ) {
    global $current_user;
 
    if ( !current_user_can('administrator') // администраторов всё так же не трогаем
       && isset( $wp_query->query_vars['post_type'] ) // защищаемся от Notices 🙂
       && $wp_query->query_vars['post_type']=="attachment" ) // тип поста - вложения
        $wp_query->set( 'author', $current_user->data->ID );
}

Источник: misha.blog

Миша Рудрастых

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

Добавить комментарий

%d такие блоггеры, как: