WordPress как на ладони

Оптимизация запроса к бд

Добрый день.
Получаю 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" у всех записей из определенной таксономии? Они должны быть массивом.

0
Явер
6.2 года назад
  • 0
    Kama9619

    Тебе нужно сделать запрос прямо в таблицу метаданных записей, с вложенным в него подзапросом, который найдет нужные ID записей...

    $sql = "SELECT * FROM $wpdb->postmeta WHERE post_id IN ( ПОДЗАПРОС ) WHERE meta_key = 'price'";
    
    global $wpdb;
    $postids = $wpdb->get_results( $sql );

    Подзапрос можно упростить и получить значение поля object_id из таблицы wp_term_relationships, при этом вообще не обращаясь к таблице wp_posts. Для этого нужно будет объеденить две таблицы wp_term_relationships и wp_term_taxonomy:

    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 = 'название таксономии'

    Как устроена структура таксономий и связь с записями смотри в статье о таксономиях.

    Явер 6.2 года назад

    Делаю так:

    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'";
    $sql = "SELECT * FROM $wpdb->postmeta WHERE post_id IN ( " . $query . " ) WHERE meta_key = 'price'";
    $postids = $wpdb->get_results( $sql );
    echo 'pre';
    	print_r( $postids );
    echo 'pre';

    К сожалению выдает пустые массивы sad

    Kama 6.2 года назад

    Попробуй запустить подзапрос отдельно и отдельно сам запрос, где-то ошибка, найди её...

    Явер 6.2 года назад

    Как-то так получилось:

    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

    anton 6.1 год назад

    Ответ сервера, думаю больше от хостинга чем от вордпресс зависит... ты пообновляй страницу где тестиш эти значения, увидишь что они прыгают и не только в пределах нескольких десятков мс.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация