#php #wordpress #woocommerce
Вопрос:
Я создал логику внутри своего WordPress, где для каждого CPT shop_oder есть post_meta под названием «luck_number». Проблема в том, что в среднем у каждого поста в этом CPT было более 1000 продаж, а затем, когда я создаю время для просмотра и получаю post_meta с помощью get_post_meta, загрузка страницы занимает около 15 минут, особенно внутри цикла While do.
Я провел тест, и когда post_meta немного, скорость в порядке, но когда мы добираемся до тысячи мест, она становится довольно медленной.
Каков был бы наилучший способ, чтобы даже в этом сценарии с тысячами постов на ПОСТ у меня все еще была хорошая производительность?
Раздел, где смех такой:
<?php
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
$numbers = get_post_meta(get_the_ID(),"luck_number",false);
$a = 0;
while($a<count($numbers)):
// DO SOMETHING WITH THE NUMBER
$a ;
endwhile;
endwhile;
wp_reset_query();
Хотя в каждом сообщении в среднем от 0 до 500 номеров, все работает нормально. Выше 1000, это очень медленно.
Мой «post_per_page» в среднем составляет 25, но даже изменение его на меньшее число не сильно меняет результат. Инфраструктура, такая как сервер (хороший VPS) или ограничение памяти PHP (в настоящее время 1024M), не сильно повлияла
Ответ №1:
Если вам нужно только одно настраиваемое поле из CPT, вам не нужно использовать WP_Query, Вы можете просто взять все поля в массиве через $wpdb
Попробуйте этот код
function get_luck_numbers_from_db( $key = '', $type = 'post', $status = 'publish' ) {
global $wpdb;
if( empty( $key ) )
return;
$r = $wpdb->get_results( $wpdb->prepare( "
SELECT pm.post_id, pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'
", $key, $status, $type ) );
foreach($r as $value) {
if($value !="") {
$luck_numbers_array[$value->post_id] = $value->meta_value;
}
}
return $luck_numbers_array;
}
$array = get_luck_numbers_from_db('luck_number','shop_oder', 'publish');
print_r($array);