WP_Query fuit des quantités absurdes de mémoire


10

Chaque fois que j'appelle WP_Query () dans la fonction ci-dessous, Wordpress perd 8 Mo de mémoire. Et comme j'appelle souvent cette fonction, les choses deviennent assez rapidement velues ... :( J'ai essayé de désactiver le $ queryObject résultant ainsi que d'appeler périodiquement wp_cache_flush (), mais aucun ne semble avoir d'effet. Des pensées?

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

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
Avez-vous essayé le plugin DEBUG BAR?
kaiser

par combien de messages est récupéré WP_Querysi votre cas (lorsque 8 Mo est divulgué)?
Eugene Manuilov

Réponses:


14

Excellentes réponses sur WP Hackers: http://lists.automattic.com/pipermail/wp-hackers/2012-June/043213.html

Ce que vous faites avec cette requête, c'est de charger CHAQUE publication correspondante dans la mémoire, y compris le contenu complet de la publication. Comme vous pouvez l'imaginer, c'est probablement beaucoup d'articles.

Vous pouvez passer 'fields' => 'ids' dans WP_Query pour simplement renvoyer une liste de post_ids correspondants, ce qui devrait réduire considérablement la mémoire (et le temps de traitement):

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


3

Je suis tombé dessus lors de la recherche sur le problème de mémoire indiqué ici.

Dans ce cas, vous pouvez utiliser get_the_id au lieu d'utiliser la mise en mémoire tampon pour capturer l'ID, et vous pouvez restreindre les champs interrogés pour inclure uniquement les ID.


Merci pour la réponse, Thomas! Je viens de finir d'écrire du SQL brut, si je me souviens bien. Cependant, cela aurait probablement fonctionné aussi. Merci beaucoup! :)
rinogo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.