Почему изменение в моем запросе не учитывается?

Вопрос или проблема

Я использую действие ‘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, которые вы используете для фильтрации запросов библиотеки медиа, могут также влиять на другие запросы, и ваше условие фильтрации не нацеливается на точный запрос, который вы пытаетесь изменить. Вот подробный анализ и решение:

Ключевые моменты для рассмотрения:

  1. Правильное ограничение запроса: Убедитесь, что ваш фильтр pre_get_posts применяется только к запросу библиотеки медиа.
  2. Проверьте is_admin() и специфические запросы к медиа: Запросы библиотеки медиа могут иметь специфические индикаторы, такие как is_admin() и $_REQUEST['action'] == 'query-attachments'.
  3. Влияние плагинов: 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 ) ); // Лог для отладки
}

Объяснение изменений:

  1. Нацеливание на запросы библиотеки медиа:

    • $_REQUEST['action'] === 'query-attachments' обеспечивает выполнение этого кода только для AJAX-запросов библиотеки медиа.
    • is_admin() гарантирует выполнение фильтра только в административной панели WordPress.
  2. Ограничение к вложениям:

    • Условие $post_type === 'attachment' проверяет, является ли запрос запросом для типа поста attachment, который соответствует запросам библиотеки медиа.
  3. Замените $ids на get_current_user_id():

    • Оригинальный $ids был не определен в вашем фрагменте кода. Если вы хотите ограничить медиа для текущего пользователя, вы можете использовать get_current_user_id().
  4. Логирование ошибок:

    • Логи такие как error_log('change author__in'); и error_log( print_r( $query, true ) ); помогают отладить запрос.

Шаги по отладке:

  1. Проверьте изменение запроса:

    • Используйте логи для проверки, правильно ли устанавливается параметр author__in в запросе.
  2. Временно отключите плагины:

    • Временно отключите ACF Pro и FileBird, чтобы подтвердить, мешают ли они запросам медиа.
  3. Проверьте запрос 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 не ведет к ожидаемым результатам. Давайте подробно разберем вашу ситуацию и предложим возможные решения.

Ключевые моменты, испытывающие влияние на вашу проблему:

  1. Правильный выбор области применения запроса: Убедитесь, что ваш фильтр pre_get_posts применяется только к запросу медиагалереи.

  2. Проверка условий is_admin() и специфических запросов: Запросы медиабиблиотеки могут иметь специфические индикаторы, например, is_admin() и $_REQUEST['action'] == 'query-attachments'.

  3. Возможное вмешательство плагинов: Плагины, такие как 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 ) ); // Логирование состояния запроса
}

Объяснение изменений:

  1. Целевое обращение к запросам медиабиблиотеки:

    • Условие $_REQUEST['action'] === 'query-attachments' гарантирует, что код выполняется только для AJAX-запросов медиабиблиотеки.
    • is_admin() гарантирует, что фильтр выполняется только в панели администратора WordPress.
  2. Ограничение до вложений:

    • Условие $post_type === 'attachment' проверяет, что запрос относится к типам постов, соответствующим медиабиблиотеке.
  3. Замена $ids на get_current_user_id():

    • Переменная $ids была неопределенной в вашем коде. Если вы хотите ограничить доступ к медиа текущему пользователю, можете использовать get_current_user_id().
  4. Логирование:

    • Логи, такие как error_log('change author__in');, помогают отладки запроса.

Шаги для отладки:

  1. Проверка изменений в запросе:

    • Используйте логи для подтверждения правильной установки параметра author__in в запросе.
  2. Временное отключение плагинов:

    • Временно деактивируйте ACF Pro и FileBird, чтобы убедиться, не мешают ли они запросам медиабиблиотеки.
  3. Подтверждение AJAX-запроса:

    • Откройте средства разработчика браузера, перейдите на вкладку "Сеть" и проверьте параметры запроса для query-attachments, чтобы удостовериться, что AJAX-запрос соответствует условиям.

Возможное вмешательство плагинов:

  • ACF Pro и FileBird: Эти плагины могут вмешиваться в pre_get_posts или изменять запросы медиабиблиотеки. Если это подтвердится, вам может понадобиться изменить приоритет вашего хука:
add_action( 'pre_get_posts', 'coapp_restrict_media_library', 20 );

Эти изменения помогут решить проблему, правильно ограничив фильтр pre_get_posts только определенным запросом медиабиблиотеки. Если необходимо больше отладочных мероприятий, пожалуйста, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...