Wann wird WP_query (), query_posts () und pre_get_posts
-
-
Mögliches Duplikat von [Wann sollten Sie WP \ _Query vs query \ _posts () vsget \ _posts () verwenden?] (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,jetztist anders,WordPress hat sich weiterentwickelt,ich habeeinige Kommentareim Vergleich zu der akzeptierten Antwort [hier] hinzugefügt (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 Antworten
- Stimmen
-
- 2012-05-01
Sie haben Recht zu sagen:
Verwenden Sieniemals
query_posts
mehrpre_get_posts
pre_get_posts
istein Filter zum Ändern von any Abfrage. Es wird am häufigsten verwendet,umnur die 'Hauptabfrage' zu ändern:add_action('pre_get_posts','wpse50761_alter_query'); function wpse50761_alter_query($query){ if( $query->is_main_query() ){ //Do something to main query } }
(Ich würde auch überprüfen,ob
is_admin()
false zurückgibt - obwohl diesmöglicherweise redundantist.) Die Hauptabfrage wirdin Ihren Vorlagen wiefolgt angezeigt:if( have_posts() ): while( have_posts() ): the_post(); //The loop endwhile; endif;
Wenn Siejemals das Bedürfnis haben,diese Schleife zubearbeiten,verwenden Sie
pre_get_posts
. Wenn Sie versucht sind,query_posts()
zu verwenden,verwenden Sie stattdessenpre_get_posts
.WP_Query
Die Hauptabfrageisteine wichtige Instanzeines
WP_Query object
. WordPress verwendetes,um zuentscheiden,welche Vorlagebeispielsweise verwendet werden soll,und alle an die URL übergebenen Argumente (z. B. Paginierung) werden allein diese Instanz desWP_Query
-Objektsgeleitet.Für sekundäre Schleifen (z. B.in Seitenleisten oder Listenmit verwandten Posts)möchten Sieeine eigene separate Instanz des Objekts
WP_Query
erstellen. Z.B.$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();
Hinweis
wp_reset_postdata();
- Dies liegt daran,dass die sekundäre Schleife dieglobale Variable$post
überschreibt,die den 'aktuellen Beitrag'identifiziert. Dies setztim Wesentlichen das auf den$post
zurück,auf dem wir unsbefinden.get_posts ()
Diesistim Wesentlichenein Wrapperfüreine separate Instanzeines
WP_Query
-Objekts. Diesgibt ein Array von Post-Objekten zurück. Diein der obigen Schleife verwendeten Methoden stehen Ihnennichtmehr zur Verfügung. Diesist keine 'Schleife',sondern lediglichein Array von Post-Objekten.<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>
Als Antwort auf Ihre Fragen
- Verwenden Sie
pre_get_posts
,um Ihre Hauptabfrage zu ändern. Verwenden Sieein separatesWP_Query
-Objekt (Methode 2)für sekundäre Schleifen auf den Vorlagenseiten. - Wenn Sie die Abfrage der Hauptschleife ändernmöchten,verwenden Sie
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
.
-
Gibtes alsoein Szenario,in demman direkt zuget_posts () undnicht zu WP_Query wechselt?So is there any scenario when one would go straight to get_posts() rather than WP_Query?
- 0
- 2012-08-25
- urok93
-
@drtanz -ja.Nehmen wir zum Beispiel an,Siebrauchen keine Paginierung oder klebrige Posts oben -in diesen Fällenistget_posts ()effizienter.@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
-
Aber würde dasnichteine zusätzliche Abfrage hinzufügen,bei der wirnurpre_get_posts ändern könnten,um die Hauptabfrage zu ändern?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 - Sie würdennichtget_posts ()für die Hauptabfrage verwenden -esistfür sekundäre Abfragen.@drtanz - you wouldn't be using `get_posts()` for the main query - its for secondary queries.
- 0
- 2012-08-26
- Stephen Harris
-
Wenn Siein Ihrem WP_Query-Beispiel $my_secondary_loop->the_post () ändern;zu $my_post=$my_secondary_loop->next_post ();Siemüssennicht daran denken,wp_reset_postdata () zu verwenden,solange Sie $my_post verwenden,um das zutun,was Sietunmüssen.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 Nicht so,`WP_Query ::get_posts ()` setzt `global $post;`@Privateer Not so, `WP_Query::get_posts()` sets `global $post;`
- 0
- 2015-09-19
- Stephen Harris
-
@ StephenHarris Ich habegerade die Abfrageklasse durchgesehen und sehe sienicht.Ich habemeistensnachgesehen,weilichnie wp_reset_postdata verwende,weilichimmer Abfragen auf diese Weisemache.Sieerstellenein neues Objekt und alle Ergebnisse sind darinenthalten.@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 - Entschuldigung,Tippfehler,`WP_Query ::the_post ()`,siehe: https://github.com/WordPress/WordPress/blob/759f3d894ce7d364cf8bfc755e483ac2a6d85653/wp-includes/query.php#L37@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=) Wenn Sienext_post ()für das Objekt anstelle vonthe_post verwenden,treten Sienicht auf dieglobale Abfrage undmüssennicht daran denken,danach wp_reset_postdata zu verwenden.@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,ichentschuldigemich,schienmich verwirrt zu haben.Sie haben Recht (aber Sie könnten keine Funktionen verwenden,die sich auf dasglobale "$post"beziehen,z. B. "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=) Ichbenutzenie eines davon,damitichesnicht vermisse.True =) I never use any of those so I don't miss them.
- 0
- 2015-09-24
- Privateer
-
@ urok93 Ichbekommemanchmal "get_posts ()",wennich ACF-bezogene Beiträgeerhaltenmuss,besonders wennesnureinen gibt.Ummeine Vorlagen zu standardisieren,denkeich darübernach,sie als WP_Query-Instanzenneu zu schreiben.@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
Esgibt zwei verschiedene Kontextefür Schleifen:
- Hauptschleife ,die auf der Grundlageeiner URL-Anforderung auftritt und verarbeitet wird,bevor Vorlagengeladen werden
- sekundäre Schleifen,die auf andere Weise auftreten und aus Vorlagendateien oder auf andere Weise aufgerufen werden
Problemmit
query_posts ()
ist,dasses sich umeine sekundäre Schleife handelt,die versucht,die Hauptschleife zu sein,und kläglichfehlschlägt. Vergessen Sie also,dassesexistiert.Zum Ändern der Hauptschleife
- Verwenden Sienicht
query_posts()
- Verwenden Sie den Filter
pre_get_posts
mit$ query- >is_main_query ()
check - Verwenden Sie alternativ den Filter
request
(etwas zugrob,daherist obenbesser)
Ausführen der sekundären Schleife
Verwenden Sie
new WP_Query
oderget_posts ()
,die ziemlich austauschbar sind (letzteresistein dünner Wrapperfürerstere).Zum Bereinigen
Verwenden Sie
wp_reset_query ()
,wenn Siequery_posts ()
verwendet oder direktmit globalem$ wp_query
herumgespielt haben - dasmüssen Siefastnie.Verwenden Sie
wp_reset_postdata ()
,wenn Siethe_post ()
odersetup_postdata ()
verwendet odermit globalem$post
undmüssen den Anfangszustandpostbezogener Dinge wiederherstellen.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.-
Rarstbedeutete "wp_reset_postdata ()"Rarst meant `wp_reset_postdata()`
- 4
- 2012-06-01
- Gregory
-
- 2012-09-16
Esgibt legitime Szenarienfür die Verwendung von
query_posts($query)
,zum Beispiel:-
Siemöchteneine Liste von Posts oderbenutzerdefinierten Posts vom Typ Post aufeiner Seite anzeigen (mithilfeeiner Seitenvorlage)
-
Siemöchten,dass die Paginierung dieser Beiträgefunktioniert
Warum sollten Sieesnun aufeiner Seite anzeigen,anstatteine Archivvorlage zu verwenden?
-
Füreinen Administrator (Ihren Kunden?)istesintuitiver -er kann die Seite auf den 'Seiten'
sehen
-
Esistbesser,es zu Menüs hinzuzufügen (ohne die Seitemüssten sie die URL direkt hinzufügen)
-
Wenn Sie zusätzlichen Inhalt (Text,Post-Thumbnail oderbenutzerdefinierten Meta-Inhalt)in der Vorlage anzeigenmöchten,können Sieihneinfach von der Seite abrufen (und allesist auchfür den Kunden sinnvoller). Wenn Sieeine Archivvorlage verwendet haben,müssen Sieentweder den zusätzlichen Inhaltfest codieren oderbeispielsweise Themen-/Plugin-Optionen verwenden (wasfür den Kunden wenigerintuitivist).
Hieristein vereinfachter Beispielcode (der sich auf Ihrer Seitenvorlagebefindet - z. B.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... }
Umganz klar zu sein,könnten wir auch hier die Verwendung von
query_posts()
vermeiden und stattdessenWP_Query
verwenden - wiefolgt:// ... 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(); // ...
Aber warum sollten wir dastun,wenn wireine sonette kleine Funktion dafür haben?
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,danke dafür.Ich habemichbemüht,pre_get_posts dazu zubringen,aufeiner Seitein genau dem von Ihnenbeschriebenen Szenario zu arbeiten: Der Clientmussbenutzerdefinierte Felder/Inhalte zueiner Archivseite hinzufügen,dahermusseine "Seite"erstellt werden.Der Clientmussetwas sehen,das dem Navigationsmenü hinzugefügt werden kann,da das Hinzufügeneinesbenutzerdefinierten Linksihnenentgeht.etc. +1 vonmir!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
-
Dies kann auchmit "pre_get_posts"erfolgen.Ich habe dasgetan,umeine "statische Startseite" zu haben,auf dermeine benutzerdefinierten Beitragstypenin einerbenutzerdefinierten Reihenfolge undmit einembenutzerdefinierten Filter aufgelistet sind.Diese Seiteistebenfallspaginiert.Schauen Sie sich diese Frage an,um zu sehen,wieesfunktioniert: http://wordpress.stackexchange.com/questions/30851/how-to-use-a-custom-post-type-archive-as-front-page/30854 Kurzgesagt,esgibt immernoch kein legitimeres Szenariofür die Verwendung von 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
-
Denn "Es solltebeachtet werden,dass die Verwendung dieser Funktion zum Ersetzen der Hauptabfrage aufeiner Seite die Ladezeiten der Seite verlängern kann. Im schlimmsten Fall kann der Arbeitsaufwandmehr als verdoppelt werden. Die Funktionist zwareinfach zu verwenden,aber auch verwirrungsanfälligund Probleme später. "Quelle 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
-
Diese Antwortistfalsch.Sie könnenin WPeine "Seite"mit derselben URL wie derbenutzerdefinierte Beitragstyperstellen.Wenn Ihr CPT Bananenist,können Sieeine Seitemit dem Namen Bananenmit derselben URLerhalten.Dann würden Siemit siteurl.com/bananasenden.Solange Sie archive-bananas.phpin Ihrem Themenordner haben,wird die Vorlage verwendet und diese Seite stattdessen "überschrieben".Wiein einem der anderen Kommentare angegeben,erzeugt die Verwendung dieser "Methode" die doppelte Arbeitslastfür WP und sollte daherniemals verwendet werden.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
Ich ändere die WordPress-Abfrage vonfunctions.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%')"; }
-
wäreinteressiert,dieses Beispiel zu sehen,aber wo Klausel aufbenutzerdefinierten Metaist.would be interested to see this example but where clause is on custom meta.
- 0
- 2017-03-03
- Andrew Welch
-
- 2016-12-28
Nur umeinige Verbesserungen der akzeptierten Antwort zu skizzieren,seit sich WordPressim Laufe der Zeit weiterentwickelt hat undeinige Dingejetzt (fünf Jahre später) anders sind:
pre_get_posts
istein Filter zum Ändern von Abfragen. Es wird am häufigsten verwendet,umnur die 'Hauptabfrage' zu ändern:Isteigentlichein Action-Hook. Kein Filter,under wirkt sich aufjede Abfrage aus.
Die Hauptabfrage wirdin Ihren Vorlagen wiefolgt angezeigt:
if( have_posts() ): while( have_posts() ): the_post(); //The loop endwhile; endif;
Eigentlich stimmt das auchnicht. Die Funktion
have_posts
iteriert dasglobal $wp_query
-Objekt,dasnicht nur mit der Hauptabfrage verknüpftist.global $wp_query;
kann auchmit den sekundären Abfragengeändert werden.function have_posts() { global $wp_query; return $wp_query->have_posts(); }
get_posts ()
Diesistim Wesentlichenein Wrapperfüreine separate Instanzeines WP_Query-Objekts.
Eigentlichist
WP_Query
heutzutageeine Klasse,also haben wireine Instanzeiner Klasse.
Fazit: Zu der Zeit,als @StephenHarris schrieb,war dies höchstwahrscheinlich der Fall,aberim Laufe der Zeit wurden die Dingein WordPressgeändert.
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.
-
Technischgesehen sind alles Filter unter der Haube,Aktionen sindnurein einfacher Filter.Aber Sie haben hier Recht,esisteine Aktion,dieein Argument als Referenz übergibt,was sich voneinfacheren Aktionen unterscheidet.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`gibt ein Array von Post-Objekten zurück,kein` WP_Query`-Objekt,dasist alsoimmernoch korrekt.und `WP_Query` war schonimmereine Klasse,eine Instanzeines class=Objekts.`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
-
Danke,@Milo,ausirgendeinem Grund hatteichein stark vereinfachtes Modellim Kopf.Thanks, @Milo, correct from some reason I had oversimplified model in my head.
- 0
- 2016-12-28
- prosti
Ich habe @nacin's Sie kennen Querygesternnicht und wurdenein bisschenin ein abfragendes Kaninchenlochgeschickt. Vorgestern habeich (fälschlicherweise)
query_posts()
für alle verwendetmeine Abfragebedürfnisse. Jetztbin ichetwas weiserbei der Verwendung vonWP_Query()
. habe abernocheinige grauzonen.Wasich sicher zu wissenglaube:
Wennich zusätzliche Schleifen aneinerbeliebigen Stelle aufeiner Seiteerstelle -in der Seitenleiste,in einer Fußzeile,in "verwandten Posts" usw. -möchteich
WP_Query()
. Ich kann das wiederholt aufeinereinzelnen Seite verwenden,ohne Schaden zunehmen. (Recht?).Wasichnicht sicher weiß
pre_get_posts
vs.WP_Query()
? Sollteichjetztpre_get_posts
für alles verwenden?if have_posts : while have_posts : the_post
und schreibemeinen eigenen < a href="http://codex.wordpress.org/Function_Reference/WP_Query" rel="noreferrer">WP_Query()
? Oder ändereich die Ausgabemithilfe vonpre_get_posts
in meinen Funktionen. PHP-Datei?tl; dr
Die Regeln,dieich daraus ziehenmöchte,sind:
query_posts
niemalsmehrWP_Query()
Dankefürjede Weisheit
Terry
ps: Ich habegesehen undgelesen: Wann sollten Sie WP_Query vs query_posts () vsget_posts () verwenden? Dadurch wirdeine weitere Dimension hinzugefügt -
get_posts
. Beschäftigt sichjedoch überhauptnichtmitpre_get_posts
.