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;
}
rinogo
la source
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

rinogo
la source
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.

Thomas
la source
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