Вопрос или проблема
Я использую вызов 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, и она возвращает результаты только для администраторов или незалогиненных пользователей, основная причина этого может заключаться в конфигурации прав доступа, запросах к базе данных или особенностях сред разработки. Рассмотрим более подробно возможные причины и решения данной проблемы.
Проблемы с правами доступа
-
Права доступа к файлам: В WordPress доступ к загружаемым аттачментам (например, изображениям) зависит от прав пользователя. Администраторы и неавторизованные пользователи имеют доступ ко всем ресурсам, тогда как участники с более низкими привилегиями (Подписчики, Авторы, Редакторы и Т. Д.) могут иметь ограниченный доступ. Убедитесь, что пользователь с этими ролями имеет необходимые права на просмотр медийных файлов.
-
Функция
current_user_can()
: В вашем коде или в темы (тема Javo Directory) могут быть вызовыcurrent_user_can()
, которые ограничения запросов для определенных пользователей.
Особенности тем и плагинов
-
Альтернирующие фильтры и хуки: Как вы упомянули, возможно, ваша тема или один из установленных плагинов изменяет параметры запроса. Это может привести к изменению SQL-запроса, фильтрующего результаты для менее привилегированных пользователей. Проверьте хуки, связанные с
pre_get_posts
, так как они могут влиять на вывод записей. -
Тема Javo Directory: Каждая тема имеет свой набор функций и фильтров. В частности, ваша проблема может заключаться в том, что Javo Directory имеет пользовательские обработки запросов, которые игнорируют некоторые аттачменты для менее привилегированных пользователей.
Проверка правильности вызова функции
-
Ошибка в использования ключа ‘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', ));
Кеширование
- Проблемы с кешированием: Ошибка, связанная с кэшированием, также может мешать обновлению данных. Если вы используете плагин кэширования, такой как W3 Total Cache, попробуйте выполнить полную очистку кэша. Это позволит сбросить устаревшие данные и вернуть актуальные результаты.
Заключение
Исходя из вышесказанного, проблема с выводом результатов get_posts()
для пользователей с различными правами может быть вызвана правами доступа, настройками темы и плагинов, ошибками в запросах, а также проблемами с кешированием. Убедитесь, что все компоненты вашей установки WordPress настроены правильно, а конфликты с другими плагинами или темами исключены.
Для получения дополнительных сведений об использовании функций и настройках прав доступа обращайтесь к официальной документации WordPress.