質問: 1; } //echo '<h4>num sources: ' . count($all_sources) . '</h4>'; } //echo "<h2>b</h2>"; //endwhile; //endwhile; endif; endforeach; echo "<h1>end</h1>"; return $all_sources; }` 私は物事をめちゃくちゃにしていたいくつかの悪いデータがあるかもしれないと思ったので、私は変更しました...if ( get_post_meta($order_id, 'where did you hear about us', true) ) {...行...if ( $order_id < 5000 && get_post_meta($order_id, 'where did you hear about us', true) ) {...そしてそれはうまくいった。次に、その行を...に変更しました。if ( $order_id >= 5000 && get_post_meta($order_id, 'where did you hear about us', true) ) {...それでもまだうまくいった。しかし5000条件がなければ、スクリプトは爆弾を投げかけるだけです。 (<h1>end</h1>が出力されないのでこれを知っています。)それでは、私のコードの何が問題になっていますか?あるいは、この方法が完了しないという問題をどのように解決すればよいでしょうか。例えば、それはメモリに関してより効率的に書かれることができましたか?それとももっと良いアプローチがありますか? (コメントアウトされていることから、wp_queryを使用してみたことがわかりますが、同じ結果が得られます。)nb - およそあります。クエリによって返された10,000項目。前もって感謝します。
回答: 約あります。クエリによって返された10,000項目。 それはあなたの問題です。ループ内で何をしても、wordpressはまだオブジェクトをメモリにロード10,000しています。それをまとめて、クエリ引数にちょっとした魔法を振りかけます。$args = array( 'fields' => 'ids', // magic! just get an array of id's, no objects committed to memory 'posts_per_page' => 500, // batch size: big enough to reduce meta queries, small enough not to hammer memory 'post_type' => 'shop_order', 'post_status' => 'publish', 'tax_query' => array( array( 'taxonomy' => 'shop_order_status', 'field' => 'slug', 'terms' => array( 'processing', 'completed', 'cancelled', 'failed', 'refunded' ), ) ) ); $query = new wp_query; $paged = 1; $count = 0; $total = null; do { $args['no_found_rows'] = isset( $total ); // no need to sql_calc_found_rows on subsequent iterations $args['paged'] = $paged++; $post_ids = $query->query( $args ); update_postmeta_cache( $post_ids ); // get all meta for this group of posts if ( ! isset( $total ) ) $total = $query->found_posts; $count += $query->post_count; foreach ( $post_ids as $post_id ) { $source = get_post_meta( $post_id, 'where did you hear about us', true ); // do your stuff here // wipe this post's meta from memory wp_cache_delete( $post_id, 'post_meta' ); } } while ( $count < $total );