WP_Query perde quantità assurde di memoria


10

Ogni volta che chiamo WP_Query () nella funzione seguente, Wordpress perde 8 mega di memoria. E dal momento che chiamo molto questa funzione, le cose diventano pelose abbastanza rapidamente ... :( Ho provato a annullare il risultante $ queryObject e a chiamare periodicamente wp_cache_flush (), ma nessuno dei due sembra avere alcun effetto. Qualche 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 () è:

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

1
Hai provato il plugin DEBUG BAR?
Kaiser

di quanti post viene recuperato WP_Queryse il tuo caso (quando è trapelato 8mb)?
Eugene Manuilov,

Risposte:


14

Ottime risposte sugli hacker WP: http://lists.automattic.com/pipermail/wp-hackers/2012-June/043213.html

Quello che stai facendo con quella query, sta caricando OGNI post corrispondente nella memoria, incluso l'intero contenuto del post. Come puoi immaginare, si tratta probabilmente di molti oggetti.

Puoi passare 'fields' => 'ids' in WP_Query per restituire semplicemente un elenco di post_id corrispondenti, il che dovrebbe ridurre significativamente la memoria (e il tempo di elaborazione):

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


3

Ci siamo imbattuti in questo durante la ricerca del problema di memoria indicato qui.

In questo caso, puoi utilizzare get_the_id invece di utilizzare il buffering per acquisire l'id e puoi restringere i campi interrogati per includere solo gli id.


Grazie per la risposta, Thomas! Ho appena finito di scrivere un po 'di SQL grezzo, come ricordo. Tuttavia, probabilmente avrebbe funzionato anche questo. Grazie mille! :)
rinogo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.