Wie kann ich die Anzahl der Beiträge begrenzen, die WP_Query erhält?
-
-
Nur "posts_per_page=5"Just `'posts_per_page=5'`
- 0
- 2015-03-18
- Pieter Goosen
-
Ichbenutze das,aber das hat alle Beiträgegefunden.Wennich auf die Eigenschaft "found_posts" zugreife,wirdeine höhere Zahl als 5 angegeben. Ichmöchte,dassmeine Abfragenur 5 Beiträgeenthält.Istesmöglich?@PieterGoosenI use that, but that found all the posts. If I access to the `found_posts` property, it says a higher number than 5. I want my query to hold only 5 posts. ¿Is it possible? @PieterGoosen
- 0
- 2015-03-18
- EliasNS
-
Sie sollten den Parameter "nopaging"nicht setzen. Wenn Sie diesen Wert auf "true" setzen,erhalten Sie ** alle ** BeiträgeYou should not set the `nopaging` parameter, setting that to true means to get **all** posts
- 0
- 2015-03-18
- Pieter Goosen
-
@PieterGoosen Wennich den Parameter "nopaging"nicht setze,wird der Standardwert "false" angezeigt,sodass auf der Startseite 5 Beiträge angezeigt werden,die Abfragejedochmehrenthält.Ichfüge der Frageein Bild hinzu.@PieterGoosen If I don't set the `nopaging` parameter it gets the default that is `false`, so the frontpage shows 5 posts, but the query holds more. I add an image to the question.
- 0
- 2015-03-18
- EliasNS
-
Ihre Kommentare sind verwirrend. Sie haben darumgebeten,die Anzahl der aufeiner Seite angezeigten Beiträge auf 5 zubeschränken. Daserhalten Sie.Jetzt sagst du (lies deinen vorherigen Kommentarnocheinmal :-)),die Abfrageenthältmehr.Bitteerkläre.Sie könnenposts_per_pagenichtfestlegen und dannno_pagingin derselben Abfrage auftrue setzen. Entweder wirdposts_per_page ** ODER **nopaging auftruegesetztYour comments are confusing, you asked to limit the amount of posts shown on a page to 5, that is what you get. Now, you say (reread your previous comment :-)) the query holds more. Please explain. You cannot set posts_per_page and then use no_paging set to true in the same query, it is either posts_per_page **OR** nopaging set to true
- 0
- 2015-03-18
- Pieter Goosen
-
Meine Frage sagt "bekommt".Ich denke,wenn die Abfragemehr Beiträgeenthält als diegezeigten,erledigt siemehr Arbeit alsnötig.Ichmöchtenur wissen,obesmöglichist,dies zu vermeiden.Ichmöchte keinenavigierbaren Ergebnissemit einer versteckten Navigation.My question says "gets". I think that if the query holds more posts that the shown ones, it is doing more work than needed. I just want to know if it is possible to avoid that. I don't want navigable results with a hidden navigation.
- 0
- 2015-03-18
- EliasNS
-
Die Abfrageenthält keine weiteren Beiträge,nach denen Siegefragt haben.Wenn Sienach 5fragen,werden 5 Beiträge abgerufen,wennmehr als 5 Beiträge vorhanden sind,die den Anforderungenentsprechen.Führen Sieeinen "var_dump ()" Ihrer Abfrage aus. Wenn Ihre Abfragevariable "$ query"ist,führen Sie "var_dump ($ query->posts)" aus.Sie sehennur die 5 Beiträge,nach denen Siegefragt habenThe query will not hold more posts that you have asked for. If you ask for 5, 5 posts will be retrieved if there is more than 5 posts that matches the requirements. Do a `var_dump()` of your query, like if your query variable is `$query`, do `var_dump( $query->posts )`. You will only see the 5 posts you queried for
- 0
- 2015-03-18
- Pieter Goosen
-
5 Antworten
- Stimmen
-
- 2015-03-18
Ich denke,jetzt versteheich,was Sie versuchen zutun. Wenn Sieeine benutzerdefinierte Abfragemit
WP_Query
ausführen und das Limit sofestlegen,dassnur 5 Beiträgepro Seite abgerufen werden,werdennur 5 Beiträge von der Abfrage abgerufen,und diese Abfrageenthältnur 5 Beiträge, ABER Aus Gründen der Paginierung durchläuftWP_Query
weiterhin diegesamte Datenbank und zählt alle Beiträge,die den Kriterien der Abfrageentsprechen.Dies wird angezeigt,wenn Sie sich die Eigenschaften
$found_posts
und$max_num_pages
der Abfrage ansehen. Nehmen wirein Beispiel:Sie haben 20 Posts,die zum Standardposttyp
post
gehören. Sie nur benötigen die letzten 5 Beiträge ohne Paginierung. Ihre Anfrage siehtfolgendermaßen aus$ q=neue WP_Query ('posts_per_page=5');
-
var_dump ($ q- >posts)
gibt Ihnen die letzten 5 Posts wieerwartet -
echo $ q- >found_posts
gibt Ihnen20
-
echo $ q- >max_num_pages
gibt Ihnen4
Die Auswirkungen dieser zusätzlichen Arbeit sind auf Websitesmit nur wenigen Postsminimal. Dies kannjedochteuer werden,wenn Sieeine Sitemit Hunderten oder Tausenden von Postsbetreiben. Diesisteine Verschwendung von Ressourcen,wenn Sieimmernur die 5neuesten Beiträgebenötigen
Esgibt einen undokumentierten Parameternamens
no_found_rows
,derboolesche Werte verwendet,mit denen Sie Ihre Abfragebeenden können,nachdem die 5benötigten Beiträgegefunden wurden. Dadurch wirdWP_Query
gezwungen,nichtmehrnach Posts zu suchen,die die Kriterienberechnen,nachdem die Anzahl der abgefragten Posts abgerufen wurde. Dieser Parameteristbereitsinget_posts
integriert. Deshalbistget_posts
etwas schneller alsWP_Query
,obwohlget_posts
WP_Query Schlussfolgerung
Wenn Siefüreine Abfrage keine Paginierung verwendenmöchten,istesimmer ratsam,in Ihrer Abfrage
'no_found_rows=true'
zu verwenden,um die Arbeit zubeschleunigen und Ressourcenverschwendung sparen.I think that now I understand what you are trying to do. When you run a custom query with
WP_Query
and set the limit to get only 5 posts per page, only 5 posts will be retrieved by the query and that query will only hold 5 posts, BUT for the sake of pagination,WP_Query
still runs through the whole database and counts all the posts that matches the criteria of the query.That can be seen when you look at the
$found_posts
and$max_num_pages
properties of the query. Lets take an example:You have 20 posts belonging to the default post type
post
. You only need the latest 5 posts without pagination. Your query looks like this$q = new WP_Query( 'posts_per_page=5' );
var_dump( $q->posts )
will give you the latest 5 posts as expectedecho $q->found_posts
will give you20
echo $q->max_num_pages
will give you4
The impact of this extra work is minimal on sites with only a few posts, but this can gt expensive if you are running a site with hundreds or thousands of posts. This is a waste of resources if you are only ever going to need the 5 latest posts
There is an undocumented parameter called
no_found_rows
which uses boolean values which you can use to make your query bail after it found the 5 posts you need. This will forceWP_Query
not to look for any more posts mathing the criteria after it has retrieved the amount of posts queried. This parameter is already build intoget_posts
, that is whyget_posts
is a bit faster thanWP_Query
althoughget_posts
usesWP_Query
Conclusion
In conclusion, if you are not going to use pagination on a query, it is always wise to
'no_found_rows=true'
in your query to speed things up and to save on wasting resources. -
- 2015-03-18
Nach dem Gesprächmit @Pieter Goosen über die Kommentare der Frage denkeich,dassich die Fragebeantworten undmeinen Fehlererklären kann.
Der Schlüsselist,dass
found_posts
mich verwirrt hat.Ich denke,diese Nummerist die abgerufenen Beiträge,abernicht. Diesist die Anzahl der Beiträge,die den Kriterienentsprechen. Esist,als hätte dieWP_Query
zwei Teile:einen zum Auffinden (aller) Beiträge undeinen zum Abrufen des Inhalts,wennnach den Parameternpagination
gesucht wird.Wir haben also die Eigenschaft$post_count
,die die Anzahl der abgerufenen Beiträge angibt (Codex sagtDie Anzahl der angezeigten Beiträge
),dienatürlich der Anzahl aufposts_per_page -Parameter und die Anzahl der Elementein der Array-Eigenschaft $posts
.WP_Query
macht also keinenutzlose Arbeit,wieich dachte ^^Hoffe,das hilft anderen!
After the conversation with @Pieter Goosen on the comments of the question, I think I can answer the question and explain my mistake.
The key is that
found_posts
was confussing me. I thougth that, that number is the posts retrieved but is not. It is the number of posts that match the criteria. It's like theWP_Query
had 2 parts: one for finding (all) the posts, and other for fetching the content, when it checks for thepagination
parameters. So we have the$post_count
property that is the number of posts fetched (Codex saysThe number of posts being displayed
), that of course is equal to the number onposts_per_page
parameter, and the number of items on the$posts
array property.So
WP_Query
is not doing any useless work, as I thought ^^Hope this helps others!
-
Siehemeine Antwort.Ichglaubeich verstehe was dumeinst :-)See my answer. I think I understand what you mean :-)
- 0
- 2015-03-18
- Pieter Goosen
-
Ja!Du hastes sehrgutgemacht: D Endlich habeich den Weg dazugefunden undich verstehe alles=D Danke @PieterGoosen!Yes! You did it very well :D Finally I got the way to do it, and I understand all =D Thanks @PieterGoosen!
- 0
- 2015-03-19
- EliasNS
-
Getan!Eserweitertemeine eigene Antwort ^^ @PieterGoosenDone! It extended my own answer ^^ @PieterGoosen
- 0
- 2015-03-19
- EliasNS
-
- 2015-03-18
Ok,Sie können den Beitragstyp "blog_posts" verwenden und 5 Beiträge dieses Beitragstyps abrufen.Folgendesmüssen Sietun:
$args = array( 'post_type' => 'blog_posts', 'posts_per_page' => '5', ); $query = new WP_Query($args);
Die obige Abfragegibt 5 Beiträge vom Typ 'blog_posts' zurück. Wennes sichnicht umeinen benutzerdefinierten Beitragstyp handelt,ersetzen Sieihneinfach wiefolgt.
'post_type' => 'posts',
Wenn Sie alle Posts abrufenmöchten,ersetzen Sie diese wiefolgt:'posts_per_page' => '-1',
,für weitere Details WP-AbfrageOk , lets you have post type called 'blog_posts' , and you want to fetch 5 posts of that post type . Here is what you need to do
$args = array( 'post_type' => 'blog_posts', 'posts_per_page' => '5', ); $query = new WP_Query($args);
The above query will return 5 posts of type 'blog_posts' , if it is not a custom post type , then just replace like this
'post_type' => 'posts',
if you want to fetch all posts then replace like this'posts_per_page' => '-1',
, for more details WP Query-
Siehebitte die Kommentare zu der Frage.See the comments on the question, please.
- 0
- 2015-03-18
- EliasNS
-
- 2015-03-18
Ich weiß,dass @ user1750063 den Codeerwähnt hat,aber versuchen Sie dies
$args = array ( 'post_type' => 'custom_post', 'nopaging' => false, 'posts_per_page' => '5', 'order' => 'DESC', 'orderby' => 'ID', ); $query = new WP_Query( $args ); if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); // display content } } else { // display when no posts found } wp_reset_postdata(); // Restore original Post Data
I know that @user1750063 has mentioned the code but try this
$args = array ( 'post_type' => 'custom_post', 'nopaging' => false, 'posts_per_page' => '5', 'order' => 'DESC', 'orderby' => 'ID', ); $query = new WP_Query( $args ); if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); // display content } } else { // display when no posts found } wp_reset_postdata(); // Restore original Post Data
-
"id"ist als "orderby" -Wert ungültig und "pagination"istein ungültiger Parameter`id` is invalid as an `orderby` value and `pagination` is an invalid parameter
- 0
- 2015-03-18
- Pieter Goosen
-
`Paginierung`ist keingültiger Parameter.Dumeinst "Nopaging"=> wahr "?Wennja,dannbekommeich ALLE Beiträge.Das willichnicht.@PieterGoosen Ich denkeermeint "ID".`pagination`is not a valid parameter. You mean `'nopaging' => true`? If yes, then I'll get ALL posts. That's not what I want. @PieterGoosen I think he means `ID`.
- 0
- 2015-03-18
- EliasNS
-
orderby dient zur Anzeige der Bestellung,oder?Der Nopaging-Wert/-Parameter wird dadurchnichtbeeinträchtigt. @PieterGoosen warumist ID & orderby ungültig?Können Sie den Punkt klarstellen?orderby is for displaying the order, right? It does not harm the nopaging value/ parameter. @PieterGoosen why is ID & orderby is invalid? Can you clarify the point?
- 0
- 2015-03-18
- Shreyo Gi
-
Es sollte "ID" sein,nicht "ID"It should be `ID`, not `id`
- 0
- 2015-03-18
- Pieter Goosen
-
- 2020-06-18
Ich würdeesmit benutzerdefinierten Felderneinschränken. Überprüfen Sie dieses Abfragebeispiel unten:
$wp_query = new WP_Query("orderby=DESC&post_type=portfolio&meta_key=FeaturedProject&meta_value=1&posts_per_page=6");
Es werden 6 vorgestellte Projekte zurückgegeben.
I would limit it with custom fields, check this query sample below:
$wp_query = new WP_Query("orderby=DESC&post_type=portfolio&meta_key=FeaturedProject&meta_value=1&posts_per_page=6");
It will return 6 Featured projects.
Ich habe über Google und WPSE recherchiert und sehenur wiederholt die Verwendung von
showposts
,die veraltet sind.Ichbin mit
WP_Query
vertraut und dachte,wennichposts_per_page
aufmein Limit (dh 5) undnopaging
auf setzetrue
,es würde zuetwas wie " Ok,ichgebe dirnur 5 Beiträge ".Diesfunktioniertjedochnicht.Wie kannich dasmachen?