С версии 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
--