Такое ощущение, что половина учебников по Кодексу и вокруг блогосферы используют query_posts()
, а другая половина WP_Query
. Почему так?
Такое ощущение, что половина учебников по Кодексу и вокруг блогосферы используют query_posts()
, а другая половина WP_Query
. Почему так?
Есть два разных контекста для циклов:
Проблема с
query_posts ()
заключается в том, что это вторичный цикл, который пытается быть основным и с треском проваливается. Таким образом, забудьте, что он существует.Для модификации основного цикла
query_posts()
pre_get_posts
с проверкой$query->is_main_query()
Для запуска дочерних циклов
Используйте
new WP_Query
илиget_posts()
.Для очистки
Используйте
wp_reset_query()
если вы использовалиquery_posts ()
или напрямую связались с глобальным$ wp_query
.Используйте
wp_reset_postdata()
если вы использовалиthe_post ()
илиsetup_postdata ()
или перепутались с глобальным$ post
и вам необходимо восстановить начальное состояние вещей, связанных с публикацией.Например, вам не нужна нумерация страниц или липкие посты вверху — в этих случаях get_posts() более эффективен.
Существуют допустимые сценарии использования
query_posts($query)
, например:Вы хотите отобразить список постов или постов пользовательского типа на странице (используя шаблон страницы)
Вы хотите, чтобы эти посты работали
Теперь, почему вы хотите отобразить его на странице вместо использования шаблона архива?
Это более интуитивно понятно для администратора (вашего клиента?) — они могут видеть страницу в разделе «Страницы»
Лучше добавить его в меню (без страницы им бы пришлось добавить URL-адрес напрямую)
Если вы хотите отобразить дополнительный контент (текст, миниатюру поста или любой другой мета контент) в шаблоне, вы можете легко получить его со страницы (и все это имеет больше смысла и для клиента). Посмотрите, использовали ли вы шаблон архива, вам нужно либо жестко закодировать дополнительный контент, либо использовать, например, параметры темы / плагина (что делает его менее понятным для клиента)
Вот упрощенный пример кода (который будет на вашем шаблоне страницы — например, page-page-of-posts.php):
Также мы могли бы избежать использования здесь
query_posts()
и использовать вместо негоWP_Query
— например, так:Но зачем нам это делать, когда у нас есть такая приятная маленькая функция?
Это также можно сделать с помощью «pre_get_posts». Я сделал это, чтобы «статическая титульная страница» перечисляла мои собственные типы записей в произвольном порядке и с настраиваемым фильтром.
На самом деле это хук действия. Это повлияет на любой запрос.
На самом деле, это тоже не так. Функция
have_posts
выполняет итерацию объектаglobal $wp_query
, который не связан с основным запросом.global $wp_query;
также можно изменить с помощью вторичных запросов.На самом деле
WP_Query
является классом, поэтому у нас есть экземпляр класса.