Функция wp_cache_add()
добавляет данные в кэш, если указанный ключ еще не существует в системе. Она отличается от wp_cache_set()
, которая заменяет данные в кэше, если ключ уже существует, а также добавляет его, если такого ключа не было.
wp_cache_add( int|string $key, mixed $data, string $group = '', int $expire = 0 ): bool
Параметры функции
$key
(int|string) — обязательный параметр. Ключ для данных в кэше, используемый для дальнейшего их получения.$data
(mixed) — обязательный параметр. Данные для сохранения в кэше.$group
(string) — необязательный параметр. Группа кэша, что позволяет различать данные с одинаковыми ключами в разных группах. Значение по умолчанию:default
.$expire
(int) — необязательный параметр. Время жизни кэша в секундах. По умолчанию кэш действует в рамках текущего процесса. Этот параметр особенно полезен при использовании плагинов объектного кэширования.
Возвращаемое значение
- bool — возвращает
true
, если данные успешно добавлены в кэш. Если ключ с такими данными уже существует, возвращаетfalse
.
Пример 1: Добавление данных в кэш, если его еще нет
В этом примере данные о терминах поста сохраняются в кэш. Если данные с указанным ключом отсутствуют, функция добавляет их, чтобы при последующих вызовах данные загружались из кэша, а не из базы данных.
function my_get_post_terms( $post, $taxonomy ) {
$terms = get_object_term_cache( $post->ID, $taxonomy );
if ( false === $terms ) {
$terms = wp_get_object_terms( $post->ID, $taxonomy );
if ( ! is_wp_error( $terms ) ) {
$term_ids = wp_list_pluck( $terms, 'term_id' );
wp_cache_add( $post->ID, $term_ids, $taxonomy . '_terms_cache' );
}
}
return $terms;
}
В этом примере my_get_post_terms()
сначала проверяет, есть ли кэш для терминов поста. Если кэша нет, функция получает термины и добавляет их в кэш с уникальным ключом, сгенерированным на основе ID поста и таксономии.
Пример 2: Использование объектного кэширования в виджете
Рассмотрим случай, когда необходимо кэшировать вывод виджета, например, для снижения нагрузки на сервер.
function my_widget_recent_posts( $args ) {
$cache_key = 'recent_posts_widget_cache';
$output = wp_cache_get( $cache_key, 'widget_cache' );
if ( $output ) {
echo $output;
return;
}
ob_start();
extract( $args );
// Параметры виджета
$title = __( 'Recent Posts' );
$number = 5;
// Запрос для получения последних постов
$query = new WP_Query([
'posts_per_page' => $number,
'post_status' => 'publish',
]);
if ( $query->have_posts() ) {
echo $before_widget . $before_title . $title . $after_title . '<ul>';
while ( $query->have_posts() ) {
$query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>' . $after_widget;
}
wp_reset_postdata();
$output = ob_get_clean();
wp_cache_add( $cache_key, $output, 'widget_cache', 3600 ); // Кэшируем на 1 час
echo $output;
}
Здесь данные виджета сохраняются в кэш на один час (3600 секунд). Функция проверяет наличие кэша и выводит его, если данные есть, чтобы не выполнять запрос к базе данных каждый раз при загрузке страницы.
Пример 3: Получение статистики по кэшу
Можно также получить общую информацию о текущих данных в кэше:
global $wp_object_cache;
$wp_object_cache->stats();
Эта команда выводит подробную статистику по кэшу, включая количество сохраненных элементов и их группы, что может быть полезно для мониторинга производительности.
Заключение
Функция wp_cache_add()
в WordPress полезна для оптимизации производительности за счет добавления данных в кэш, если они еще не существуют. Она предотвращает избыточные запросы к базе данных, сохраняя и возвращая информацию при последующих вызовах. Это особенно важно при использовании виджетов и плагинов объектного кэширования, где данные могут храниться дольше, уменьшая нагрузку на сервер.