PHP-Speicher freundliche Alternative zu get_posts ()

Ich stieß auf Speicherprobleme mit diesem:

get_posts( array( 'posts_per_page' => '-1', 'post_type' => array( 'product', 'product_variation' ) )

(Es gibt Tausende von Ergebnissen), die nur versuchen, eine Liste aller Post-IDs zu erhalten.

Der unten stehende Code erfasst 10 Produkte gleichzeitig, um Speicherbeschränkungen zu vermeiden. Es scheint in Ordnung zu sein, aber es gibt wahrscheinlich eine elegantere Lösung.

https://gist.github.com/dtbaker/acd15e542d98bff68034

 $product_page = 1; $product_per_page = 10; $product_query = new WP_Query( array( 'posts_per_page' => $product_per_page, 'paged' => $product_page, 'post_type' => array( 'product', 'product_variation' ), ) ); $product_ids = array(); while($product_query->have_posts() ) { $product_result = $product_query->next_post(); if(!$product_result){ // get the next lot of results. $product_page++; $product_query = new WP_Query( array( 'posts_per_page' => $product_per_page, 'paged' => $product_page, 'post_type' => array( 'product', 'product_variation' ), ) ); }else{ $product_ids[] = $product_result->ID; } } print_r($product_ids); 

Ich würde gerne wissen, ob es eine bessere Möglichkeit gibt, diese “10 Produkte auf einmal” -Abfrage zu machen. Vielen Dank!

Solutions Collecting From Web of "PHP-Speicher freundliche Alternative zu get_posts ()"

Verwenden Sie das Argument fields , um nur die ID zu erfassen – Sie sparen eine Menge Speicherplatz;)

 $product_ids = get_posts( array( 'posts_per_page' => -1, 'post_type' => array( 'product', 'product_variation' ), 'fields' => 'ids', ) ); 

get_posts() und WP_Query() teilen sich die gleiche Art, die database WP_Query() . Ich habe genau dasselbe Problem erlebt, obwohl ich WP_Query() anstelle von get_posts() . Der PHP-Speicher ist von Zeit zu Zeit abgelaufen. Dann habe ich das Problem herausgefunden.

Der Schuldige war:

 'posts_per_page' => '-1' 

Mit einer -1 wird die Abfrage ausgeführt, bis sie alle Ergebnisse abruft, die mit der Abfrage übereinstimmen, selbst das können Hunderte, Tausende oder Millionen sein … und das ist das Hauptproblem. Beschränken Sie Ihre Anfrage auf eine Zahl von 10, 20, 100, aber nicht auf eine Unendlichkeit ( -1 ).

Das wird den Deal machen.

Und schauen Sie sich auch diesen WPSE-Thread an .

Das Ausführen einer No LIMIT Abfrage ist wahrscheinlich die Ursache für Ihre Speicherprobleme.

Um eine Liste aller Post-IDs zu erhalten, müssen wir zuerst wissen, wie viele Posts existieren. Da MySQL das bereits weiß, können wir einfach fragen:

 $product_query = new WP_Query( array( 'posts_per_page' => 1, 'post_type' => array( 'product', 'product_variation' ), 'post_status' => 'publish', // explicitly setting post_status helps memory usage 'fields' => 'ids', ) ); $total_products_count = $products->found_posts; 

Diese Abfrage wird so wenig wie möglich dazu beitragen, die Gesamtzahl der Posts zu erhalten.

Mit diesem Wissen können wir eine Liste aller IDs mit dem $total_products_count wir aus der vorherigen Abfrage gefunden haben:

 $product_query = new WP_Query( array( 'posts_per_page' => $total_products_count, 'post_type' => array( 'product', 'product_variation' ), 'post_status' => 'publish', 'fields' => 'ids', 'no_found_rows' => true, // to disable found_posts calculation ) ); $product_ids = $product_query->posts;