Кэширование в WP_Query с WP 6.1

Click here to view original web page at wp-kama.ru

С версии WP 6.1 в ядро WordPress было добавлено кэширование некоторых запросов к Базе данных. В частности кэширование запросов WP_Query. Это позволило улучшить производительность системы.

Кэширование запросов в WP_Query

С WordPress 6.1 запросы к базе данных реализованные в классе WP_Query кэшируются. Поэтому если один и тот же запрос к базе данных выполняется более одного раза, то последующие результаты будут загружены из кэша.

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

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

Разработчикам

Разработчикам нужно убедиться, что для добавление или обновления постов используются встроенные функции WP, такие как wp_insert_post(). Эти функции обеспечат правильную инвалидацию кэша.

Если вы обновляете базу данных напрямую, то, после обновления строки в базе данных, обязательно очищайте кэш поста с помощью функции clean_post_cache().

Как отключить кэширование?

Кэширование запросов к БД теперь включено по умолчанию в WP_Query.

Если нужно отключить кэширование запросов, то укажите параметр cache_results=false:

$query = new WP_Query( [
   'posts_per_page' => 50,
   'cache_results'  => false
] );

Если нужно глобально отключить такое кэширование для всех запросов, то используйте фильтр parse_query:

add_action( 'parse_query', 'disable_caching' );
function disable_caching( $wp_query ) {
   $wp_query->query_vars['cache_results'] = false;
}

Для лучшей производительности настоятельно рекомендуется оставлять кэширование включенным и инвалидировать кэши, используя функцию clean_post_cache().

Ключ кэша (как определяется что кэш существует)

Существует кэш или нет определяется путем сравнения ключа кэша.

Ключ кэша создается из параметров запроса переданных в WP_Query{}. Однако следующие параметры игнорируются:

suppress_filters
cache_results
fields
update_post_meta_cache
update_post_term_cache
update_menu_item_cache
lazy_load_term_meta

Эти параметры не влияют на запрос к базе данных. Самый важный параметр, на который нужно обратить внимание, - это fields. Это означает, что если вы выполняете следующее:

$query1 = new WP_Query( [
	'posts_per_page' => 50,
	'fields' => 'ids'
] );

$query2 = new WP_Query( [
	'posts_per_page' => 50,
	'fields' => 'all'
] );

В обоих случаях запрос теперь будет запрашивать все поля, чтобы результат можно было кэшировать и затем использовать независимо от параметра fields.

До этого изменения запрос к базе данных для этих двух случаев был разным, но сохранение этого привело бы к нескольким кэшам для фактически подмножеств тех же данных. Это означает, что теперь улучшение производительности при ограничении fields ids будет меньше, чем в предыдущей версии WordPress.

Это изменение также означает, что параметры (кэши) update_post_meta_cache и update_post_term_cache всегда учитываются.

Ненужные плагины

Рекомендуется отключить и удалить плагины, которые добавляют функционал кэширования в WP_Query. Например:

Дополнительная информация см. в Trac-запросе #22176.

Кэширование пользователей в WP_Query

В WordPress 6.1 появилась новая функция, update_post_author_caches().

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

Теперь вместо загрузки каждого пользователя отдельно, данные всех имеющихся в цикле пользователе загружаются одним запросом в начале цикла - см. update_post_author_caches(). Это приводит к значительно меньшему количеству запросов к базе данных.

Вызовы update_post_author_caches() также были добавлены и в другие ключевые места кода ядра. Это позволило увеличить производительность.

Дополнительная информация см. в Trac-запросе #55716

Кэширование связанных объектов для элементов меню

В ядро была добавлена новая функция update_menu_item_cache(). Она принимает массив объектов постов и кэширует объекты постов или терминов, на которые ссылаются элементы меню.

Для WP_Query был добавлен новый параметр update_menu_item_cache. Если установлен в true, он вызовет update_menu_item_cache(), что позволит вам кэшировать элементы меню в два запроса к базе данных (один для постов и один для терминов).

Дополнительная информация см. в Trac-запросе #55620

get_page_by_title теперь использует WP_Query

Функция get_page_by_title() теперь использует WP_Query.

get_page_by_title() помечена как устарелая с версии 6.2.0.

Ранее эта функция использовала прямой запрос к базе данных для получения страницы по заголовку. Теперь она работает через кэш WP_Query. Также теперь можно использовать фильтры WP_Query.

Дополнительная информация см. в Trac-запросе #36905

--

Источник