Когда использовать WP_query (), query_posts () и pre_get_posts
-
-
Возможный дубликат [Когда следует использовать WP \ _Query vs query \ _posts () vsget \ _posts ()?] (Http://wordpress.stackexchange.com/questions/1753/when-should-you-use-wp-запрос-против-запрос-сообщения-против-получить-сообщения)Possible duplicate of [When should you use WP\_Query vs query\_posts() vs get\_posts()?](http://wordpress.stackexchange.com/questions/1753/when-should-you-use-wp-query-vs-query-posts-vs-get-posts)
- 4
- 2016-01-03
- dotancohen
-
@saltcod,теперь все по-другому,WordPress развивается,я добавил несколько комментариев по сравнению с принятым ответом [здесь] (http://wordpress.stackexchange.com/questions/50761/when-to-use-wp-query-query-posts-and-pre-get-posts/250523 # 250523).@saltcod, now is different, WordPress evolved, I added few comments in comparison to the accepted answer [here](http://wordpress.stackexchange.com/questions/50761/when-to-use-wp-query-query-posts-and-pre-get-posts/250523#250523).
- 0
- 2016-12-28
- prosti
-
5 ответ
- голосов
-
- 2012-05-01
Вы правильно сказали:
<цитата>Никогда больше не используйте
query_posts
pre_get_posts
pre_get_posts
- это фильтр для изменения любых запрос. Чаще всего используется для изменения только «основного запроса»:add_action('pre_get_posts','wpse50761_alter_query'); function wpse50761_alter_query($query){ if( $query->is_main_query() ){ //Do something to main query } }
(Я бы также проверил,что
is_admin()
возвращает false - хотя это может быть избыточным.). Основной запрос отображается в ваших шаблонах как:if( have_posts() ): while( have_posts() ): the_post(); //The loop endwhile; endif;
Если вам когда-нибудь понадобится отредактировать этот цикл - используйте
pre_get_posts
. т.е. если вы испытываете искушение использоватьquery_posts()
- используйте вместо негоpre_get_posts
.WP_Query
Основной запрос - это важный экземпляр
WP_Query object
. WordPress использует его,чтобы решить,например,какой шаблон использовать,и все аргументы,переданные в URL-адрес (например,разбиение на страницы),все направляются в этот экземпляр объектаWP_Query
.Для вторичных циклов (например,в боковых панелях или списках «связанных сообщений») вы захотите создать свой собственный отдельный экземпляр объекта
WP_Query
. Например.$my_secondary_loop = new WP_Query(...); if( $my_secondary_loop->have_posts() ): while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post(); //The secondary loop endwhile; endif; wp_reset_postdata();
Обратите внимание:
wp_reset_postdata();
- это потому,что вторичный цикл переопределит глобальную переменную$post
,которая идентифицирует «текущую запись». По сути,это сбрасывает его на$post
,в котором мы находимся.get_posts ()
По сути,это оболочка для отдельного экземпляра объекта
WP_Query
. Это возвращает массив объектов сообщения. Методы,использованные в приведенном выше цикле,вам больше не доступны. Это не «Цикл»,а просто массив объектов сообщения.<ul> <?php global $post; $args = array( 'numberposts' => 5, 'offset'=> 1, 'category' => 1 ); $myposts = get_posts( $args ); foreach( $myposts as $post ) : setup_postdata($post); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endforeach; wp_reset_postdata(); ?> </ul>
В ответ на ваши вопросы
- Используйте
pre_get_posts
,чтобы изменить основной запрос. Используйте отдельный объектWP_Query
(метод 2) для вторичных циклов на страницах шаблонов. - Если вы хотите изменить запрос основного цикла,используйте
pre_get_posts
.
You are right to say:
Never use
query_posts
anymorepre_get_posts
pre_get_posts
is a filter, for altering any query. It is most often used to alter only the 'main query':add_action('pre_get_posts','wpse50761_alter_query'); function wpse50761_alter_query($query){ if( $query->is_main_query() ){ //Do something to main query } }
(I would also check that
is_admin()
returns false - though this may be redundant.). The main query appears in your templates as:if( have_posts() ): while( have_posts() ): the_post(); //The loop endwhile; endif;
If you ever feel the need to edit this loop - use
pre_get_posts
. i.e. If you are tempted to usequery_posts()
- usepre_get_posts
instead.WP_Query
The main query is an important instance of a
WP_Query object
. WordPress uses it to decide which template to use, for example, and any arguments passed into the url (e.g. pagination) are all channelled into that instance of theWP_Query
object.For secondary loops (e.g. in side-bars, or 'related posts' lists) you'll want to create your own separate instance of the
WP_Query
object. E.g.$my_secondary_loop = new WP_Query(...); if( $my_secondary_loop->have_posts() ): while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post(); //The secondary loop endwhile; endif; wp_reset_postdata();
Notice
wp_reset_postdata();
- this is because the secondary loop will override the global$post
variable which identifies the 'current post'. This essentially resets that to the$post
we are on.get_posts()
This is essentially a wrapper for a separate instance of a
WP_Query
object. This returns an array of post objects. The methods used in the loop above are no longer available to you. This isn't a 'Loop', simply an array of post object.<ul> <?php global $post; $args = array( 'numberposts' => 5, 'offset'=> 1, 'category' => 1 ); $myposts = get_posts( $args ); foreach( $myposts as $post ) : setup_postdata($post); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endforeach; wp_reset_postdata(); ?> </ul>
In response to your questions
- Use
pre_get_posts
to alter your main query. Use a separateWP_Query
object (method 2) for secondary loops in the template pages. - If you want to alter the query of the main loop, use
pre_get_posts
.
-
Итак,есть ли сценарий,когда можно было бы сразу перейти кget_posts (),а не к WP_Query?So is there any scenario when one would go straight to get_posts() rather than WP_Query?
- 0
- 2012-08-25
- urok93
-
@drtanz - да.Скажем,например,вам не нужна разбивка на страницы или прикрепленные сообщения вверху - в этих случаяхget_posts () более эффективен.@drtanz - yes. Say for instance you don't need pagination, or sticky posts at the top - in these instances `get_posts()` is more efficient.
- 0
- 2012-08-25
- Stephen Harris
-
Но разве это не добавило бы дополнительного запроса,в котором мы могли бы просто изменитьpre_get_posts для изменения основного запроса?But wouldn't that add an extra query where we could just modify pre_get_posts to modify the main query?
- 1
- 2012-08-26
- urok93
-
@drtanz - вы бы не использовали `get_posts ()` для основного запроса - его для вторичных запросов.@drtanz - you wouldn't be using `get_posts()` for the main query - its for secondary queries.
- 0
- 2012-08-26
- Stephen Harris
-
В вашем примере WP_Query,если вы измените $my_secondary_loop->the_post ();в $my_post=$my_secondary_loop->next_post ();вы можете избежать необходимости помнить об использовании wp_reset_postdata (),если вы используете $my_post для выполнения того,что вам нужно.In your WP_Query example, if you change $my_secondary_loop->the_post(); to $my_post = $my_secondary_loop->next_post(); you can avoid having to remember to use wp_reset_postdata() as long as you use $my_post to do what you need to do.
- 0
- 2015-09-18
- Privateer
-
@Privateer Не так,WP_Query ::get_posts () устанавливаетglobal $post;@Privateer Not so, `WP_Query::get_posts()` sets `global $post;`
- 0
- 2015-09-19
- Stephen Harris
-
@StephenHarris Я только что просмотрел класс запроса и не вижу его.Я проверял в основном потому,что никогда не использую wp_reset_postdata,потому что я всегда делаю запросы таким образом.Вы создаете новый объект,и все результаты содержатся в нем.@StephenHarris I just looked through the query class and don't see it. I checked mostly because I never use wp_reset_postdata because I always do queries this way. You are creating a new object and all of the results are contained within it.
- 0
- 2015-09-19
- Privateer
-
@Privateer - извините,опечатка,`WP_Query ::the_post ()`,см. Https://github.com/WordPress/WordPress/blob/759f3d894ce7d364cf8bfc755e483ac2a6d85653/wp-includes/query.php#L3732@Privateer - sorry, typo, `WP_Query::the_post()`, see: https://github.com/WordPress/WordPress/blob/759f3d894ce7d364cf8bfc755e483ac2a6d85653/wp-includes/query.php#L3732
- 0
- 2015-09-19
- Stephen Harris
-
@StephenHarris Right=) Если вы используетеnext_post () для объекта вместо использованияthe_post,вы не выполняете глобальный запрос и вам не нужно помнить,что впоследствии нужно использовать wp_reset_postdata.@StephenHarris Right =) If you use next_post() on the object instead of using the_post, you don't step on the global query and don't need to remember to use wp_reset_postdata afterwards.
- 2
- 2015-09-19
- Privateer
-
@Privateer Ах,мои извинения,похоже,я запутался.Вы правы (но вы не сможете использовать какие-либо функции,которые относятся к глобальному `$post`,например,`the_title () `,`the_content () `).@Privateer Ah, my apologies, seemed to have confused myself. You are right (but you would not be able to use any functions which refer to the global `$post` e.g. `the_title()`, `the_content()`).
- 0
- 2015-09-23
- Stephen Harris
-
Верно=) Я никогда их не использую,поэтому не скучаю по ним.True =) I never use any of those so I don't miss them.
- 0
- 2015-09-24
- Privateer
-
@ urok93 Я иногда `get_posts ()`,когда мне нужно получить сообщения,связанные с ACF,особенно если там только один.Подумав о стандартизации своих шаблонов,я подумываю переписать их как экземпляры WP_Query.@urok93 I sometimes `get_posts()` when I need to get ACF related posts, especially if there's only one. Thought to standardize my templates I'm considering rewriting them as WP_Query instances.
- 0
- 2018-02-14
- Slam
-
- 2012-05-01
Есть два разных контекста для циклов:
- основной цикл,который происходит на основе запроса URL и обрабатывается до загрузки шаблонов.
- вторичные циклы,возникающие любым другим способом,вызываемые из файлов шаблонов или иным образом.
Проблема с
query_posts ()
заключается в том,что это вторичный цикл,который пытается стать основным и терпит неудачу. Так что забудьте,что он существует.Чтобы изменить основной цикл
- не используйте
query_posts()
- используйте фильтр
pre_get_posts
с$ query- >is_main_query ()
check - поочередно используйте фильтр
request
(слишком грубый,поэтому лучше выше)
Для запуска вторичного цикла
Используйте
new WP_Query
илиget_posts ()
,которые в значительной степени взаимозаменяемы (последний является тонкой оболочкой для первого).Для очистки
Используйте
wp_reset_query ()
,если вы использовалиquery_posts ()
или перепутались сglobal$ wp_query
напрямую - так что вам почти никогда не понадобится.Используйте
wp_reset_postdata ()
,если вы использовалиthe_post ()
илиsetup_postdata ()
или испортили глобальный$post
и нужно восстановить исходное состояние вещей,связанных с постами.There are two different contexts for loops:
- main loop that happens based on URL request and is processed before templates are loaded
- secondary loops that happen in any other way, called from template files or otherwise
Problem with
query_posts()
is that it is secondary loop that tries to be main one and fails miserably. Thus forget it exists.To modify main loop
- don't use
query_posts()
- use
pre_get_posts
filter with$query->is_main_query()
check - alternately use
request
filter (a little too rough so above is better)
To run secondary loop
Use
new WP_Query
orget_posts()
which are pretty much interchangeable (latter is thin wrapper for former).To cleanup
Use
wp_reset_query()
if you usedquery_posts()
or messed with global$wp_query
directly - so you will almost never need to.Use
wp_reset_postdata()
if you usedthe_post()
orsetup_postdata()
or messed with global$post
and need to restore initial state of post-related things.-
Rarst означает `wp_reset_postdata ()`Rarst meant `wp_reset_postdata()`
- 4
- 2012-06-01
- Gregory
-
- 2012-09-16
Существуют допустимые сценарии использования
query_posts($query)
,например:-
Вы хотите отобразить список сообщений или сообщений настраиваемого типа на странице (с использованием шаблона страницы)
-
Вы хотите,чтобы пагинация этих сообщений работала
Зачем вам отображать его на странице вместо использования шаблона архива?
-
Это более интуитивно понятно для администратора (вашего клиента?) - они могут видеть страницу в "Страницах"
-
Лучше добавить его в меню (без страницы им пришлось бы добавлять URL напрямую)
-
Если вы хотите отобразить в шаблоне дополнительный контент (текст,миниатюру публикации или любое другое мета-контент),вы можете легко получить его со страницы (и все это имеет больше смысла для клиента). Убедитесь,что если вы использовали шаблон архива,вам нужно либо жестко закодировать дополнительный контент,либо использовать,например,параметры темы/плагина (что делает его менее интуитивно понятным для клиента)
Вот упрощенный пример кода (который будет в шаблоне вашей страницы - например,page-page-of-posts.php):
/** * Template Name: Page of Posts */ while(have_posts()) { // original main loop - page content the_post(); the_title(); // title of the page the_content(); // content of the page // etc... } // now we display list of our custom-post-type posts // first obtain pagination parametres $paged = 1; if(get_query_var('paged')) { $paged = get_query_var('paged'); } elseif(get_query_var('page')) { $paged = get_query_var('page'); } // query posts and replace the main query (page) with this one (so the pagination works) query_posts(array('post_type' => 'my_post_type', 'post_status' => 'publish', 'paged' => $paged)); // pagination next_posts_link(); previous_posts_link(); // loop while(have_posts()) { the_post(); the_title(); // your custom-post-type post's title the_content(); // // your custom-post-type post's content } wp_reset_query(); // sets the main query (global $wp_query) to the original page query (it obtains it from global $wp_the_query variable) and resets the post data // So, now we can display the page-related content again (if we wish so) while(have_posts()) { // original main loop - page content the_post(); the_title(); // title of the page the_content(); // content of the page // etc... }
Теперь,чтобы быть предельно ясным,мы могли бы избежать использования
query_posts()
и здесь и использовать вместо негоWP_Query
- вот так:// ... global $wp_query; $wp_query = new WP_Query(array('your query vars here')); // sets the new custom query as a main query // your custom-post-type loop here wp_reset_query(); // ...
Но зачем нам это делать,когда у нас есть такая замечательная маленькая функция?
There are legitimate scenarios for using
query_posts($query)
, for example:You want to display a list of posts or custom-post-type posts on a page (using a page template)
You want to make pagination of those posts work
Now why would you want to display it on a page instead of using an archive template?
It's more intuitive for an administrator (your customer?) - they can see the page in the 'Pages'
It's better for adding it to menus (without the page, they'd have to add the url directly)
If you want to display additional content (text, post thumbnail, or any custom meta content) on the template, you can easily get it from the page (and it all makes more sense for the customer too). See if you used an archive template, you'd either need to hardcode the additional content or use for example theme/plugin options (which makes it less intuitive for the customer)
Here's a simplified example code (which would be on your page template - e.g. page-page-of-posts.php):
/** * Template Name: Page of Posts */ while(have_posts()) { // original main loop - page content the_post(); the_title(); // title of the page the_content(); // content of the page // etc... } // now we display list of our custom-post-type posts // first obtain pagination parametres $paged = 1; if(get_query_var('paged')) { $paged = get_query_var('paged'); } elseif(get_query_var('page')) { $paged = get_query_var('page'); } // query posts and replace the main query (page) with this one (so the pagination works) query_posts(array('post_type' => 'my_post_type', 'post_status' => 'publish', 'paged' => $paged)); // pagination next_posts_link(); previous_posts_link(); // loop while(have_posts()) { the_post(); the_title(); // your custom-post-type post's title the_content(); // // your custom-post-type post's content } wp_reset_query(); // sets the main query (global $wp_query) to the original page query (it obtains it from global $wp_the_query variable) and resets the post data // So, now we can display the page-related content again (if we wish so) while(have_posts()) { // original main loop - page content the_post(); the_title(); // title of the page the_content(); // content of the page // etc... }
Now, to be perfectly clear, we could avoid using
query_posts()
here too and useWP_Query
instead - like so:// ... global $wp_query; $wp_query = new WP_Query(array('your query vars here')); // sets the new custom query as a main query // your custom-post-type loop here wp_reset_query(); // ...
But, why would we do that when we have such a nice little function available for it?
-
Брайан,спасибо за это.Я изо всех сил пытался заставитьpre_get_posts работать на странице в ТОЧНОМ сценарии,который вы описываете: клиенту необходимо добавить настраиваемые поля/контент к тому,что в противном случае было бы страницей архива,поэтому необходимо создать «страницу»;клиенту нужно увидеть что-то,что можно добавить в навигационное меню,так как добавление настраиваемой ссылки ускользает от них;и т.д. +1 от меня!Brian, thanks for that. I've been struggling to get pre_get_posts to work on a page in EXACTLY the scenario you describe: client needs to add custom fields/content to what otherwise would be an archive page, so a "page" needs to be created; client needs to see something to add to nav menu, as adding a custom link escapes them; etc. +1 from me!
- 2
- 2012-12-13
- Will Lanni
-
Это также можно сделать с помощьюpre_get_posts.Я сделал это,чтобы иметь «статическую первую страницу»,в которой перечислены мои настраиваемые типы сообщений в настраиваемом порядке и с настраиваемым фильтром.Эта страница также разбита на страницы.Посмотрите этот вопрос,чтобы узнать,как это работает: http://wordpress.stackexchange.com/questions/30851/how-to-use-a-custom-post-type-archive-as-front-page/30854 Короче говоря,законного сценария использования query_posts все еще не существует;)That can also be done using "pre_get_posts". I did that to have a "static front page" listing my custom post types in a custom order and with a custom filter. This page is also paginated. Check out this question to see how it works: http://wordpress.stackexchange.com/questions/30851/how-to-use-a-custom-post-type-archive-as-front-page/30854 So in short, there is still no more legitimate scenario for using query_posts ;)
- 3
- 2015-01-12
- 2ndkauboy
-
Потому что "Следует отметить,что использование этой функции для замены основного запроса на странице может увеличить время загрузки страницы,в худшем случае объем необходимой работы увеличится более чем вдвое или больше. Несмотря на то,что эта функция проста в использовании,она также может вызывать путаницу.и проблемы позже ».Источник http://codex.wordpress.org/Function_Reference/query_postsBecause "It should be noted that using this to replace the main query on a page can increase page loading times, in worst case scenarios more than doubling the amount of work needed or more. While easy to use, the function is also prone to confusion and problems later on." Source http://codex.wordpress.org/Function_Reference/query_posts
- 2
- 2015-03-09
- Claudiu Creanga
-
Это неправильный ответ.Вы можете создать «Страницу» в WP с тем же URL,что и у настраиваемого типа сообщения.Например,если ваш CPT - Bananas,вы можете получить страницу с именем Bananas с тем же URL.Тогда вы получите siteurl.com/bananas.Пока у вас есть archive-bananas.php в папке вашей темы,он будет использовать шаблон и вместо этого «переопределить» эту страницу.Как указано в одном из других комментариев,использование этого «метода» создает вдвое большую рабочую нагрузку для WP,поэтому его НЕ следует использовать.THis answer is all kinds of wrong. You can create a "Page" in WP with the same URL as the Custom post type. EG if your CPT is Bananas, you can get a page named Bananas with the same URL. Then you'd end up with siteurl.com/bananas. As long as you have archive-bananas.php in your theme folder, then it will use the template and "override" that page instead. As stated in one of the other comments, using this "method" creates twice the workload for WP, thus should NOT ever be used.
- 0
- 2015-06-19
- Hybrid Web Dev
-
- 2015-01-23
Я изменяю запрос WordPress изfunctions.php:
//unfortunately, "IS_PAGE" condition doesn't work in pre_get_posts (it's WORDPRESS behaviour) //so you can use `add_filter('posts_where', ....);` OR modify "PAGE" query directly into template file add_action( 'pre_get_posts', 'myFunction' ); function myFunction($query) { if ( ! is_admin() && $query->is_main_query() ) { if ( $query->is_category ) { $query->set( 'post_type', array( 'post', 'page', 'my_postType' ) ); add_filter( 'posts_where' , 'MyFilterFunction_1' ) && $GLOBALS['call_ok']=1; } } } function MyFilterFunction_1($where) { return (empty($GLOBALS['call_ok']) || !($GLOBALS['call_ok']=false) ? $where : $where . " AND ({$GLOBALS['wpdb']->posts}.post_name NOT LIKE 'Journal%')"; }
I modify WordPress query from functions.php:
//unfortunately, "IS_PAGE" condition doesn't work in pre_get_posts (it's WORDPRESS behaviour) //so you can use `add_filter('posts_where', ....);` OR modify "PAGE" query directly into template file add_action( 'pre_get_posts', 'myFunction' ); function myFunction($query) { if ( ! is_admin() && $query->is_main_query() ) { if ( $query->is_category ) { $query->set( 'post_type', array( 'post', 'page', 'my_postType' ) ); add_filter( 'posts_where' , 'MyFilterFunction_1' ) && $GLOBALS['call_ok']=1; } } } function MyFilterFunction_1($where) { return (empty($GLOBALS['call_ok']) || !($GLOBALS['call_ok']=false) ? $where : $where . " AND ({$GLOBALS['wpdb']->posts}.post_name NOT LIKE 'Journal%')"; }
-
было бы интересно увидеть этот пример,но предложение where находится в настраиваемой мета.would be interested to see this example but where clause is on custom meta.
- 0
- 2017-03-03
- Andrew Welch
-
- 2016-12-28
Просто чтобы обозначить некоторые улучшения принятого ответа с тех пор,как WordPress со временем развивался,а некоторые вещи изменились сейчас (пять лет спустя):
<цитата>pre_get_posts
- фильтр для изменения любого запроса. Чаще всего используется для изменения только «основного запроса»:На самом деле это крючок действия. Не фильтр,и он повлияет на любой запрос.
<цитата>Основной запрос отображается в ваших шаблонах как:
if( have_posts() ): while( have_posts() ): the_post(); //The loop endwhile; endif;
На самом деле это тоже неправда. Функция
have_posts
выполняет итерацию по объектуglobal $wp_query
,который не связан только с основным запросом.global $wp_query;
также может быть изменен с помощью вторичных запросов.function have_posts() { global $wp_query; return $wp_query->have_posts(); }
get_posts ()
По сути,это оболочка для отдельного экземпляра объекта WP_Query.
На самом деле в настоящее время
WP_Query
- это класс,поэтому у нас есть экземпляр класса.
В заключение: в то время,когда @StephenHarris писал,скорее всего,все это было правдой,но со временем кое-что в WordPress изменилось.
Just to outline some improvements to the accepted answer since WordPress evolved over the time and some things are different now (five years later):
pre_get_posts
is a filter, for altering any query. It is most often used to alter only the 'main query':Actually is an action hook. Not a filter, and it will affect any query.
The main query appears in your templates as:
if( have_posts() ): while( have_posts() ): the_post(); //The loop endwhile; endif;
Actually, this is also not true. The function
have_posts
iterates theglobal $wp_query
object that is not related only to the main query.global $wp_query;
may be altered with the secondary queries also.function have_posts() { global $wp_query; return $wp_query->have_posts(); }
get_posts()
This is essentially a wrapper for a separate instance of a WP_Query object.
Actually, nowadays
WP_Query
is a class, so we have an instance of a class.
To conclude: At the time @StephenHarris wrote most likely all this was true, but over the time things in WordPress have been changed.
-
Технически,это все фильтры под капотом,действия - это всего лишь простой фильтр.Но вы правы здесь,это действие,которое передает аргумент по ссылке,чем оно отличается от более простых действий.Technically, it's all filters under the hood, actions are just a simple filter. But you are correct here, it's an action that passes an argument by reference, which is how it differs from more simple actions.
- 0
- 2016-12-28
- Milo
-
get_posts возвращает массив объектов сообщений,а не объект WP_Query,так что это действительно так.и WP_Query всегда был классом,экземпляром class=object.`get_posts` returns an array of post objects, not a `WP_Query` object, so that is indeed still correct. and `WP_Query` has always been a class, instance of a class = object.
- 0
- 2016-12-28
- Milo
-
Спасибо,@Milo,поправьте,по какой-то причине у меня в голове возникла упрощенная модель.Thanks, @Milo, correct from some reason I had oversimplified model in my head.
- 0
- 2016-12-28
- prosti
Я прочитал @nacin Вы не знаете Query вчера,и он был отправлен в виде кроличьей норы с запросом. До вчерашнего дня я (ошибочно) использовал
query_posts()
для всех мои запросы. Теперь я стал немного мудрее использоватьWP_Query()
,но все еще есть серые зоны.Думаю,я знаю наверняка:
Если я создаю дополнительные циклы в любом месте страницы - на боковой панели,в нижнем колонтитуле,в любых «связанных сообщениях» и т. д.,я хочу использовать
WP_Query()
. Я могу использовать это повторно на одной странице без какого-либо вреда. (правильно?).Чего я точно не знаю
pre_get_posts
по сравнению сWP_Query()
? Стоит ли мне сейчас использовать для всегоpre_get_posts
?if have_posts : while have_posts : the_post
и пишу свой собственный < a href="http://codex.wordpress.org/Function_Reference/WP_Query" rel="noreferrer">WP_Query()
? Или я могу изменить вывод,используяpre_get_posts
в моих функциях.php файл?<▪tl;dr
Правилаtl; dr,которые я хотел бы извлечь из этого:
query_posts
WP_Query()
а>Спасибо за любую мудрость
Терри
ps: я видел и читал: Когда следует использовать WP_Query,query_posts () илиget_posts ()? Что добавляет еще одно измерение -
get_posts
. Но вообще не имеет отношения кpre_get_posts
.