Когда следует использовать WP_Query vs query_posts () vs get_posts ()?
-
-
Также проверьте этот [более подробный анализ] (http://wordpress.stackexchange.com/questions/226960/why-query-posts-isnt-marked-as-deprecated/248955#248955)Check also this [longer analysis](http://wordpress.stackexchange.com/questions/226960/why-query-posts-isnt-marked-as-deprecated/248955#248955)
- 1
- 2016-12-25
- prosti
-
7 ответ
- голосов
-
- 2010-09-13
-
query_posts()
слишком упрощен и проблемный способ изменить основной запрос страницы,заменив его новым экземпляром запроса. Это неэффективно (повторно запускает SQL-запросы) и в некоторых случаях может привести к сбою (особенно часто при работе с разбивкой на страницы). Любой современный код WP должен использовать более надежные методы,например использованиеpre_get_posts
для этой цели. TL; DR никогда не используйте query_posts () . -
get_posts()
очень похож по использованию и принимает те же аргументы (с некоторыми нюансами,такими как разные значения по умолчанию),но возвращает массив сообщений,не изменяет глобальные переменные и безопасно использовать где угодно. -
WP_Query
- это класс,который поддерживает оба сцены,но вы также можете создавать и работать с их собственным экземпляром. Немного сложнее,меньше ограничений,также безопасно использовать где угодно.
query_posts()
is overly simplistic and a problematic way to modify the main query of a page by replacing it with new instance of the query. It is inefficient (re-runs SQL queries) and will outright fail in some circumstances (especially often when dealing with posts pagination). Any modern WP code should use more reliable methods, like making use of thepre_get_posts
hook, for this purpose. TL;DR don't use query_posts() ever.get_posts()
is very similar in usage and accepts the same arguments (with some nuances, like different defaults), but returns an array of posts, doesn't modify global variables and is safe to use anywhere.WP_Query
is the class that powers both behind the scenes, but you can also create and work with your own instance of it. A bit more complex, fewer restrictions, also safe to use anywhere.
-
(1) «и безопасно использовать где угодно» ->,но не используйте это для цикла MAIN.(2) не забудьте использовать глобальную строку $ query_string;перед строкой,в которой есть query_posts ();(1) "and is safe to use anywhere" --> but do not use this for the MAIN loop. (2) remember to use global $query_string; before the line that has query_posts();
- 1
- 2011-02-19
- edelwater
-
@scribu,затем снова "get_posts" будет работать,хотя и не рекомендуется: http://core.trac.wordpress.org/ticket/16545@scribu then again 'get_posts' will work although not advised: http://core.trac.wordpress.org/ticket/16545
- 1
- 2011-02-19
- edelwater
-
Я считаю,что query_posts также менее эффективен в том смысле,что он будет запускать дополнительные запросы,когда,если вы используете только WP_Query для основного цикла,он будет запускать только тот запрос,который вы выбрали в WP_Query.I believe that `query_posts` is also less efficient in that it will run additional queries, when if you use only `WP_Query` for your main loop, it will only run the query you choose in WP_Query.
- 1
- 2011-08-08
- jjeaton
-
@jjeaton `query_posts ()` - это крошечная функция-оболочка для `WP_Query`,единственная дополнительная вещь,которую она делает (согласно блок-схеме) - это перезапись глобального` $ wp_query`@jjeaton `query_posts()` is tiny wrapper function for `WP_Query`, the only extra thing it does (as per flowchart) is overwriting global `$wp_query`
- 10
- 2011-08-08
- Rarst
-
@Rarst Я имел в виду [этот раздел Кодекса для запросов_постов] (http://codex.wordpress.org/Function_Reference/query_posts#Additional_SQL_Queries),однако я могу ошибаться относительно влияния на производительность.Если только использование WP_Query в файле шаблона не приведет к такому же результату (т.е. отбрасывание вашего запроса и повторное выполнение)@Rarst I was referring to [this section in the Codex for query_posts](http://codex.wordpress.org/Function_Reference/query_posts#Additional_SQL_Queries) however, I may be mistaken regarding the effect on performance. Unless using WP_Query in your template file will also have the same result (i.e. throwing away your query, and re-executing)
- 1
- 2011-08-08
- jjeaton
-
@jjeaton Замена query_posts () на WP_Query не повлияет на производительность,запрос исходной страницы все равно будет выполняться,потому что это часть основной нагрузки.Эти запросы будут выполняться,даже если в вашем файле шаблона вообще нет цикла.@jjeaton Replacing `query_posts()` with `WP_Query` will make no difference in performance, original page's query will still run because that is part of core load. Those queries will run even if your template file has no loop at all.
- 9
- 2011-08-08
- Rarst
-
Не могу избавиться от ощущения,что это самый гениальный и получивший одобрение пост на WPSE.Также должно быть в Кодексе.Can't get rid off the feeling that this the most genious and upvoted post on WPSE. Should be in Codex as well.
- 122
- 2011-09-16
- kaiser
-
Хорошо,посмотрев на это более чем достаточно времени,я думаю,что в query_posts () отсутствует статическая переменная,которая получает значениеtrue после первого использования и - если используется дважды - должна запускать `_doing_it_wrong ();`.Думаю,я собираюсь подслушать wp-hacker или парней по отслеживанию.Ok, after looking at it for more than quite a time, I think `query_posts()` is missing a static var that get's set to true after the first use and - if used twice - should trigger `_doing_it_wrong();`. Guess I'm going to bug the wp-hacker or trac guys about this.
- 1
- 2011-09-16
- kaiser
-
@kaiser ну ... использование `query_posts ()` дважды примерно так же плохо,как и один раз,не так важно,как для меня.:) Кстати,Эндрю Насин собирается делать презентацию по запросам,и он сказал,что может предложить некоторые улучшения к блок-схеме,поэтому вторая версия может появиться когда-нибудь в будущем.@kaiser well... using `query_posts()` twice is about as bad as once, doesn't matter much as for me. :) btw Andrew Nacin is going to do presentation on queries and he said he might propose some improvements to the flowchart, so version two might be coming some time in the future.
- 1
- 2011-09-16
- Rarst
-
Я просто добавлю свое самое четкое описание проблемы «производительности query_posts ()»: использование query_posts () или WP_Query в файле шаблона будет иметь такую же стоимость производительности: запрос,который вы только что выполнили.Проблема,обсуждаемая в статье кодекса,заключается в том,что если вы действительно хотите заменить запрос,вы должны сделать это,отфильтровав исходный query_posts () с помощью фильтраparse_query.Таким образом,у вас будет только один исходный желаемый запрос,а не выполнять второй запрос для его неудобной замены.query_posts () НИКОГДА НЕ ПУТЬ !!НИКОГДА!I'll just add my clearest description of the "performance of query_posts()" issue: Using query_posts() or WP_Query within a template file will have the same performnace cost: the query you just performed. The issue discussed in the codex article is that if you actually want to replace the query you should do so by filtering the original query_posts() with the 'parse_query' filter. That way you only have the one, original, desirable query, rather than doing a second query to awkwardly replace it. query_posts() is NEVER THE WAY!! NEVER!
- 9
- 2012-04-19
- jerclarke
-
При этом не упоминается фильтр «запрос»,который является отличным способом изменить основной запрос.Преимущество перед query_posts в том,что функция стирает исходный запрос и генерирует новый - так же,как если бы вы использовали WP_Query.Используя фильтр запроса,вы изменяете исходный запрос до его отправки.Я думаю,это то,о чем говорит @JeremyClarke выше.This makes no mention of the 'request' filter, which is a great way to modify the main query. The advantage over query_posts is that function wipes out the original query and generates a new one - same as if you used WP_Query. By using the request filter, your modifying the original query before its ever sent. I think thats what @JeremyClarke is getting at above.
- 1
- 2012-05-02
- eddiemoya
-
Есть чертовски крутое объяснение query_posts,написанное Джоном Джеймсом Джейкоби в блоге developer.wordpress.com,которое вытесняет все эти ответы из воды.Главное: `query_posts` вообще не * изменяет * основной цикл,он * заменяет * его * после * того,как он уже был запущен.Лучший способ изменить основной цикл - использовать фильтрpre_get_posts. http://developer.wordpress.com/2012/05/14/querying-posts-without-query_posts/There's a freaking awesome explanation of query_posts written by John James Jacoby on the developer.wordpress.com blog that blows all of these answers out of the water. The main point: `query_posts` doesn't *modify* the main loop at all, it *replaces* it *after* it has already run. The best way to modify the main loop is through a `pre_get_posts` filter. http://developer.wordpress.com/2012/05/14/querying-posts-without-query_posts/
- 23
- 2012-06-09
- Dan Gayle
-
@Dan,вы путаете техническую реализацию и цель.query_posts () действительно заменяет объект основного цикла,но его цель - изменить основной цикл.Также я очень люблю петлевые фильтры,но вопрос задавался не об этом.Есть дополнительный вопрос от другого человека по этой теме.@Dan you are confusing technical implementation and purpose. `query_posts()` does replace main loop object, but the purpose of it is to modify main loop. Also I am warmly fond of loop filters, but that wasn't what question asked. There is follow up question from other person on that topic.
- 3
- 2012-06-10
- Rarst
-
Был задан вопрос: «Когда следует использовать ... query_posts ()»,и,согласно логике,представленной в этом сообщении в блоге и комментариях выше,ответ,скорее всего,никогда не будет.The question was "When should you use... query_posts()" and according to the logic presented by that blog post and the comments above, the answer is likely never.
- 2
- 2012-06-11
- Dan Gayle
-
Итак,если все так плохо,почему существует `query_posts`?so, if its so bad, why does `query_posts` exist?
- 2
- 2012-09-10
- Manny Fleurmond
-
@Manny Fleurmond концептуально query_posts () - это попытка упростить основные концепции цикла до уровня тега шаблона темы (простота которого является одной из сильных сторон популярности WP).Задача оказалась слишком сложной,чтобы тег шаблона мог ее выполнить.Разработчики ядра озвучили возможность его устаревания,но я не думаю,что решение по этому поводу еще было принято.@Manny Fleurmond conceptually `query_posts()` is an attempt to dumb down main loop concepts to the level of theme template tag (ease of which is one of the strong points for WP popularity). The task simply turned out to be too much for template tag to possibly accomplish. Core developers did voice possibility of it getting deprecated but I don't think there was decision about that yet.
- 1
- 2012-09-10
- Rarst
-
На самом деле вы не можете «использовать где угодно» WP_Query (),я только что попробовал,но он все еще хрипит в $thequery-> have_posts (),бесконечная рекурсия,см. Http://wordpress.stackexchange.com/questions/34270You actually can't "use anywhere" the WP_Query(), i just tried and it still croaks at $thequery->have_posts(), infinite recursion, see http://wordpress.stackexchange.com/questions/34270
- 1
- 2014-10-21
- NoBugs
-
@NoBugs цикл в этом вопросе неверен,и есть ответ,объясняющий,почему.@NoBugs the loop in that question is wrong and there is answer explaining why.
- 1
- 2014-10-21
- Rarst
-
Спасибо за это.Наконец,кое-что обретает смысл.Серьезно,WordPress и их паршивая документация.Я не знаю,как такое запутанное программное обеспечение и плохие стандарты кодирования стали настолько популярными.Agghh thanks for this. Finally, something makes sense. Seriously, WordPress and their lousy documentation. I don't know how such convoluted software and bad coding standards became so popular.
- 1
- 2015-04-16
- racl101
-
Нашел этот тест скорости между wp_query иget_posts http://www.wpclocked.com/Found this speed test between wp_query and get_posts http://www.wpclocked.com/
- 1
- 2015-07-18
- Anagio
-
Я бы доверился такому тесту ... точно никому.:) Функция - очень тонкая оболочка,любая разница будет происходить из-за небольшой разницы в аргументах и/или хуках.I would trust such test... exactly none. :) The function is a _very_ thin wrapper, any difference will be coming from slight difference in arguments and/or hooks.
- 1
- 2015-07-19
- Rarst
-
Никаких эмоций,query_posts () - это функция с побочными эффектами: установка глобального.WordPress поражен функциями с побочными эффектами.Это не проблема производительности,а проблема качества кода.Посмотрите https://developer.wordpress.org/reference/functions/query_posts/и посмотрите,что делает query_posts.Используйте WP_Query,если вы не хотите испортить глобальные переменные.No need for emotions, query_posts() is a function with side effects: setting a global. WordPress is staggerd with functions with side effects. This is not a performance issue but a quality of code issue. Look at https://developer.wordpress.org/reference/functions/query_posts/ and see what query_posts does. Use WP_Query unless you want to mess up global variables.
- 0
- 2020-03-14
- user718960
-
- 2015-06-18
query_posts
. Никогда не используйтеquery_posts
. Помимо того,что сказал @Rarst,действительно большая проблема сquery_posts
заключается в том,что он нарушает основной объект запроса (хранящийся в$ wp_query
). Многие плагины и пользовательский код полагаются на основной объект запроса,поэтому нарушение основного объекта запроса означает,что вы нарушаете функциональность плагинов и пользовательского кода. Одна из таких функций - это важная функция разбивки на страницы,поэтому,если вы нарушите основной запрос,вы нарушите разбиение на страницы.Чтобы доказать,насколько плох
query_posts
в любом шаблоне,сделайте следующее и сравните результатыvar_dump ($ wp_query); query_posts ('& amp;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
икатегория
. Эти параметры действительно меняются на допустимые параметры для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
- You should never ever usequery_posts
. Apart from what @Rarst has said, the really big issue withquery_posts
is, it breaks the main query object ( stored in$wp_query
). A lot of plugins and custom code relies on the main query object, so breaking the main query object means that you are breaking the functionalities of plugins and custom code. Just one such function is the all important pagination function, so if you break the main query, you break pagination.To prove how bad
query_posts
is, on any template, do the following and compare the resultsvar_dump( $wp_query ); query_posts( '&posts_per_page=-1' ); var_dump( $wp_query );
get_posts
andWP_Query
are the correct way to construct secondary queries ( like related posts, sliders, featured contentand content on static front pages) with. It should be noted, you should not use any of the two in favor of the main query on the home page, single page or any type of archive page as it will break page functionality. If you need to modify the main query, usepre_get_posts
to do so, and not a custom query. (UPDATE: For static front pages and true pages, see Using pre_get_posts on true pages and static front pages*)In essence,
WP_Query
is used by the main query and is also used byget_posts
, but althoughget_posts()
usesWP_Query
, there are a few differencesget_posts
are faster thanWP_Query
. The margin depends on the amount of total posts of the site. The reason for this is,get_posts
passes'no_found_rows' => true
by default toWP_Query
which skips/legally breaks pagination. With'no_found_rows' => true
,WP_Query
gets the amount of posts queried, then bails out, where by default, it further search for all posts matching the query in order to calculate pagination.For this reason,
get_posts()
should be used for non paginated queries only. Paginatingget_posts
is really one big mess.WP_Query
should be used for all paginated queriesget_posts()
aren't influenced by theposts_*
filters whereWP_Query
gets influenced by these filters. The reason is thatget_posts
, by default, passes'suppress_filters' => true
toWP_Query
get_posts
has a couple of extra parameters likeinclude
,exclude
,numberposts
andcategory
. These parameters do get changed into valid parameters forWP_Query
before being passed toWP_Query
.include
gets changed intopost__in
,exclude
intopost__not_in
,category
intocat
andnumberposts
intoposts_per_page
. Just a note, all of the parameters that can be passed toWP_Query
works withget_posts
, you can ignore and not use the default parameters ofget_posts
get_posts
returns just the$posts
property ofWP_Query
whileWP_Query
returns the complete object. This object is quite useful when it comes to conditionals, pagination and other useful info that can be used inside the loop.get_posts
doesn't use the loop, but aforeach
loop to display posts. Also, no template tags are available by default.setup_postdata( $post )
has to be used to make the template tags available.WP_Query
uses the loop and template tags are available by defaultget_posts
passes'ignore_sticky_posts' => 1
toWP_Query
, soget_posts
by default ignores sticky posts
Based on the above, whether to use
get_posts
orWP_Query
is up to you and what do you actually need from the query. The above should guide you in your choice-
Я хотел бы иметь любимые ответы.Это многое объясняет.I wish I could favorite answers. This explains so much.
- 2
- 2017-06-12
- Athoxx
-
Отличное объяснение! «get_posts () следует использовать только для запросов без разбивки на страницы. Пагинацияget_posts на самом деле представляет собой большой беспорядок. WP_Query следует использовать для всех запросов с разбивкой на страницы» Это практически все,что кому-то нужно знатьimo.Great Explanation! "get_posts() should be used for non paginated queries only. Paginating get_posts is really one big mess. WP_Query should be used for all paginated queries" Is basically all someone needs to know imo.
- 2
- 2018-04-19
- Bullyen
-
- 2010-09-13
Основное отличие состоит в том,что
query_posts()
действительно только для изменения текущего цикла.Как только вы закончите,необходимо сбросить цикл и отправить его по своему усмотрению.Этот метод также немного легче понять,просто потому,что ваш «запрос» - это в основном строка URL,которую вы передаете функции,например:query_posts('meta_key=color&meta_value=blue');
С другой стороны,
WP_Query
- это скорее инструмент общего назначения,и он больше похож на непосредственное написание запросов MySQL,чем наquery_posts()
.Вы также можете использовать его где угодно (не только в цикле),и он не мешает никаким текущим почтовым запросам.Я обычно чаще использую
WP_Query
.На самом деле,это будет зависеть от вашего конкретного случая.The basic difference is that
query_posts()
is really only for modifying the current Loop. Once you're done it's necessary to reset the loop and send it on its merry way. This method is also a little easier to understand, simply because your "query" is basically a URL string that you pass to the function, like so:query_posts('meta_key=color&meta_value=blue');
On the other hand,
WP_Query
is more of a general purpose tool, and is more like directly writing MySQL queries thanquery_posts()
is. You can also use it anywhere (not just in the Loop) and it doesn't interfere with any currently running post queries.I tend to use
WP_Query
more often, as it happens. Really, it's going to come down to your specific case. -
- 2013-07-13
Нет необходимости использовать
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
.There is simply no need to use
query_posts()
. All it does is instantiates a new WP_Query object and reassigns that new object toglobal wp_query
.For reference, the following is that actual
query_posts()
function.function query_posts($query) { $GLOBALS['wp_query'] = new WP_Query(); return $GLOBALS['wp_query']->query($query); }
Instantiate your own WP_Query object if you want to create an in depth custom query script. Or use
get_posts()
if all you need to do is some light manipulation here and there.In either case, I highly recommend doing yourself a favor and going to
wp_includes/query.php
and perusing theWP_Query
class. -
- 2013-07-08
Убедитесь,что вы используете
wp_reset_query()
после использованияquery_posts()
,потому что это также повлияет на другие результаты запроса.Make sure that you use
wp_reset_query()
after usingquery_posts()
because it will affect other query result also. -
-
- 2017-07-19
- query_posts () : может использоваться в одном-единственном случае,если вам нужно изменить основнойзапрос.Он устанавливает множество глобальных переменных;
- get_posts () : он очень похож по механике и принимает те же аргументы,но возвращает массивсообщений
- WP_Query : вы можете создавать собственные объекты и работать с ними.Немного сложнее,меньше ограничений,безопасно использовать где угодно.
- query_posts(): might be used in one and only case if you need to modify main query . It sets a lot of global variables;
- get_posts(): it is very similar in mechanics and accepts same arguments, but returns array of posts
- WP_Query: you can create and work with own object of it. Bit more complex, less restrictions, it is safe to use anywhere.
Похоже,половина руководств в Кодексе и в блогосфере использует
query_posts ()
и наполовину используютWP_Query код>
.В чем дело?