pre_get_posts mit get_posts

Also in der Vorlage habe ich mehrere vorgestellte Beiträge und Schieberegler und 2 Standard-Schleifen.

Ich benutze get_posts für alles außer Standard-Schleifen (natürlich).

Das Problem, das ich habe, schließt get_posts Beiträge von Hauptschleifen aus. Ich hätte query_posts Weg gehen können, aber die Auswirkungen auf die performance ist schlecht und ich möchte auf Hauptschleife noch vor seiner Generierung arbeiten.

Also werde ich pre_get_posts in functions.php verwenden.

Inside pre_get_posts Ich werde Hauptschleife ändern und get_posts Daten ausschließen.

Ich habe folgende Probleme:

  1. Ich muss get_posts innerhalb der Schablone benutzen, also muss ich Variable erklären, die diese als global hält: (sonst wird es innerhalb meiner Schablone nicht zugänglich sein.

  2. get_posts in pre_get_posts gibt mir Speicherprobleme: Schwerwiegender Fehler: Erlaubte Speichergröße von 134217728 Byte erschöpft (versucht, 130968 Bytes zuzuweisen)

 function RoomsGazette_homepage_content( $query ) { //$tweets = getTweets( 4, $titan->getOption( 'tweets_from_user' ) ); $header_sliders = get_posts( array( 'meta_key' => 'roomsgazette_hp_position', 'meta_value' => 1, 'posts_per_page' => 5, ) ); //$footer_sliders = get_posts( array( 'meta_key' => 'roomsgazette_hp_position', 'meta_value' => 2, 'posts_per_page' => 5, ) ); //$featured = get_posts( array( 'meta_key' => 'roomsgazette_hp_position', 'meta_value' => 3, 'posts_per_page' => 2, ) ); $exclude_ids = array(); foreach ( $header_sliders as $tmp ) { array_push( $exclude_ids, $tmp->ID ); } foreach ( $footer_sliders as $tmp ) { array_push( $exclude_ids, $tmp->ID ); } foreach ( $featured as $tmp ) { array_push( $exclude_ids, $tmp->ID ); } if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'post__not_in', $exclude_ids ); } } add_action( 'pre_get_posts', 'RoomsGazette_homepage_content' ); 

Solutions Collecting From Web of "pre_get_posts mit get_posts"

Zuerst rufen Sie eine Endlosschleife auf, die die Speicherauslastung verursacht. Um dies zu vermeiden, setzen Sie Folgendes am Anfang Ihrer function:

 // avoid infinite loop remove_action( 'pre_get_posts', __FUNCTION__ ); 

Es stellt sicher, dass Sie es nicht immer wieder in pre_get_posts und Ihren Aufruf get_posts() immer wieder neu initiieren.

Zweitens, benutze WP_Query – und anschließend get_posts – den Parameter fields und wähle ids als Wert, was die Speicher- / Arbeitslast reduziert, indem nur IDs erhalten werden.