Вопрос или проблема
Я использую действие ‘pre_get_posts’ для фильтрации медиа, чтобы авторы видели только те, которые загружены ими или другими авторами. Я добился правильного результата на странице медиа с этим кодом
add_action( 'pre_get_posts', 'coapp_restrict_media_library' );
function coapp_restrict_media_library( $query ) {
if( current_user_can('edit_pages') ) { return; }
$query->set('author__in', $ids );
}
Но это недостаточно конкретно, поэтому это влияет на другие запросы и ломает другие части моего сайта. Поэтому я пытался добавить условие, чтобы оно могло нацеливаться только на правильный вызов.
add_action( 'pre_get_posts', 'coapp_restrict_media_library' );
function coapp_restrict_media_library( $query ) {
if( current_user_can('edit_pages') ) { return; }
$post_type = $query->get('post_type');
$array = ['acf-taxonomy','acf-post-type','acf-ui-options-page'];
error_log('pre_get_post'); //проверить, срабатывает ли действие
if( in_array( $post_type, $array ) ){
error_log('change author in'); //проверить, выполнено ли условие
$query->set('author__in', $ids );
}
error_log( print_r($query, true) ); //проверить состояние запроса в конце
}
С этим кодом я получаю все медиа, ничего не фильтруется, и когда я проверяю error_log, я вижу ‘pre_get_post’, ‘change author in’ и массив запроса с идентификаторами автора в подмассиве author__in. Так что запрос изменен, но результаты нет.
Кто-нибудь имеет идеи, что может вызывать такое поведение?
Дополнительная заметка, я пробовал разные условия (is_admin(), $_REQUEST[‘action’] != ‘query-attachments’, …) но всегда получал один и тот же результат.
Просмотр медиа в виде сетки или списка ничего не меняет, так же как изменение приоритета функции.
Также я использую плагины ACF pro и filebird, так что, возможно, они как-то мешают в моем втором примере, но не в первом …
Проблема, похоже, возникает из-за того, что хуки pre_get_posts
, которые вы используете для фильтрации запросов библиотеки медиа, могут также влиять на другие запросы, и ваше условие фильтрации не нацеливается на точный запрос, который вы пытаетесь изменить. Вот подробный анализ и решение:
Ключевые моменты для рассмотрения:
- Правильное ограничение запроса: Убедитесь, что ваш фильтр
pre_get_posts
применяется только к запросу библиотеки медиа. - Проверьте
is_admin()
и специфические запросы к медиа: Запросы библиотеки медиа могут иметь специфические индикаторы, такие какis_admin()
и$_REQUEST['action'] == 'query-attachments'
. - Влияние плагинов: ACF Pro и FileBird могут вмешиваться, добавляя свои собственные хуки или изменяя запросы.
Обновленный код
Вот улучшенная версия вашей функции, чтобы правильно ограничить ее:
add_action( 'pre_get_posts', 'coapp_restrict_media_library' );
function coapp_restrict_media_library( $query ) {
// Применять фильтр только в административной области для AJAX-запросов библиотеки медиа
if ( ! is_admin() || ! isset( $_REQUEST['action'] ) || $_REQUEST['action'] !== 'query-attachments' ) {
return;
}
// Избегайте фильтрации запросов для пользователей с более высокими правами
if ( current_user_can('edit_pages') ) {
return;
}
// Проверьте, является ли это запросом библиотеки медиа
$post_type = $query->get('post_type');
if ( $post_type === 'attachment' ) {
error_log('change author__in'); // Лог для отладки
$query->set( 'author__in', [ get_current_user_id() ] ); // Замените $ids на ID текущего пользователя для простоты
}
error_log( print_r( $query, true ) ); // Лог для отладки
}
Объяснение изменений:
-
Нацеливание на запросы библиотеки медиа:
$_REQUEST['action'] === 'query-attachments'
обеспечивает выполнение этого кода только для AJAX-запросов библиотеки медиа.is_admin()
гарантирует выполнение фильтра только в административной панели WordPress.
-
Ограничение к вложениям:
- Условие
$post_type === 'attachment'
проверяет, является ли запрос запросом для типа постаattachment
, который соответствует запросам библиотеки медиа.
- Условие
-
Замените
$ids
наget_current_user_id()
:- Оригинальный
$ids
был не определен в вашем фрагменте кода. Если вы хотите ограничить медиа для текущего пользователя, вы можете использоватьget_current_user_id()
.
- Оригинальный
-
Логирование ошибок:
- Логи такие как
error_log('change author__in');
иerror_log( print_r( $query, true ) );
помогают отладить запрос.
- Логи такие как
Шаги по отладке:
-
Проверьте изменение запроса:
- Используйте логи для проверки, правильно ли устанавливается параметр
author__in
в запросе.
- Используйте логи для проверки, правильно ли устанавливается параметр
-
Временно отключите плагины:
- Временно отключите ACF Pro и FileBird, чтобы подтвердить, мешают ли они запросам медиа.
-
Проверьте запрос AJAX:
- Откройте инструменты разработчика браузера, перейдите на вкладку “Сеть” и проверьте параметры запроса
query-attachments
, чтобы убедиться, что запрос AJAX соответствует условию.
- Откройте инструменты разработчика браузера, перейдите на вкладку “Сеть” и проверьте параметры запроса
Возможное вмешательство плагинов:
-
ACF Pro или FileBird:** Эти плагины могут подключаться к
pre_get_posts
или изменять запросы библиотеки медиа. Если это подтвердится, вам, возможно, придется приоритизировать ваш хук, изменив приоритет:add_action( 'pre_get_posts', 'coapp_restrict_media_library', 20 );
-
В качестве альтернативы проверьте наличие конфликтов в их документации или форумах поддержки.
Этот код должен решить вашу проблему, правильно ограничивая фильтр pre_get_posts
для конкретного запроса библиотеки медиа. Дайте знать, если потребуется дальнейшая отладка!
Ответ или решение
Почему изменения в моем запросе не учитываются?
Вы столкнулись с проблемой, когда изменение в вашем запросе с использованием действия pre_get_posts
не ведет к ожидаемым результатам. Давайте подробно разберем вашу ситуацию и предложим возможные решения.
Ключевые моменты, испытывающие влияние на вашу проблему:
-
Правильный выбор области применения запроса: Убедитесь, что ваш фильтр
pre_get_posts
применяется только к запросу медиагалереи. -
Проверка условий
is_admin()
и специфических запросов: Запросы медиабиблиотеки могут иметь специфические индикаторы, например,is_admin()
и$_REQUEST['action'] == 'query-attachments'
. -
Возможное вмешательство плагинов: Плагины, такие как ACF Pro и FileBird, могут вмешиваться, добавляя свои хуки или модифицируя запросы.
Обновленный код
Вот улучшенная версия вашей функции с правильной областью применения:
add_action( 'pre_get_posts', 'coapp_restrict_media_library' );
function coapp_restrict_media_library( $query ) {
// Применяем фильтр только для AJAX-запросов медиабиблиотеки в админке
if ( ! is_admin() || ! isset( $_REQUEST['action'] ) || $_REQUEST['action'] !== 'query-attachments' ) {
return;
}
// Избегаем фильтрации для пользователей с высшими правами
if ( current_user_can('edit_pages') ) {
return;
}
// Проверяем, что это запрос на медиабиблиотеку
$post_type = $query->get('post_type');
if ( $post_type === 'attachment' ) {
error_log('change author__in'); // Логирование для отладки
$query->set( 'author__in', [ get_current_user_id() ] ); // Используем текущий ID пользователя для упрощения
}
error_log( print_r( $query, true ) ); // Логирование состояния запроса
}
Объяснение изменений:
-
Целевое обращение к запросам медиабиблиотеки:
- Условие
$_REQUEST['action'] === 'query-attachments'
гарантирует, что код выполняется только для AJAX-запросов медиабиблиотеки. is_admin()
гарантирует, что фильтр выполняется только в панели администратора WordPress.
- Условие
-
Ограничение до вложений:
- Условие
$post_type === 'attachment'
проверяет, что запрос относится к типам постов, соответствующим медиабиблиотеке.
- Условие
-
Замена
$ids
наget_current_user_id()
:- Переменная
$ids
была неопределенной в вашем коде. Если вы хотите ограничить доступ к медиа текущему пользователю, можете использоватьget_current_user_id()
.
- Переменная
-
Логирование:
- Логи, такие как
error_log('change author__in');
, помогают отладки запроса.
- Логи, такие как
Шаги для отладки:
-
Проверка изменений в запросе:
- Используйте логи для подтверждения правильной установки параметра
author__in
в запросе.
- Используйте логи для подтверждения правильной установки параметра
-
Временное отключение плагинов:
- Временно деактивируйте ACF Pro и FileBird, чтобы убедиться, не мешают ли они запросам медиабиблиотеки.
-
Подтверждение AJAX-запроса:
- Откройте средства разработчика браузера, перейдите на вкладку "Сеть" и проверьте параметры запроса для
query-attachments
, чтобы удостовериться, что AJAX-запрос соответствует условиям.
- Откройте средства разработчика браузера, перейдите на вкладку "Сеть" и проверьте параметры запроса для
Возможное вмешательство плагинов:
- ACF Pro и FileBird: Эти плагины могут вмешиваться в
pre_get_posts
или изменять запросы медиабиблиотеки. Если это подтвердится, вам может понадобиться изменить приоритет вашего хука:
add_action( 'pre_get_posts', 'coapp_restrict_media_library', 20 );
Эти изменения помогут решить проблему, правильно ограничив фильтр pre_get_posts
только определенным запросом медиабиблиотеки. Если необходимо больше отладочных мероприятий, пожалуйста, дайте знать!