Повышение производительности get_post_meta WordPress

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