web-dev-qa-db-ja.com

PHP get_posts()に代わる、メモリに優しい方法

私はこれでメモリの問題に遭遇していました:

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

すべての投稿IDのリストを取得しようとしているだけです。

以下のコードは一度に10個の製品を取得するため、メモリ制限を回避することを願っています。それはうまくいくように思えますが、おそらくもっとエレガントな解決策があります。

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

この「一度に10製品」というクエリを実行するためのより良い方法があるかどうかを知りたいです。ありがとうございます。

6
dtbaker

IDだけを取得するにはfields引数を使用してください - メモリの節約になります。

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

No LIMITクエリを実行すると、おそらくメモリ問題の原因となります。

すべての投稿IDのリストを取得するには、まず投稿の数を知っておく必要があります。 MySQLはこれを既に知っているので、私たちはただ尋ねることができます:

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

このクエリは投稿の総数を取得するために可能な限り少なくします。

この知識があれば、前のクエリで見つけた$total_products_countを使ってすべてのIDのリストを取得できます。

$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;
1
Matthew

get_posts()WP_Query()は、どちらもデータベースへの問い合わせ方法と同じです。 WP_Query()の代わりにget_posts()を使っても全く同じ問題を経験しました。 PHPメモリは時々使い果たされました。それから私は問題を考え出した。

原因は次のとおりです。

'posts_per_page' => '-1'

-1を使用すると、クエリがクエリに一致するすべての結果を取得するまでクエリが実行されます。たとえそれが数百、数千、または数百万になることもあります。それが大きな問題です。クエリを10、20、100に制限し、無限大にはしないでください(-1).

それは契約を結ぶでしょう。

そしてさらに このWPSEスレッド を見てください。

0
Mayeenul Islam