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!
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;