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

rinogo
fonte
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.

Thomas
fonte
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