Почему get_posts показывает результаты только для администраторов или пользователей, вышедших из системы?

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

Я использую вызов get_posts() с такими аргументами:

array(6) {
    ["include"]=> string(14) "1633,1634,1635"
    ["post_status"]=> string(3) "any"
    ["post_type"]=> string(10) "attachment"
    ["post_mime_type"]=> string(5) "image"
    ["order"]=> string(3) "ASC"
    ["orderby"]=> string(8) "post__in"
}

Когда выйдено или залогинен как Администратор, это работает нормально и возвращает объекты для 3 изображений. Однако, когда пользователь просто Подписчик/Автор/Редактор/Участник, это возвращает пустой массив.

Все плагины включены/выключены не делают разницы.

Когда переключаю тему на официальную тему WP, ошибка больше не воспроизводится.

Я сбросил все хуки, используя это (один залогинен как подписчик, другой как администратор), но не нахожу значительных различий. Случай A / Случай B. Я предполагал, что тема изменяет мои аргументы в такой степени, что для измененного запроса нет результатов. Если это все еще так, как и где это должно происходить?

Тема – Javo Directory.

Попробуйте использовать новый WP_Query, когда вы используете get_posts, вы используете основной WP_Query, у которого есть хуки, которые могут использовать другие плагины для изменения запроса. Еще одно, что я заметил, это то, что вы используете ключ include, который недействителен.

$my_query = new WP_Query( array(
  'post__in'       => array( 1633, 1634, 1635 ),
  'post_status'    => 'any',
  'post_type'      => 'attachment',
  'post_mime_type' => 'image',
  'order'          => 'ASC',
  'orderby'        => 'post__in'
) );

Вы можете использовать wp_set_current_user($user_id); перед вызовом get_posts(), чтобы установить желаемого пользователя, т.е. пользователя с достаточными привилегиями. Смотрите: https://codex.wordpress.org/Function_Reference/wp_set_current_user

У меня была такая же проблема. В моем случае это было очень банально решить: Я использовал W3C Total Cache на этом сайте.

Производительность > “Очистить все кеши”, и запрос получил свои самые новые результаты…

Ответ или решение

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

Проблемы с правами доступа

  1. Права доступа к файлам: В WordPress доступ к загружаемым аттачментам (например, изображениям) зависит от прав пользователя. Администраторы и неавторизованные пользователи имеют доступ ко всем ресурсам, тогда как участники с более низкими привилегиями (Подписчики, Авторы, Редакторы и Т. Д.) могут иметь ограниченный доступ. Убедитесь, что пользователь с этими ролями имеет необходимые права на просмотр медийных файлов.

  2. Функция current_user_can(): В вашем коде или в темы (тема Javo Directory) могут быть вызовы current_user_can(), которые ограничения запросов для определенных пользователей.

Особенности тем и плагинов

  1. Альтернирующие фильтры и хуки: Как вы упомянули, возможно, ваша тема или один из установленных плагинов изменяет параметры запроса. Это может привести к изменению SQL-запроса, фильтрующего результаты для менее привилегированных пользователей. Проверьте хуки, связанные с pre_get_posts, так как они могут влиять на вывод записей.

  2. Тема Javo Directory: Каждая тема имеет свой набор функций и фильтров. В частности, ваша проблема может заключаться в том, что Javo Directory имеет пользовательские обработки запросов, которые игнорируют некоторые аттачменты для менее привилегированных пользователей.

Проверка правильности вызова функции

  1. Ошибка в использования ключа ‘include’: Ваша первоначальная реализация использует 'include', что не является допустимым параметром для get_posts(). Вам следует использовать 'post__in', что соответствует массиву идентификаторов записей. Это может объяснить, почему при использовании WP_Query с правильными параметрами результаты отображаются, даже для менее привилегированных пользователей.

    $my_query = new WP_Query(array(
        'post__in' => array(1633, 1634, 1635),
        'post_status' => 'any',
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'order' => 'ASC',
        'orderby' => 'post__in',
    ));

Кеширование

  1. Проблемы с кешированием: Ошибка, связанная с кэшированием, также может мешать обновлению данных. Если вы используете плагин кэширования, такой как W3 Total Cache, попробуйте выполнить полную очистку кэша. Это позволит сбросить устаревшие данные и вернуть актуальные результаты.

Заключение

Исходя из вышесказанного, проблема с выводом результатов get_posts() для пользователей с различными правами может быть вызвана правами доступа, настройками темы и плагинов, ошибками в запросах, а также проблемами с кешированием. Убедитесь, что все компоненты вашей установки WordPress настроены правильно, а конфликты с другими плагинами или темами исключены.

Для получения дополнительных сведений об использовании функций и настройках прав доступа обращайтесь к официальной документации WordPress.

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

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