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

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

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

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

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

Библиотека медиафайлов в 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 );
}

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Комментарии — 2

Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.

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

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал