WP_Query vazando quantidades absurdas de memória


10

Toda vez que eu chamo WP_Query () na função abaixo, o Wordpress vaza 8 megas de memória. E como eu chamo muito essa função, as coisas ficam peludas rapidamente ... :( Tentei desconfigurar o $ queryObject resultante, além de chamar periodicamente wp_cache_flush (), mas nenhum deles parece ter algum efeito.

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 () é:

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;
}

11
Você já experimentou o plugin DEBUG BAR?
Kaiser

quantas postagens são buscadas WP_Queryse o seu caso (quando 8mb vazou)?
Eugene Manuilov

Respostas:


14

Excelentes respostas sobre os hackers do WP: http://lists.automattic.com/pipermail/wp-hackers/2012-June/043213.html

O que você está fazendo com essa consulta é carregar TODAS as postagens correspondentes na memória, incluindo o conteúdo completo da postagem. Como você pode imaginar, isso provavelmente é um monte de itens.

Você pode passar 'fields' => 'ids' para o WP_Query para simplesmente retornar uma lista de post_ids correspondentes, o que deve reduzir significativamente a memória (e o tempo de processamento):

http://codex.wordpress.org/Class_Reference/WP_Query#Post_Field_Parameters


3

Tropecei nisso enquanto pesquisava o problema de memória apontado aqui.

Nesse caso, você pode usar get_the_id em vez de usar buffer para capturar o ID e restringir os campos consultados para incluir apenas IDs.


Obrigado pela resposta, Thomas! Acabei escrevendo um pouco de SQL bruto, pelo que me lembro. No entanto, isso provavelmente teria funcionado também. Muito obrigado! :)
rinogo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.