wake-up-neo.com

pre_get_posts mit get_posts

Also habe ich in der Vorlage mehrere vorgestellten Beiträge und Schieberegler und 2 Standardschleifen.

Ich benutze get_posts für alles außer Standardschleifen (offensichtlich).

Jetzt ist das Problem, das ich habe, das Ausschließen von get_posts Beiträgen von Hauptschleifen. Ich hätte den query_posts Weg gehen können, aber die Auswirkungen auf die Leistung sind schlecht und ich möchte an der Hauptschleife arbeiten, noch bevor sie generiert wird.

Also werde ich pre_get_posts in functions.php verwenden.

In pre_get_posts ändere ich die Hauptschleife und schließe get_posts-Daten aus.

Ich habe folgende Probleme:

  1. Ich muss get_posts in der Vorlage verwenden, also muss ich die Variable, die diese enthält, als global deklarieren :( Andernfalls ist sie in meiner Vorlage nicht verfügbar.

  2. get_posts in pre_get_posts gibt mir Speicherprobleme: Schwerwiegender Fehler: Zulässige Speichergröße von 134217728 Bytes 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' );
2
user8842

Erstens rufen Sie eine Endlosschleife auf, die die Speichererschöpfung verursacht. Um dies zu vermeiden, setzen Sie Folgendes an den Anfang Ihrer Funktion:

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

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

Zweitens verwenden Sie WP_Querys - und anschließend get_postss - den Parameter fieldsNAME_ und wählen idsals Wert aus, wodurch die Speicher-/Arbeitslast verringert wird, indem nur IDs abgerufen werden.

4
Nicolai