WP_Query ayant une mémoire absurde

10

Chaque fois que j'appelle WP_Query () dans la fonction ci-dessous, Wordpress perd 8 Mo de mémoire. Et depuis que j'appelle beaucoup cette fonction, les choses se compliquent assez rapidement ... :( J'ai essayé de supprimer le $ queryObject résultant et 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;
}
    
posée rinogo 01.06.2012 - 05:25

2 réponses

14

Excellentes réponses sur WP Hackers: enlace

  

Ce que vous faites avec cette requête, vous chargez CHAQUE poste correspondant dans   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   faire correspondre les post_ids à la place, ce qui devrait réduire la mémoire (et   temps de traitement) de manière significative:

     

enlace

    
réponse donnée rinogo 06.06.2012 - 22:31
3

Nous sommes tombés sur cela pendant que nous recherchions le problème de mémoire signalé ici.

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

    
réponse donnée Thomas 26.08.2012 - 02:53

Lire d'autres questions sur les étiquettes