Как скрыть изображения из медиатеки от обычных пользователей?
Как администратору мне очень нравятся возможности медиаменеджера в WordPress 3.5.
Однако на много пользовательском сайте все пользователи видят все изображения в медиатеке - независимо от того, загружали они их или нет. Раньше можно было ограничить доступ через скрипт в functions.php
.
Например:
// Скрыть вкладку Медиатека для каждого отдельного агента
function remove_medialibrary_tab($tabs) {
if ( !current_user_can( 'update_core' ) ) {
unset($tabs['library']);
return $tabs;
} }
add_filter('media_upload_tabs','remove_medialibrary_tab');
Этот код больше не работает, так как медиатека теперь работает на JavaScript.
Вопрос: как теперь скрыть или ограничить доступ к изображениям в медиатеке WordPress 3.5 для пользователей, которые не загружали эти изображения? Мне нужно, чтобы пользователи видели только свои изображения или только те, которые они загрузили для конкретного поста или страницы.
Текущая структура отлично подходит для газет, которые хотят делиться изображениями со всей организацией, но не очень хороша для сайтов с более строгими требованиями к независимому доступу нескольких пользователей.
Я не программист или в лучшем случае любитель - но мне кажется, что возможные варианты включают: скрытие или удаление всех фильтров вложений в новом выпадающем меню медиатеки 3.5, оставив только "загруженные на эту страницу" - или возможно переключатель, который позволит администраторам включать/выключать видимость медиатеки для обычных пользователей.
Буду благодарен за любые рекомендации или указания по этому вопросу.
Чтобы разрешить текущим пользователям просматривать только свои загруженные вложения, добавьте следующий код в actions вашей темы:
add_filter( 'posts_where', 'devplus_wpquery_where' );
function devplus_wpquery_where( $where ){
global $current_user;
if( is_user_logged_in() ){
// авторизованный пользователь, но просматриваем ли мы медиабиблиотеку?
if( isset( $_POST['action'] ) && ( $_POST['action'] == 'query-attachments' ) ){
// здесь вы можете добавить дополнительную логику, если необходимо
$where .= ' AND post_author='.$current_user->data->ID;
}
}
return $where;
}
Надеюсь, это поможет!

Перепробовал множество вариантов для работы этого на фронтенде с ACF. Это первый, который реально сработал для меня. Отличное решение! Спасибо!

Спасибо @timocouckuyt, это работает отлично, но вам также понадобится этот код для ссылки /wp-admin/upload.php :
add_filter('pre_get_posts', 'hide_posts_media_by_other');
function hide_posts_media_by_other($query) {
global $pagenow;
if( 'upload.php' != $pagenow || !$query->is_admin ){
return $query;
}
if( !current_user_can( 'manage_options' ) ) {
global $user_ID;
$query->set('author', $user_ID );
}
return $query;
}
Для полного руководства по скрытию медиафайлов и записей других пользователей, пожалуйста, ознакомьтесь с этим руководством: http://jeffreycarandang.com/tutorials/hide-wordpress-posts-media-uploaded-users/
С уважением, phpbits

исходная ссылка: https://www.wpexplorer.com/disable-image-page/
Перенаправление с помощью пользовательской функции
<?php
// Скрываем вложения от просмотра на фронтенде, перенаправляя пользователей
function hide_my_attachments_by_redirecting() {
if ( is_attachment() ) {
global $post;
if ( $post && $post->post_parent ) {
wp_redirect( esc_url( get_permalink( $post->post_parent ) ), 301 );
exit;
} else {
wp_redirect( esc_url( home_url( '/' ) ), 301 );
exit;
}
}
}
add_action( 'template_redirect', 'hide_my_attachments_by_redirecting' );
ИЛИ
Перенаправление через файл image.php
Ваш второй вариант — полностью отключить страницы вложений, добавив перенаправление WordPress непосредственно в начало файла image.php.
- Создайте новый файл с именем image.php в вашей дочерней теме (всегда лучше работать с дочерними темами при редактировании темы) или, если вы разрабатываете собственную тему, создайте пустой файл image.php в вашей теме.
- Вставьте приведенный ниже код в ваш файл image.php.
<?php
global $post;
if ( $post && $post->post_parent ) {
wp_redirect( esc_url( get_permalink( $post->post_parent ) ), 301 );
exit;
} else {
wp_redirect( esc_url( home_url( '/' ) ), 301 );
exit;
}
