WP_Query perdiendo cantidades absurdas de memoria

10

Cada vez que llamo a WP_Query () en la siguiente función, Wordpress pierde 8 megas de memoria. Y como llamo mucho a esta función, las cosas se ponen peludas con bastante rapidez ... :( Intenté desactivar el $ queryObject resultante y también llamé periódicamente a wp_cache_flush (), pero ninguno parece tener ningún efecto. ¿Alguna idea?

function get_post_ids_in_taxonomies($taxonomies, &$terms=array()) {
    $post_ids = array();

    $query = gen_query_get_posts_in_taxonomies($taxonomies, $terms);
    // var_dump($query);

    //Perform the query
    $queryObject = new WP_Query($query); //*****THE 8 MEGABYTES IS LEAKED HERE*****

    //For all posts found...
    if($queryObject->have_posts()) {
        while($queryObject->have_posts()) {
            $queryObject->the_post();

            //Get the $post_id by capturing the output of the_ID()
            ob_start();
            the_ID();
            $post_id = (int) ob_get_contents();
            ob_end_clean();

            // echo $post_id."\n";
            $post_ids[] = $post_id;
        }
    }

    unset($queryObject);

    return $post_ids;
}

gen_query_get_posts_in_taxonomies () es:

function gen_query_get_posts_in_taxonomies($taxonomies, &$terms=array()) {
    //General query params
    $query = array(
        'posts_per_page'    => -1,  //Get all posts (no paging)
        'tax_query'             => array('relation' => 'OR'),
    );

    //Add the specific taxonomies and terms onto $query['tax_query']
    foreach($taxonomies as $tax) {
        //Get terms in the taxonomies if we haven't yet
        if(!array_key_exists($tax, $terms)) {
            $terms[$tax] = array();

            $terms_tmp = get_terms($tax);
            foreach($terms_tmp as $tt)
                $terms[$tax][] = $tt->term_taxonomy_id;
        }

        $query['tax_query'][] = array(
            'taxonomy' => $tax,
            'terms' => $terms[$tax],
            'field' => 'term_taxonomy_id',
        );
    }

    return $query;
}
    
pregunta rinogo 01.06.2012 - 05:25

2 respuestas

14

Excelentes respuestas en WP Hackers: enlace

  

Lo que estás haciendo con esa consulta, es cargar CADA publicación coincidente en   Memoria, incluyendo el contenido completo de la publicación.   Como puedes imaginar, esto es probablemente una gran cantidad de elementos.

     

Puedes pasar 'campos' = > 'IDs' en WP_Query para simplemente devolver una lista   de post_ids coincidentes, lo que debería reducir la memoria (y   tiempo de procesamiento) significativamente:

     

enlace

    
respondido por el rinogo 06.06.2012 - 22:31
3

Encontré esto mientras investigaba el problema de la memoria señalado aquí.

En este caso, puede usar get_the_id en lugar de usar el almacenamiento en búfer para capturar la identificación, y podría restringir los campos consultados para incluir solo las identificaciones.

    
respondido por el Thomas 26.08.2012 - 02:53

Lea otras preguntas en las etiquetas