Когда вы должны использовать wp_query vs Query_posts () vs get_posts ()?
-
16-10-2019 - |
Вопрос
Кажется половиной учебников в Кодекс и вокруг блогосферной использования query_posts()
и наполовину использование WP_Query
. Анкет В чем дело?
Решение
query_posts()
является слишком упрощенным и проблемным способом изменения основного запроса страницы, заменив ее новым экземпляром запроса. Это неэффективно (перезагрузка запросов SQL) и в некоторых обстоятельствах отключится (особенно часто при работе с постами о странице). Любой современный код WP должен использовать более надежные методы, такие как использованиеpre_get_posts
Крюк, для этой цели. TL; DR Не используйте Query_posts () когда -либо.get_posts()
очень похож на использование и принимает те же аргументы (с некоторыми нюансами, как различные значения по умолчанию), но возвращает массив постов, не изменяет глобальные переменные и безопасен для использования в любом месте.WP_Query
это класс, который поддерживает как за кулисами, но вы также можете создавать и работать со своим собственным экземпляром. Немного сложнее, меньше ограничений, также безопасных для использования в любом месте.
Другие советы
query_posts
- Вы никогда не должны использовать query_posts
. Анкет Помимо того, что сказал @Rarst, действительно большая проблема с query_posts
это, он нарушает основной объект запроса (хранится в $wp_query
) Многие плагины и пользовательский код опираются на основной объект запроса, поэтому нарушение основного объекта запроса означает, что вы нарушаете функции плагинов и пользовательского кода. Только одна из таких функций - это все важная функция страниц, поэтому, если вы нарушаете основной запрос, вы нарушаете страницу.
Чтобы доказать, как плохо query_posts
в любом шаблоне сделайте следующее и сравните результаты
var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );
get_posts
а также WP_Query
правильный способ построить второстепенный Запросы ( Как связанные посты, слайдеры, избранное контент и содержание на статических передних страницах ) с. Следует отметить, что вы не должны использовать ни одного из двух в пользу основного запроса на домашней странице, на одной странице или любой странице архива, поскольку он разорвет функциональность страницы. Если вам нужно изменить основной запрос, используйте pre_get_posts
Для этого, а не пользовательский запрос. (ОБНОВИТЬ: Для статических передних страниц и настоящих страниц см. Использование pre_get_posts на истинных страницах и статических передних страницах*)
По сути, WP_Query
используется основным запросом, а также используется get_posts
, но хотя get_posts()
Использование WP_Query
, есть несколько различий
get_posts
быстрее, чемWP_Query
. Анкет Маржа зависит от количества общих постов сайта. Причина этого вget_posts
проходы'no_found_rows' => true
по умолчаниюWP_Query
который пропускает/легально нарушает страницу. С'no_found_rows' => true
,WP_Query
Получает количество запрашиваемых постов, а затем выругается, где по умолчанию он дополнительно ищет все сообщения, соответствующие запросу для расчета страниц.По этой причине,
get_posts()
Следует использовать только для не страничных запросов. На стражеget_posts
действительно один большой беспорядок.WP_Query
следует использовать для всех страстных запросовget_posts()
не под влияниемposts_*
Фильтры гдеWP_Query
Пострадает под влиянием этих фильтров. Причина в том, чтоget_posts
, по умолчанию, проходит'suppress_filters' => true
кWP_Query
get_posts
имеет пару дополнительных параметров, таких какinclude
,exclude
,numberposts
а такжеcategory
. Анкет Эти параметры изменяются в действительные параметры дляWP_Query
Перед тем, как быть переданным вWP_Query
.include
превращается вpost__in
,exclude
вpost__not_in
,category
вcat
а такжеnumberposts
вposts_per_page
. Анкет Просто записка, все параметров, которые могут быть переданыWP_Query
работает сget_posts
, ты Можно игнорировать и не использовать параметры по умолчаниюget_posts
get_posts
возвращает только$posts
свойствоWP_Query
покаWP_Query
Возвращает полный объект. Этот объект весьма полезен, когда дело доходит до условных, страниц и другой полезной информации, которую можно использовать внутри цикла.get_posts
не использует петлю, ноforeach
петля для отображения сообщений. Кроме того, по умолчанию теги шаблонов не доступны.setup_postdata( $post )
должен использоваться, чтобы сделать теги шаблона доступными.WP_Query
Использование тегов цикла и шаблонов доступна по умолчаниюget_posts
проходы'ignore_sticky_posts' => 1
кWP_Query
, такget_posts
По умолчанию игнорируют липкие сообщения
На основе вышеизложенного, будь то get_posts
или же WP_Query
зависит от вас и что вам на самом деле нужно от запроса. Вышеуказанное должно направить вас на ваш выбор
Основное различие в том, что query_posts()
действительно только для изменения текущего цикла. Как только вы закончите, необходимо сбросить петлю и отправить его на его веселый путь. Этот метод также немного легче понять, просто потому, что ваш «запрос» - это в основном строка URL, которую вы передаете к функции, например, так:
query_posts('meta_key=color&meta_value=blue');
С другой стороны, WP_Query
это скорее инструмент общего назначения и больше похож на непосредственное написание запросов MySQL, чем query_posts()
является. Вы также можете использовать его в любом месте (не только в цикле), и это не мешает каким -либо в настоящее время работающим запросам.
Я склонен использовать WP_Query
чаще, как это происходит. На самом деле, это сводится к вашему конкретному делу.
Просто не нужно использовать query_posts()
. Анкет Все, что он делает, это создает новый объект wp_query и переназначает этот новый объект global wp_query
.
Для справки, следующее - это фактическое query_posts()
функция
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
Создайте свой собственный объект wp_query, если вы хотите создать глубокий пользовательский скрипт запроса. Или использовать get_posts()
Если все, что вам нужно сделать, это легкие манипуляции здесь и там.
В любом случае я настоятельно рекомендую сделать себе одолжение и пойти на wp_includes/query.php
и просматривать WP_Query
учебный класс.
Убедитесь, что вы используете wp_reset_query()
После использования query_posts()
Потому что это также повлияет на другие результаты запроса.
Если я помню, что читал правильно, по сути «петля» делает WP_Query
В основных файлах, но легче понять.
- Query_posts (): Может использоваться в одном и единственном случае, если вам нужно изменить основной запрос. Он устанавливает много глобальных переменных;
- get_posts (): Это очень похоже на механику и принимает одинаковые аргументы, но возвращает массив постов
- Wp_query: Вы можете создавать и работать с собственным объектом. Немного сложнее, меньше ограничений, его безопасно использовать где угодно.
Я бы сказал, не используй get_posts()
в плагине. В некоторых случаях он налагает очень ограничительные фильтры (SET suppress_filters
, ignore_sticky_posts
, и т. д.) и, вероятно, следует использовать только в теме, если вы хотите, чтобы что -то было сделано быстро.