Оптимизация запроса к бд
Добрый день.
Получаю id товаров сайта:
global $wpdb;
$postids = $wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE post_type='product' AND post_status = 'publish' ORDER BY ID ASC");
Затем получаю метаполя у каждой записи:
foreach( $postids as $postid ){
$postid = $postid->ID;
$val = get_post_meta( $postid, 'price', true );
if ( $val != '' ) {
$params[] = $val;
}
}
Плагин "Query Monitor" показывает на странице вывода фильтра 1000 SQ запросов (столько у меня товаров в таксономии).
Как скопом получить значение метаполя с ключом "price" у всех записей из определенной таксономии? Они должны быть массивом.
Тебе нужно сделать запрос прямо в таблицу метаданных записей, с вложенным в него подзапросом, который найдет нужные ID записей...
Подзапрос можно упростить и получить значение поля object_id из таблицы wp_term_relationships, при этом вообще не обращаясь к таблице wp_posts. Для этого нужно будет объеденить две таблицы wp_term_relationships и wp_term_taxonomy:
Как устроена структура таксономий и связь с записями смотри в статье о таксономиях.
Делаю так:
К сожалению выдает пустые массивы
Попробуй запустить подзапрос отдельно и отдельно сам запрос, где-то ошибка, найди её...
Как-то так получилось:
global $wpdb; $query = "SELECT object_id FROM wp_term_relationships tr LEFT JOIN wp_term_taxonomy tt ON (tt.term_taxonomy_id = tr.term_taxonomy_id) WHERE tt.taxonomy = 'product_cat'"; $querys = $wpdb->get_results( $query ); echo ''; $arr = ''; foreach ( $querys as $a ) { $arr .= $a->object_id . ','; } $arr = trim($arr, ','); echo ''; $sql = "SELECT meta_value FROM $wpdb->postmeta WHERE post_id IN ( " . $arr . " ) AND meta_key = 'price'"; $paramo = $wpdb->get_results( $sql ); echo ''; foreach ( $paramo as $a ) { $params[] = $a->meta_value; }Запросов сразу меньше стало с 1000 до 104
Ответ сервера снизился с 620 ms до 500
Ответ сервера, думаю больше от хостинга чем от вордпресс зависит... ты пообновляй страницу где тестиш эти значения, увидишь что они прыгают и не только в пределах нескольких десятков мс.