Eine Versuchsanordnung: Wie kann ich die Anzahl der angezeigten Posts ändern.
Egal ob es um das Anzeigen von Artikeln auf den diversen Seiten geht, oder darum, mit zb der WP_Query Posts zu holen. Die Anzahl spielt oft eine Rolle.
Um die verschiedenen Wege aufzuzeigen, gibt es diesen Artikel :)
Es sind ein paar schräge bzw ungewöhnliche Lösungswege dabei, aber da geht es auch darum, grundsätzliche Funktionen von WordPress zu veranschaulichen.
Wie viele Posts auf der Seite aufscheinen oder ich mit einer Query bekommen möchte, lässt sich auf mehrere Arten lösen.
Hier der Kurzüberblick über die Möglichkeiten:
- Einstellen im Backend
- Mit wp_query Parameter posts_per_page
- Mit Action pre_get_posts
- Mit Filter parse_query
- Mit Action parse_request
- Mit Filter post_limits
- Mit Filter pre_option_posts_per_page
- Durch Ändern des wp_option Werts posts_per_page (!)
- Mit PHP
1. Einstellen im Backend
Der einfachste Weg ist sicherlich, Im WordPress Backend unter Einstellungen -> Lesen die gewünschte Anzahl zu ändern.
Wobei die Anzahl separat für Einträge auf den Seiten und für den RSS Feed angepasst werden kann:
2. Mit wp_query Parameter posts_per_page
Wenn eigene Loops oder Queries mit wp_query angestoßen werden, kann man ganz einfach den Parameter „posts_per_page“ verwenden:
$meine_neue_query = new WP_Query( 'posts_per_page=3' ); oder $args_fuer_custom_posts = array( 'posts_per_page' => 3 ); $custom_posts = new WP_Query( $args_fuer_custom_posts );
Man kann für Archivseiten den Parameter posts_per_archive_page verwenden, der den vorhergehenden Parameter eben auf Archivseiten überschreibt.
3. Mit Action pre_get_posts
Die pre_get_posts Action ist mächtig und bietet viele Möglichkeiten, um das Query Ergebnis anzupassen. Eine davon verändert die Anzahl der zurückgegebenen Posts:
function aendere_post_anzahl_wpent( $query ) { if ( ! is_admin() && ! $query->is_main_query() ) $query->set( 'posts_per_page', 3 ); } add_action( 'pre_get_posts', 'aendere_post_anzahl_wpent' );
Bei pre_get_posts lassen sich einige (aber nicht alle) Conditional Tags verwenden.
4. Mit Filter parse_query
Der Filter parse_query funktioniert ähnlich wie die Action pre_get_posts
function aendere_post_anzahl_mit_pq_wpent( $query ) { if ( ! is_admin() && 'portfolio' == $query->query_vars['post_type'] ) { $query->set( 'posts_per_page', 1 ); } return $query; } add_filter( 'parse_query', 'aendere_post_anzahl_mit_pq_wpent' );
Wie bei pre_get_posts kann man auch bei parse_query Conditional Tags verwenden.
5. Mit Action parse_request
Die Action parse_request ist etwas kniffliger zu handhaben, weil diese nur für die eigentliche Query gilt. Ich kann damit keine Custom Queries / Loops ändern, die ich mit wp_query o.ä. anstoße.
Parse_request macht aus der Url die Query und befüllt $wp->query_vars.
Das ist der Grund, warum ich hier keine wp_query Dinge ändern kann sondern nur die Standardquerie. Und das geht so:
add_action( 'parse_request', 'aendere_post_anzahl_mit_pr_wpent' ); function aendere_post_anzahl_mit_pr_wpent( $query ) { if ( 'mein_cpt' == $query->query_vars['post_type'] ) { $query->query_vars[ 'posts_per_page' ] = 3; } return $query; }
Zusätzliche Inspiration zu parse_request findet man hier:
https://wordpress.stackexchange.com/questions/27158/wordpress-multiple-category-search?answertab=active#tab-top
6. Mit dem Filter post_limits
Mit post_limits kann man wiederum jede Query ändern und so die Anzahl der Posts einstellen:
add_filter( 'post_limits', 'andere_post_anzahl_durch_pl_wpent', 10, 2 ); function andere_post_anzahl_durch_pl_wpent( $limit, $query ) { if ( ! is_admin() && ! $query->is_main_query() && ! $query->is_search() ) { return 'LIMIT 0, 3'; } return $limit; }
7. Mit dem Filter pre_option_posts_per_page
Der Filter pre_option_posts_per_page gehört zum Filterbundle pre_option_(option_name). Dieser Filter ist besonders praktisch, wenn ich Werte aus der Options Tabelle verwende/brauche, ich diese aber nicht verändert in der Datenbank abspeichern will.
Wenn ich den Options Wert also nur kurz abwandeln und damit arbeiten will, ohne fix vorgegebene Werte zu verändern.
In unserem Fall ist ja der Wert, wie viele Posts angezeigt werden sollen, in der wp_options mit dem Eintrag „posts_per_page“ gespeichert. Dieser Options Eintrag hat standardmäßig den Wert 10 und kann vom User (siehe Screenshot oben) im Backend verändert werden.
Man könnte den Wert jetzt in den Options ändern (schlechte Idee, siehe unten) oder einfach einen temporären Wert verwenden, siehe:
add_filter( 'pre_option_posts_per_page', 'anzahl_aendern_mit_ppp_wpent' ); function anzahl_aendern_mit_ppp_wpent( $posts_per_page ) { global $wp_query; if ( 'mein_cpt' == $wp_query->query_vars['post_type'] ) return 3; return $posts_per_page; }
Ein weiterer Options Eintrag besteht für die Anzahl der angezeigten Artikel im RSS Feed (siehe Screenshot oben). Das Gegenstück zu pre_option_posts_per_page ist dann pre_option_posts_per_rss. (Options Eintrag „posts_per_rss„)
8. Durch Ändern des wp_option Werts posts_per_page
Wenn im Backend der Punkt „Blogseiten zeigen maximal [ x ] Werte“ geändert wird, wird der Wert in der Datenbank gespeichert. Genauer gesagt in der Tabelle wp_options.
Man kann daher hergehen und einfach diesen options Wert ändern, zb mit
update_option( 'posts_per_page', 3 );
Der Options-Eintrag lautet „posts_per_page“ (oder posts_per_rss für RSS Feeds) und kann per PHP Code angepasst werden.
Das ist aber meist eine schlechte Idee, weil dadurch Usereingaben verändert werden können. Der Benutzer bekommt von der Änderung nichts mit und sieht dann andere Ergebnisse, als er sich eigentlich erwartet hat.
9. Durch PHP eigene Funktionen oder mit JavaScript usw usf
Wenn die Daten von der Datenbank geholt wurden, habe ich immer noch die Möglichkeit mit stinknormalen PHP Funktionen die Anzahl zu ändern.
Oder aber auch auf der letzten Instanz, per JavaScript im Browser des Users, des Seitenbetrachters.
Dieser Punkt hat mit WordPress selbst nicht mehr viel zu tun, daher werden die Möglichkeiten hier nicht besprochen.
Alle hier gezeigten Funktionen/Hooks wurden getestet und funktionieren unter WordPress 4.1.