Уменьшение или предотвращение вызовов update_meta_cache

6 мая 2015 г., 12:50:36
Просмотры: 14.9K
Голосов: 6

Моя тема вызывает функцию 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?

1
Комментарии

Примечание: Объяснение update_post_(meta/term)_cache.

Howdy_McGee Howdy_McGee
1 февр. 2016 г. 18:32:42
Все ответы на вопрос 2
5

При каждом использовании функции 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;
}
1 июн. 2015 г. 07:10:34
Комментарии

Я только что столкнулся с этой проблемой, так как вижу огромное количество запросов 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 ... Я делаю что-то не так?

Andrew Newby Andrew Newby
3 мар. 2016 г. 10:51:19

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

Michael Rogers Michael Rogers
5 мар. 2018 г. 18:48:48

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

MFarooqi MFarooqi
13 февр. 2020 г. 21:51:27

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

jave.web jave.web
18 февр. 2021 г. 11:17:03

Привет @MFarooqi, не мог бы ты подробнее рассказать, как ты это исправил? У меня до сих пор та же проблема.

Leo Leo
4 мар. 2022 г. 22:46:59
1

Для WP_Query кэширование можно отключить, установив определенные параметры кэширования в значение false.

Аналогично для WP_Term_Query кэширование можно отключить, добавив update_term_meta_cache => false в аргументы запроса.

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

11 сент. 2021 г. 00:47:04
Комментарии

Спасибо за предложения, @plong0, похоже, это именно то, что я искал. Меня ждут увлекательные эксперименты с меньшим количеством мета-кэширования :)

vlood vlood
27 июн. 2023 г. 17:59:33