WP_Query verliert absurde Speichermengen


10

Jedes Mal, wenn ich WP_Query () in der folgenden Funktion aufrufe, verliert Wordpress 8 Megabyte Speicher. Und da ich diese Funktion oft aufrufe, werden die Dinge ziemlich schnell haarig ... :( Ich habe versucht, das resultierende $ queryObject zu deaktivieren und regelmäßig wp_cache_flush () aufzurufen, aber beides scheint keine Wirkung zu haben. Irgendwelche Gedanken?

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

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
Haben Sie das DEBUG BAR Plugin ausprobiert?
Kaiser

Wie viele Beiträge werden abgerufen, WP_Querywenn Ihr Fall (wenn 8 MB durchgesickert sind)?
Eugene Manuilov

Antworten:


14

Hervorragende Antworten auf WP-Hacker: http://lists.automattic.com/pipermail/wp-hackers/2012-June/043213.html

Mit dieser Abfrage laden Sie JEDEN passenden Beitrag in den Speicher, einschließlich des vollständigen Inhalts des Beitrags. Wie Sie sich vorstellen können, handelt es sich wahrscheinlich um eine ganze Reihe von Gegenständen.

Sie können 'fields' => 'ids' an WP_Query übergeben, um stattdessen einfach eine Liste übereinstimmender post_ids zurückzugeben, was den Speicher (und die Verarbeitungszeit) erheblich reduzieren sollte:

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


3

Stolperte darüber, als ich das hier erwähnte Gedächtnisproblem untersuchte.

In diesem Fall können Sie get_the_id anstelle der Pufferung verwenden, um die ID zu erfassen, und Sie können die abgefragten Felder so einschränken, dass sie nur IDs enthalten.


Danke für die Antwort, Thomas! Wie ich mich erinnere, habe ich gerade Roh-SQL geschrieben. Dies hätte jedoch wahrscheinlich auch funktioniert. Vielen Dank! :)
Rinogo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.