Память PHP дружественная альтернатива get_posts ()

Я сталкивался с проблемами памяти с этим:

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

(существуют тысячи результатов), просто пытающийся получить список всех идентификаторов сообщения.

Ниже кода захватывает 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 продуктов во время" запрос.Спасибо!

5
26.08.2014, 07:48
3 ответа

Используйте fields аргумент для захвата просто идентификатора - сохранит Вас тонна памяти ;)

$product_ids = get_posts(
    array(
        'posts_per_page' => -1,
        'post_type'      => array( 'product', 'product_variation' ),
        'fields'         => 'ids',
    )
);
10
19.02.2020, 22:06
  • 1
    Точно, чем я был после, Спасибо! я не знал, что это было возможно. –  dtbaker 27.08.2014, 08:27

Выполнение нет LIMIT запрос вероятен причина Ваших проблем памяти.

Для получения списка всех идентификаторов сообщения, мы должны сначала знать, сколько сообщений существует. Так как 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 мы нашли от предыдущего запроса:

$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
19.02.2020, 22:06

get_posts() и WP_Query() обе доли тот же способ Запросить базу данных. Я испытал ту же самую проблему, даже я использовал WP_Query() вместо get_posts(). Память PHP закончилась время ко времени. Затем я выяснил проблему.

Преступник был:

'posts_per_page' => '-1'

С a -1 там выполнения запроса, пока это не выбирает каждый соответствия результатов к запросу даже, который может быть сотнями, тысячами или миллионами... и это - главная проблема. Просто ограничьте свой запрос номером 10, 20, 100, но не бесконечностью (-1).

Это заключит сделку.

И дополнительно взгляните на этот поток WPSE.

0
19.02.2020, 22:06
  • 1
    Спасибо! Да в вышеупомянутом коде я удалил-1 для posts_per_page и замененный это циклом, который захватил 10 продуктов за один раз. Просто задавался вопросом, существует ли лучший способ сделать "10 продуктов во время" запрос. –  dtbaker 26.08.2014, 07:47
  • 2
    лучше что? $wpdb запрос = get_posts() = WP_Query(). Или можно записать собственный SQL-запрос. Ничто иное не присутствует. ПРЕКРАСНЫЙ :( –  Mayeenul Islam 26.08.2014, 08:29

Теги

Похожие вопросы