pre_get_posts con get_posts

2

Por lo tanto, en la plantilla tengo varias publicaciones y controles deslizantes destacados y 2 bucles predeterminados.

Uso get_posts para todo excepto los bucles predeterminados (obviamente).

Ahora el problema que tengo es excluir get_posts de publicaciones de los bucles principales. Podría haber ido query_posts way pero el impacto en el rendimiento es malo y quiero trabajar en el bucle principal incluso antes de que se genere.

Así que voy a usar pre_get_posts en functions.php.

Dentro de los pre_get_posts, modificaré el bucle principal y excluiré los datos de get_posts.

Tengo problemas siguientes:

  1. Necesito usar get_posts dentro de la plantilla, por lo que debo declarar las variables como globales :( de lo contrario, no será accesible dentro de mi plantilla.

  2. get_posts inside pre_get_posts me da problemas de memoria: Error grave: el tamaño de memoria permitido de 134217728 bytes se agotó (se intentó asignar 130968 bytes


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' );
    
pregunta Nicolai 24.05.2015 - 11:52

1 respuesta

4

En primer lugar, estás invocando un bucle infinito, lo que provoca el agotamiento de la memoria. Para evitarlo, coloque lo siguiente al comienzo de su función:

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

Se asegura de que no lo estés conectando a pre_get_posts una y otra vez, reiniciando tu llamada get_posts() una y otra vez.

En segundo lugar, utilice WP_Query 's - y posteriormente get_posts ' s - the fields parámetro / a>, eligiendo ids como valor, lo que reduce la carga de memoria / trabajo al obtener solo ID.

    
respondido por el Nicolai 24.05.2015 - 12:13

Lea otras preguntas en las etiquetas