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

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

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

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

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

Библиотека медиафайлов в 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 );
}
Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

Комментарии 1

  • Илья Волков16 апреля 2016 в 13:04 #

    Alt к картинкам в WP предусмотрен, а вот title - нет.

    Как сделать, чтобы под каждую картинку было поле где можно указать title?

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Да, точно)

  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.