WordPress
Alternierende Hauptschleife (Filter pre_get_posts)
Suche…
Syntax
- add_action ('pre_get_posts', 'callback_function_name');
- Funktion callback_function_name ($ query) {}
- // für PHP 5.3.0 oder höher
- add_action ('pre_get_posts', Funktion ($ query) {});
Parameter
Parameter | Einzelheiten |
---|---|
$ Abfrage | (WP_Query) Schleifenobjekt |
Bemerkungen
Wenn Sie PHP 5.3.0 oder höher verwenden, können Sie Closures ( anonyme Funktionen ) verwenden.
add_action( 'pre_get_posts', function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
});
Noch spezifischeres Loop-Targeting
Angenommen, wir möchten die Hauptschleife nur für eine bestimmte Taxonomie oder einen Post-Typ ändern.
Targeting nur Hauptschleife auf book
Post Art Archivseite.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
if( !is_post_type_archive( 'book' ) ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
// - and we are on 'book' post type archive page
}
Sie können mit is_category()
, is_tag()
und is_tax()
auch nach Kategorien, Tags oder benutzerdefinierten Taxonomie-Archivseiten is_tax()
.
Sie können jedes in WordPress verfügbare bedingte Tag verwenden .
Zeige Beiträge aus nur einer Kategorie
add_action( 'pre_get_posts', 'single_category' );
function single_category( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'cat', '1' );
return;
}
Beiträge vor dem Abrufen von Posts filtern die grundlegende Verwendung
Manchmal möchten Sie die Haupt-WordPress-Abfrage ändern.
Filter pre_get_posts
ist der Weg zu gehen.
Zum Beispiel pre_get_posts
Sie mit pre_get_posts
Hauptschleife mitteilen, dass sie nur 5 Beiträge pre_get_posts
. Oder um Beiträge nur aus einer Kategorie anzuzeigen oder jegliche Kategorie auszuschließen usw.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
// here goes logic of your filter
}
Wie Sie sehen, übergeben wir das Hauptschleifen- Abfrageobjekt in unser Callback-Funktionsargument.
Wichtiger Hinweis hier: Wir übergeben Argumente als Referenz . Das bedeutet, dass wir keine Abfrage zurückgeben oder Globals setzen müssen, damit es funktioniert. Da $query
eine Referenz auf das Hauptabfrageobjekt ist, werden alle Änderungen, die wir an unserem Objekt vornehmen, sofort im Hauptschleifenobjekt angezeigt.
Kategorie aus der Beitragsliste entfernen freigeben
add_action( 'pre_get_posts', 'single_category_exclude' );
function single_category_exclude( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'cat', '-1' );
return;
}
Ändern Sie posts_per_page für die Hauptschleife
Alles was wir tun müssen, ist die set()
Methode des $query
Objekts zu verwenden.
Es braucht zwei Argumente, erstens was wir setzen wollen und zweitens welchen Wert Sie setzen wollen.
add_action( 'pre_get_posts', 'change_posts_per_page' );
function change_posts_per_page( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
$query->set( 'posts_per_page', 5 );
return;
}
Targeting nur für die Haupt-WordPress-Schleife
WordPress wendet den pre_get_posts
Filter buchstäblich auf jede erzeugte Schleife an. Das bedeutet, dass alle Änderungen, die wir an unserer Callback-Funktion vornehmen, auf alle vorhandenen Loops angewendet werden.
Natürlich wollen wir es in den meisten Szenarien nicht.
In den meisten Fällen möchten wir nur die Hauptschleife anvisieren und nur für Nicht-Administrationsbildschirme.
Wir können die is_main_query()
-Methode und die globale Funktion is_admin()
verwenden, um zu überprüfen, ob wir am richtigen Ort sind.
add_action( 'pre_get_posts', 'my_callback_function' );
function my_callback_function( $query ) {
if( !$query->is_main_query() || is_admin() ) return;
// this code will run only if
// - this query is main query
// - and this is not admin screen
}