like-a-boss
@like-a-boss
Признайся,тебяТянетНаКодМужика,ты—программный гей

Можно ли оптимизировать мой запрос WP_Query к БД?

Добрый вечер,
Я делаю такой вот объёмный запрос, в результате чего получаю 1300 обращений к базе, что крайне много. А мне на этой же странице нужно сделать ещё 2 примерно таких же запроса:)
Уверен что можно тащить и больше инфы из WP, не напрягая его. Вопрос в том, как мой запрос можно оптимизировать, дабы нагрузка на бд стала менее ощутимой.
Надеюсь мой запрос будет понятен, старался его расписать для простоты восприятия:

$args = array( // аргументы основного запроса, далее все циклы будут получать инфу по этим 100 постам
		'post_type' => 'songs',
		'posts_per_page' => '100',
	);
$my_songs = new WP_Query($args);
while ($my_songs->have_posts()) : $my_songs->the_post();

$my_terms = get_the_terms( $post->ID, 'bands' ); // для каждого поста получаем термин таксономии
foreach ($my_terms as $my_term) {
//здесь подрубаемся к API одного ресурса и тянем инфу по $my_term->name для какждого из 100 постов
}
// the_excerpt();


$var = wp_get_post_terms( $post->ID, 'bands' );  // получаем данные по термину, относящемуся к каждому посту, для того чтобы позже получить ссылку на пост, который так же принадлежит к этой таксономии
$artist_id = $var[0]->term_id;
$artist = $var[0]->name;
$varr = wp_get_post_terms( $post->ID, 'albums' ); // то же самое по другой таксономии
$album = $varr[0]->name;
$album_id = $varr[0]->term_id;

$artist_args = array( // аргументы для запроса, которым будем получать пост относящийся к той таксономии что из наш пост из 100
'post_type' => 'artist',
'tax_query' => array(
		array(
			'taxonomy' => 'bands',
			'field' => 'id',
			'terms' => $artist_id
		)
	)
);
$artists = get_posts($artist_args);
foreach($artists as $post);
$artist_url = get_permalink(); // та самая ссылка на пост

$album_args = array( // аргументы для запроса, которым будем получать пост относящийся к той таксономии что из наш пост из 100
'post_type' => 'album',
'tax_query' => array(
		array(
			'taxonomy' => 'albums',
			'field' => 'id',
			'terms' => $album_id
		)
	)
);
$albums = get_posts($album_args);
foreach($albums as $post);
$album_url = get_permalink(); // ещё одна та самая ссылка на пост

// здесь вывод пары полученных переменных
endwhile;


П.С.
$var = wp_get_post_terms( $post->ID, 'bands' )
и
$my_terms = get_the_terms( $post->ID, 'bands' )
казалось бы можно сделать единожды получив ту же инфу, но у меня не получилось - только так работает
  • Вопрос задан
  • 2746 просмотров
Пригласить эксперта
Ответы на вопрос 1
например кэшируйте используемые неоднократно данные в переменные. Первый раз по bands будете получать инфу из БД, второй раз и последующие из массива.
Перепишите запросы с wp_query на sql - думаю, все это приведет всего к двум запросам с несколькими джойнами/ Кэшируйте эти запросы с помощью transients - запрос к кэшу будет намного быстрее, чем тяжелый запрос с джойнами.
Запросы к api кэшируйте с помощью transients на сутки например.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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