web-dev-qa-db-fra.com

pre_get_posts avec get_posts

Donc, dans le modèle, j'ai plusieurs messages et curseurs en vedette et deux boucles par défaut.

J'utilise get_posts pour tout sauf les boucles par défaut (évidemment).

Maintenant, le problème que je rencontre est d'exclure les publications get_posts des boucles principales. J'aurais pu utiliser la méthode query_posts, mais l'impact sur les performances est mauvais et je souhaite travailler sur la boucle principale avant même qu'elle ne soit générée.

Je vais donc utiliser pre_get_posts dans functions.php.

À l'intérieur de pre_get_posts, je vais modifier la boucle principale et exclure les données get_posts.

J'ai des problèmes suivants:

  1. Je dois utiliser get_posts dans le modèle, donc je dois déclarer la variable qui les contient comme globale :( sinon, elle ne sera pas accessible dans mon modèle.

  2. get_posts à l'intérieur de pre_get_posts me donne des problèmes de mémoire: Erreur fatale: une taille de mémoire autorisée de 134217728 octets est épuisée (tentative d'allocation de 130 968 octets).


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

Tout d'abord, vous invoquez une boucle infinie, ce qui provoque l'épuisement de la mémoire. Pour éviter cela, mettez ce qui suit au début de votre fonction:

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

Il s'assure que vous ne le connectez pas à pre_get_posts encore et encore, en relançant votre appel get_posts() encore et encore.

Deuxièmement, utilisez WP_Query - et ensuite get_posts - le paramètre fields , en choisissant ids comme valeur, ce qui réduit la charge mémoire/travail en obtenant uniquement les ID.

4
Nicolai