Запретить запуск WP_Query->get_posts на странице категории

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