Уменьшение или предотвращение вызовов update_meta_cache
Моя тема вызывает функцию update_meta_cache() 58 раз на странице! Судя по записи, эта функция выполняет следующий запрос:
SELECT post_id, meta_key, meta_value
-> FROM wp_postmeta
-> WHERE post_id IN (81649)
-> ORDER BY meta_id ASC
-> ;
Большинство возвращаемых meta_key (и соответствующих значений) не нужны для текущей страницы (например, yoast_wpseo_title, _edit_last, _edit_lock не требуются для цикла на главной странице).
Есть ли способ уменьшить или предотвратить вызов update_meta_cache? Возможно, есть способ добавить функцию в хуке pre_get_posts?

При каждом использовании функции get_post_meta()
выполняется запрос для получения всех метаданных поста и сохранения их в кеше. Чем больше постов запрашивается, тем больше запросов выполняется.
Чтобы уменьшить количество запросов, следует предварительно кешировать все метазначения всех постов в запросе перед вызовом get_post_meta
.
Вот пример кода, взятый из руководства:
add_filter( 'posts_results', 'cache_meta_data', 9999, 2 );
function cache_meta_data( $posts, $object ) {
$posts_to_cache = array();
// обычно имеет смысл только при наличии большого количества постов
if ( empty( $posts ) || is_wp_error( $posts ) || is_single() || is_page() || count( $posts ) < 3 )
return $posts;
foreach( $posts as $post ) {
if ( isset( $post->ID ) && isset( $post->post_type ) ) {
$posts_to_cache[$post->ID] = 1;
}
}
if ( empty( $posts_to_cache ) )
return $posts;
update_meta_cache( 'post', array_keys( $posts_to_cache ) );
unset( $posts_to_cache );
return $posts;
}

Я только что столкнулся с этой проблемой, так как вижу огромное количество запросов update_meta_cache()
. С этим изменением в файле function.php моей темы я всё ещё вижу множество подобных запросов? SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (8987) ORDER BY meta_id ASC
... Я делаю что-то не так?

Абсолютно никакого эффекта, плохая идея использовать случайный код 2011 года на последней версии WP, так много изменилось.

Я просто выполнил поиск "update_meta_cache" по "всей папке WordPress" и отключил.. Теперь сайт работает так, будто я использую его оффлайн.. супер быстро.

НЕ КЭШИРУЙТЕ ВСЕ ЗАПИСИ (САЙТА) ОДНОВРЕМЕННО - автор имеет в виду все записи, загруженные для конкретной страницы, не пытайтесь предварительно кэшировать сотни, тысячи, миллионы и т.д. записей, это может "убить" ваш сайт. Если вам нужно масштабное кэширование, используйте постраничное решение или плагин для кэширования. (жирный текст может вводить в заблуждение случайных новичков)

Для WP_Query
кэширование можно отключить, установив определенные параметры кэширования в значение false
.
Аналогично для WP_Term_Query
кэширование можно отключить, добавив update_term_meta_cache => false
в аргументы запроса.
Дополнительно, фильтр update_{$meta_type}_metadata_cache может быть использован для отключения кэширования метаданных для всех запросов данного типа объекта (например, update_post_metadata_cache
, update_term_metadata_cache
и т.д.).
