#php #wordpress
#php #wordpress
Вопрос:
У меня большая проблема с одним из моих сайтов. У меня есть одна категория, в которой хранятся другие категории. Проблема в том, что WordPress использует WP_Query->get_posts
и получает все сообщения на этой главной странице категории. Даже если я удалил все внутри и оставил только the_header
, и the_footer
он все равно выполняет запрос. Структура похожа на эту категорию> Подкатегорию> сообщения. Проблема в том, что WordPress выполняет запрос для всех сообщений, которые находятся в моих подкатегориях.
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (13,14,15,24,25,26,27,28,29,102,130,154,256) )
Запрос намного больше этого, загрузка занимает около 22 секунд.
Мой код работает нормально, если я перемещаю код на пользовательскую страницу, он загружается за 0.80, но на странице custom_category загружается за 22-28 секунд. Я хотел бы SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
запретить запуск в этой категории. Я ничего не могу изменить в URL-адресах, поскольку сайт находится в производстве и имеет действительно хорошие позиции. Нужно что-то сделать как можно скорее, и у меня нет идей.
Я пробовал это: https://wpartisan.me/tutorials/wordpress-database-queries-speed-sql_calc_found_rows но это не имеет значения, скорость загрузки все та же.
Это мой код:
<?php
GLOBAL $wpdb;
$subcategorii = $wpdb->get_results("select term_id, name, slug from $wpdb->terms where is_mother_cat = '1' ORDER BY term_id DESC");
// total numar de postari de afisat
$per_page = 28;
// extragem numarul total de postari
$total_rows = count($subcategorii);
// setam numarul total de pagini
$pages = ceil($total_rows / $per_page);
// extragem page curenta
$current_page = (@$_GET['page'] ? @$_GET['page'] : 1);
$current_page = ($total_rows > 0) ? min($pages, $current_page) : 1;
// offset
$start = $current_page * $per_page - $per_page;
// salvam in array doar postarile din page curenta
$subcategorii_array = array_slice($subcategorii, $start, $per_page);
foreach ($subcategorii_array as $subcats) {
echo '<li class="border-radius-5 box-shadow">';
//z_taxonomy_image($subcats->term_id, 'thumbnail', array('alt' => $subcats->name));
echo '<a href="'.get_category_link($subcats->term_id).'"><span>'.$subcats->name.'</span></a>';
echo '</li>';
}
?>
Ответ №1:
Исправлена эта проблема с помощью этой функции, которую я нашел. Но появляется еще один. Теперь на этой странице вызывается WP_Term_Query->get_terms(), вызывающий все сообщения. По крайней мере, на 10 секунд быстрее. У кого-нибудь есть идеи, что здесь происходит?
SELECT t.*, tt.*
FROM wp_terms AS t
INNER JOIN wp_term_taxonomy AS tt
ON t.term_id = tt.term_id
WHERE tt.taxonomy IN ('category')
Функция, которая устраняет проблему:
/* apply this filter only on relevant to you pages */
function mb_bail_main_wp_query( $sql, WP_Query $wpQuery ) {
if ( $wpQuery->is_main_query() amp;amp; is_category(8133) ) {
/* prevent SELECT FOUND_ROWS() query*/
$wpQuery->query_vars['no_found_rows'] = true;
/* prevent post term and meta cache update queries */
$wpQuery->query_vars['cache_results'] = false;
return false;
}
return $sql;
}
add_action( 'posts_request', 'mb_bail_main_wp_query', 10, 2 );