WP_Query membocorkan jumlah memori yang tidak masuk akal

10

Setiap kali saya memanggil WP_Query () pada fungsi di bawah ini, Wordpress membocorkan memori 8 MB. Dan karena saya sering memanggil fungsi ini, banyak hal menjadi sangat cepat ... :( Saya sudah mencoba mengurung $ queryObject yang dihasilkan serta secara berkala memanggil wp_cache_flush (), tetapi tampaknya tidak ada efek. Pikiran?

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

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
sumber
1
Sudahkah Anda mencoba plugin DEBUG BAR?
kaiser
berapa banyak posting yang diambil WP_Queryjika kasing Anda (ketika 8MB bocor)?
Eugene Manuilov

Jawaban:

14

Respons luar biasa pada WP Hackers: http://lists.automattic.com/pipermail/wp-hackers/2012-June/043213.html

Apa yang Anda lakukan dengan permintaan itu, adalah memuat SETIAP posting yang cocok ke dalam memori, termasuk konten posting lengkap. Seperti yang dapat Anda bayangkan, ini mungkin item yang cukup banyak.

Anda dapat meneruskan 'bidang' => 'id' ke WP_Query untuk mengembalikan daftar post_ids yang cocok sebagai gantinya, yang seharusnya mengurangi memori (dan waktu pemrosesan) secara signifikan:

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

rinogo
sumber
3

Menemukan ini saat meneliti masalah memori yang ditunjukkan di sini.

Dalam kasus ini, Anda bisa menggunakan get_the_id daripada menggunakan buffering untuk menangkap id, dan Anda bisa mempersempit bidang yang diminta untuk hanya menyertakan id.

Thomas
sumber
Terima kasih atas tanggapannya, Thomas! Saya akhirnya menulis beberapa SQL mentah, seingat saya. Namun, ini mungkin akan berhasil juga. Terima kasih banyak! :)
rinogo