Quand utiliser WP_query (), query_posts () et pre_get_posts
-
-
Copiepossible de [Quand devriez-vous utiliser WP \ _Query vs query \ _posts () vsget \ _posts ()?] (Http://wordpress.stackexchange.com/questions/1753/when-should-you-use-wp-query-vs-query-posts-vs-get-posts)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,maintenant c'est différent,WordPress a évolué,j'ai ajouté quelques commentairespar rapport à la réponse acceptée [ici] (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 réponses
- votes
-
- 2012-05-01
Vous avez raison de dire:
Nejamais utiliser
query_posts
pre_get_posts
pre_get_posts
est unfiltre,pourmodifier tout requête. Ilest leplus souvent utilisépourmodifier uniquement la «requêteprincipale»:add_action('pre_get_posts','wpse50761_alter_query'); function wpse50761_alter_query($query){ if( $query->is_main_query() ){ //Do something to main query } }
(Je vérifierais également que
is_admin()
renvoie false -bien que celapuisse être redondant.). La requêteprincipale apparaît dans vosmodèles sous laforme:if( have_posts() ): while( have_posts() ): the_post(); //The loop endwhile; endif;
Sijamais vous ressentez lebesoin demodifier cetteboucle,utilisez
pre_get_posts
. c'est-à-dire si vous êtestenté d'utiliserquery_posts()
- utilisezplutôtpre_get_posts
.WP_Query
La requêteprincipaleest uneinstanceimportante d'un
WP_Query object
. WordPress l'utilisepour décider quelmodèle utiliser,parexemple,et tous les argumentspassés dans l'url (parexemple lapagination) sonttous canalisés dans cetteinstance de l'objetWP_Query
.Pour lesboucles secondaires (parexemple dans lesbarres latérales ou les listes de ``publications associées ''),vous voudrez créer votrepropreinstance distincte de l'objet
WP_Query
. Parexemple.$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();
Remarquez
wp_reset_postdata();
- c'estparce que laboucle secondaire remplacera la variableglobale$post
quiidentifie la 'publication actuelle'. Cela réinitialiseessentiellement cela au$post
sur lequelnous sommes.get_posts ()
Il s'agitessentiellement d'un wrapperpour uneinstance distincte d'un objet
WP_Query
. Cela renvoie untableau d'objets depublication. Lesméthodes utilisées dans laboucle ci-dessusne sontplus disponiblespour vous. Cen'estpas une «boucle»,simplement untableau d'objets depublication.<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>
En réponse à vos questions
- Utilisez
pre_get_posts
pourmodifier votre requêteprincipale. Utilisez un objetWP_Query
distinct (méthode 2)pour lesboucles secondaires dans lespages demodèle. - Si vous souhaitezmodifier la requête de laboucleprincipale,utilisez
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
.
-
Y a-t-il donc un scénario où l'onirait directement àget_posts ()plutôt qu'à 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 - oui.Disonsparexemple que vousn'avezpasbesoin depagination,ou demessages collantsen haut - dans ces cas,`get_posts ()`estplusefficace.@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
-
Mais celan'ajouterait-ilpas une requête supplémentaire oùnouspourrions simplementmodifierpre_get_postspourmodifier la requêteprincipale?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 - vousn'utiliseriezpas `get_posts ()`pour la requêteprincipale - c'estpour les requêtes secondaires.@drtanz - you wouldn't be using `get_posts()` for the main query - its for secondary queries.
- 0
- 2012-08-26
- Stephen Harris
-
Dans votreexemple WP_Query,si vousmodifiez $my_secondary_loop->the_post ();à $my_post=$my_secondary_loop->next_post ();vouspouvez éviter d'avoir à vous rappeler d'utiliser wp_reset_postdata ()tant que vous utilisez $my_postpourfaire ce que vous devezfaire.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 Pas ainsi,`WP_Query ::get_posts ()` définit `global $post;`@Privateer Not so, `WP_Query::get_posts()` sets `global $post;`
- 0
- 2015-09-19
- Stephen Harris
-
@StephenHarris Je viens deparcourir la classe de requêteet jene la voispas.J'ai vérifiéprincipalementparce queje n'utilisejamais wp_reset_postdataparce queje faistoujours des requêtes de cettefaçon.Vous créez unnouvel objetet tous les résultats y sont contenus.@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 - désolé,faute defrappe,`WP_Query ::the_post ()`,voir: 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=) Si vous utiliseznext_post () sur l'objet au lieu d'utiliserthe_post,vousne marchezpas sur la requêteglobaleet vousn'avezpasbesoin de vous rappeler d'utiliser wp_reset_postdatapar la suite.@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 Ah,mesexcuses,semblaientm'être confus.Vous avez raison (mais vousne seriezpasen mesure d'utiliser desfonctionsfaisant référence au `$post`global,parexemple`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
-
Vrai=) Jen'utilisejamais aucun de ceux-ci doncje ne lesmanquepas.True =) I never use any of those so I don't miss them.
- 0
- 2015-09-24
- Privateer
-
@ urok93 J'aiparfois `get_posts ()` quandj'aibesoin d'obtenir des articles liés à ACF,surtout s'iln'yen a qu'un.Pensépour standardisermesmodèles,j'envisage de les réécrireen tant qu'instances 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
Ilexiste deux contextes différentspour lesboucles:
-
Boucle
- principale qui seproduiten fonction d'une demande d'URLet esttraitée avant le chargement desmodèles
- Boucles secondaires qui seproduisent d'une autremanière,appelées àpartir defichiers demodèle ou autrement
Leproblème avec
query_posts ()
est que c'est laboucle secondaire quiessaie d'êtreprincipaleet échoue lamentablement. Oubliez donc qu'ilexiste.Pourmodifier laboucleprincipale
- n'utilisezpas
query_posts()
- utilisez lefiltre
pre_get_posts
avec$ query- >is_main_query ()
check - utilisez alternativement lefiltre
request
(unpeutropgrossier donc ci-dessusestmieux)
Pourexécuter uneboucle secondaire
Utilisez
new WP_Query
ouget_posts ()
qui sont àpeuprèsinterchangeables (ce dernierest un wrapperfin pour lepremier).Ànettoyer
Utilisez
wp_reset_query ()
si vous avez utiliséquery_posts ()
ou si vous avezjoué directement avec$ wp_query
global - vousn'aurez doncpresquejamaisbesoin de lefaire.Utilisez
wp_reset_postdata ()
si vous avez utiliséthe_post ()
ousetup_postdata ()
ou si vous avezjoué avec le codeglobal$post >et besoin de restaurer l'étatinitial des éléments liés à lapublication.
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 signifiait `wp_reset_postdata ()`Rarst meant `wp_reset_postdata()`
- 4
- 2012-06-01
- Gregory
-
- 2012-09-16
Ilexiste des scénarios légitimes d'utilisation de
query_posts($query)
,parexemple:-
Vous souhaitez afficher une liste d'articles ou d'articles detype articlepersonnalisé sur unepage (à l'aide d'unmodèle depage)
-
Vous souhaitez que lapagination de cesmessagesfonctionne
Maintenant,pourquoi voudriez-vous l'afficher sur unepage au lieu d'utiliser unmodèle d'archive?
-
C'estplusintuitifpour un administrateur (votre client?) -ilpeut voir lapage dans les "Pages"
-
Ilestpréférable de l'ajouter auxmenus (sans lapage,ils devraient ajouter directement l'url)
-
Si vous souhaitez afficher du contenu supplémentaire (texte,vignette depublication outout autreméta-contenupersonnalisé) sur lemodèle,vouspouvezfacilement l'obtenir àpartir de lapage (ettout cela a égalementplus de senspour le client). Voyez si vous avez utilisé unmodèle d'archive,vous devez soit coderen dur le contenu supplémentaire,soit utiliserparexemple des options dethème/plugin (ce qui le rendmoinsintuitifpour le client)
Voici unexemple de code simplifié (qui serait sur votremodèle depage -parexemple,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... }
Maintenant,pour êtreparfaitement clair,nouspourrions éviter d'utiliser
query_posts()
ici aussiet utiliserWP_Query
à laplace - comme ceci:// ... 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(); // ...
Maispourquoiferions-nous cela alors quenous avons une sijoliepetite fonction disponible?
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?
-
Brian,mercipour ça.J'aieu dumal àfairefonctionnerpre_get_posts sur unepage EXACTEMENT le scénario que vous décrivez: le client doit ajouter des champs/contenuspersonnalisés à ce qui serait autrement unepage d'archive,donc une "page" doit être créée;le client abesoin de voir quelque chose à ajouter aumenu denavigation,car l'ajout d'un lienpersonnalisé leur échappe;etc. +1 demoi!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
-
Celapeut également êtrefaiten utilisant "pre_get_posts".J'aifait celapour avoir une "page d'accueil statique" répertoriantmestypes demessagespersonnalisés dans un ordrepersonnaliséet avec unfiltrepersonnalisé.Cettepageest égalementpaginée.Consultez cette questionpour voir comment celafonctionne: http://wordpress.stackexchange.com/questions/30851/how-to-use-a-custom-post-type-archive-as-front-page/30854 Doncen bref,iln'y atoujourspas de scénarioplus légitimepour utiliser 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
-
Parce que "Il convient denoter que l'utilisation de cette optionpour remplacer la requêteprincipale sur unepagepeut augmenter lestemps de chargement de lapage,dans lepire des cas,plus que doubler la quantité detravailnécessaire ouplus. Bien quefacile à utiliser,lafonctionest également sujette à confusionet desproblèmesplustard. "Source 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
-
Cette réponseestfausse detoutes sortes.Vouspouvez créer une «Page» dans WP avec lamême URL que letype depublicationpersonnalisé.Parexemple,si votre CPTest Bananes,vouspouvez obtenir unepagenommée Bananes avec lamême URL.Ensuite,vous vous retrouveriez avec siteurl.com/bananas.Tant que vous avez archive-bananas.php dans votre dossier dethème,il utilisera lemodèleet «remplacera» cettepage à laplace.Commeindiqué dans l'un des autres commentaires,l'utilisation de cette "méthode" crée deuxfois la charge detravailpour WP,doncne devraitjamais être utilisée.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
Jemodifie la requête WordPress defunctions.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%')"; }
-
seraitintéressé de voir cetexemplemais où la clauseest surmétapersonnalisé.would be interested to see this example but where clause is on custom meta.
- 0
- 2017-03-03
- Andrew Welch
-
- 2016-12-28
Justepour souligner quelques améliorations à la réponse acceptéepuisque WordPress a évolué aufil dutempset que certaines choses sont différentesmaintenant (cinq ansplustard):
pre_get_posts
est unfiltre,pourmodifiern'importe quelle requête. Ilest leplus souvent utilisépourmodifier uniquement la «requêteprincipale»:C'esten fait un crochet d'action. Pas unfiltre,et cela affecteran'importe quelle requête.
La requêteprincipale apparaît dans vosmodèles sous laforme:
if( have_posts() ): while( have_posts() ): the_post(); //The loop endwhile; endif;
Enfait,cen'estpas vrainonplus. Lafonction
have_posts
itère l'objetglobal $wp_query
quin'estpas lié uniquement à la requêteprincipale.global $wp_query;
peut également êtremodifié avec les requêtes secondaires.function have_posts() { global $wp_query; return $wp_query->have_posts(); }
get_posts ()
Il s'agitessentiellement d'un wrapperpour uneinstance distincte d'un objet WP_Query.
Enfait,denosjours
WP_Query
est une classe,nous avons donc uneinstance d'une classe.
Pour conclure: aumoment où @StephenHarris a écrit,tout cela étaitprobablement vrai,mais aufil dutemps,les choses dans WordPress ont changé.
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.
-
Techniquement,ce sonttous desfiltres sous le capot,les actionsne sont qu'un simplefiltre.Mais vous avez raisonici,c'est une action quipasse un argumentpar référence,c'esten quoielle diffère des actionsplus simples.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` retourne untableau d'objets depublication,pas un objet` WP_Query`,donc c'esttoujours correct.et `WP_Query` atoujours été une classe,uneinstance d'une classe=objet.`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
-
Merci,@Milo,corrige une raisonpour laquellej'avais unmodèletrop simplifié dansmatête.Thanks, @Milo, correct from some reason I had oversimplified model in my head.
- 0
- 2016-12-28
- prosti
J'ai lu @nacin's Vousne connaissezpas la requête hieret a étéenvoyé unpeu dans unterrier de lapin. Avant hier,j'utilisais (àtort)
query_posts()
pourtousmesbesoins d'interrogation. Maintenant,je suis unpeuplus sage sur l'utilisation deWP_Query()
,mais ontencore des zonesgrises.Ce queje pense savoir avec certitude:
Sije crée des boucles supplémentaires n'importe où sur unepage (dans labarre latérale,dans unpied depage,touttype de "messages associés",etc.),je souhaite utiliser
WP_Query()
. Jepeux l'utiliser àplusieurs reprises sur une seulepage sans aucun dommage. (droite?).Ce queje ne saispas avec certitude
pre_get_posts
contreWP_Query()
? Dois-je utiliserpre_get_posts
pourtoutmaintenant?if have_posts : while have_posts : the_post
et écris lamienne < a href="http://codex.wordpress.org/Function_Reference/WP_Query" rel="noreferrer">WP_Query()
? Ouest-ce queje modifie la sortieen utilisantpre_get_posts
dansmesfonctions.php?<↓tl;dr
Les règlestl; dr quej'aimeraisen tirer sont:
query_posts
WP_Query()
Mercipourtoute sagesse
Terry
ps:j'ai vuet lu: Quand devriez-vous utiliser WP_Query vs query_posts () vsget_posts ()? Ce qui ajoute une autre dimension -
get_posts
. Maisne traitepas dutout depre_get_posts
.