Я хочу, чтобы пользователи могли загружать фотографии с помощью add_cap('upload_files')
, но на странице их профиля Медиатека показывает все загруженные изображения. Как я могу отфильтровать это, чтобы они могли просматривать только загруженные изображения?
Вот мое решение на данный момент… Я делаю простой запрос WP, затем зацикливаюсь на странице «Профиль» пользователя.
$querystr = " SELECT wposts.post_date,wposts.post_content,wposts.post_title, guid
FROM $wpdb->posts wposts
WHERE wposts.post_author = $author
AND wposts.post_type = 'attachment'
ORDER BY wposts.post_date DESC";
$pageposts = $wpdb->get_results($querystr, OBJECT);
Если вы нашли ответ на свою проблему, вам лучше добавить его как ответ ниже, а не в самом вопросе. Это лучше соответствует системе, и мы можем проголосовать за ваш ответ, что улучшит вашу репутацию на этом сайте.
wordpress.org/plugins/view-own-posts-media-only
Я действительно должен поддержать плагин «Просмотр собственных сообщений только в СМИ», он отлично сработал для меня после того, как я везде искал решение jquery или php/html/css.
Я разрешил загрузку файлов пользователям уровня подписчика. пытался использовать ваш код, но не работает.
«Не работает» — это еще не все.
Я могу подтвердить то же наблюдение. Для меня «не работает» означает, что роль «участник» по-прежнему может видеть все элементы мультимедиа, когда он загружает jpg. Однако когда он заходит в медиатеку из меню, там пусто. ( Моя роль «участник» уже имеет дополнительные возможности для загрузки файлов, и это работает. )
Таким образом, ваш код просто нужно настроить для любой страницы, которая заполняет вкладку «Медиатека» окна загрузки. Я изучаю это сейчас.
Если я правильно помню (и ошибки случаются), на момент написания этого ответа не было никаких подходящих крючков, подобно тому, как не было никаких крючков для исправления количества носителей. Однако с момента написания было выпущено 3 хороших новых версии WordPress, поэтому решения теперь могут быть возможны.
отличный фрагмент, но если в медиа-библиотеке нет элементов, он выдает ошибки. Предупреждение: array_sum() ожидает, что параметр 1 будет массивом, заданным null, и Предупреждение: array_keys() ожидает, что параметр 1 будет массивом, заданным null
Вам просто нужно определить $_num_posts как массив в функции fix_media_counts().
$_num_posts = array();
Код в этом ответе работает, но он также удаляет любые настраиваемые поля, созданные плагином Advanced Custom Fields.
Многое по теме: wordpress.stackexchange.com/questions/178236/…
Вы не должны использовать пользовательские уровни, они все еще в WordPress в основном для обратной совместимости (до WP 2.0), они ненадежны для определения возможностей пользователя в современном WordPress (поскольку они, вероятно, исчезнут из ядра, когда эта совместимость больше не требуется). ). Используйте фактическую возможность для определения прав пользователя.
Несмотря на то, что он содержит
media-upload.php
, ваш код не работает из модального окна загрузки, созданного на странице редактирования публикации. Все еще можно увидеть все элементы библиотеки.Существует
admin_init
хук, который запускается при каждом запросе администратора. В случае, если пользователь запрашивает upload.php, и вы хотите предотвратить это, вы можете либо заблокировать этот запрос (напримерwp_die('Access Denied')
), либо перенаправить в какое-то допустимое место для каждого хука.Вы всегда можете отфильтровать список медиа, используя
pre_get_posts
фильтр, который сначала определяет страницу и возможности пользователя, а также устанавливает параметр автора при выполнении определенных условий.Пример
Я использовал ограничение на удаление страниц в качестве условия, чтобы администраторы и редакторы по-прежнему видели полный список медиафайлов.
Есть один небольшой побочный эффект, для которого я не вижу никаких зацепок, и это связано с количеством вложений, показанным над списком мультимедиа (который по-прежнему будет показывать общее количество элементов мультимедиа, а не для данного пользователя — я бы считайте это незначительной проблемой, хотя).
Решил все же выложить, может пригодится.. 😉
Начиная с WP 3.7 есть гораздо лучший способ через
ajax_query_attachments_args
фильтр, как указано в документации :Вот полное решение как для постов, так и для медиа (этот код предназначен специально для авторов, но вы можете изменить его для любой роли пользователя). Это также исправляет количество постов/медиафайлов без взлома основных файлов.
Это модифицированная версия принятого ответа. Поскольку принятый ответ нацелен только на элемент меню «Медиа» слева, пользователи по-прежнему могут видеть всю медиатеку в модальном окне при загрузке фотографии в сообщение. Этот слегка измененный код исправляет эту ситуацию. Целевые пользователи будут видеть только свои собственные элементы мультимедиа на вкладке «Библиотека мультимедиа» модального окна, которое появляется в сообщении.
Это код из принятого ответа с комментарием, помечающим строку для редактирования…
Чтобы пользователи могли просматривать только свои собственные медиафайлы из меню «Медиа» И на вкладке «Медиатека» модального окна загрузки, замените указанную строку на эту…
( разрывы строк и интервалы вставлены здесь только для удобочитаемости )
Следующее то же самое, что и выше, но также ограничивает их просмотр собственных сообщений из пункта меню «Сообщения».
( разрывы строк и интервалы вставлены здесь только для удобочитаемости )
Примечания : как и в принятом ответе, счетчики сообщений и медиа будут неправильными. Однако в некоторых других ответах на этой странице есть решения для этого. Я не включал их просто потому, что не тестировал их.
Полный рабочий код. Единственная проблема заключается в неправильном количестве изображений в медиатеке на странице «Добавить сообщение».
У t31os есть отличное решение. Единственное, что количество всех сообщений все еще отображается.
Я нашел способ предотвратить отображение числа с помощью jQuery.
Просто добавьте это в свой файл функций.
Это работает для меня!
Я решил свою проблему довольно грубым, но работоспособным решением.
1) Я установил плагин WP Hide Dashboard, чтобы пользователь видел только ссылку на форму редактирования своего профиля.
2) В файле шаблона author.php я вставил код, который использовал выше.
3) Затем для авторизованных пользователей я отобразил прямую ссылку на страницу загрузки «wp-admin/media-new.php»
4) Следующая проблема, которую я заметил, заключалась в том, что после того, как они загрузили фотографию, она перенаправляла их на upload.php… и они могли видеть все остальные фотографии. Я не нашел хука на странице media-new.php, поэтому я взломал ядро «media-upload.php» и перенаправил их на страницу их профиля:
Затем заменили
wp_redirect( admin_url($location) );
наwp_redirect($userredirect);
Однако есть пара вопросов. Во-первых, вошедший в систему пользователь все еще может перейти к «upload.php», если он знает, что он существует. Они ничего не могут сделать, кроме ПОСМОТРЕТЬ файлы, и 99% людей даже не узнают об этом, но это все равно не оптимально. Во-вторых, он также перенаправляет администратора на страницу профиля после загрузки. Их можно довольно просто исправить, проверив роли пользователей и перенаправив только подписчиков.
Если у кого-то есть идеи о том, как подключиться к странице Media, не заходя в основные файлы, я был бы признателен. Спасибо!
Сохраните приведенный выше код как manage_your_media_only.php, заархивируйте его, загрузите как плагин на свой WP и активируйте его, вот и все.
Один из способов сделать это — использовать плагин Role Scoper, он также отлично подходит для управления очень специфическими ролями и возможностями. Фактически вы можете заблокировать доступ к изображениям в медиатеке только для тех, которые загружены каждым пользователем. Я использовал его для проекта, над которым я работаю в данный момент, и он работает хорошо.