wp_cache_add()
Добавляет данные в кэш, если кэша с указанным ключом еще нет.
Отличается от wp_cache_set(), только тем что в "add" проверяется наличие кэша. Если кэша еще нет, то управление передается методу wp_cache_set(), если есть, то функция ничего не делает и возвращает false.
Параметр $expire не используется по умолчанию, потому что по умолчанию, кэш сохраняется при генерации страницы и исчезает по окончании работы PHP скрипта. Этот параметр предназначен для плагинов объектного кэширования, которые сохраняют кэш в файлы и кэш используется с самого начала генерации страницы.
Смотрите также:
-
Подробнее про Объектный кэш в WordPress.
-
wp_cache_set() - обновляет кэш, если он уже есть или добавляет новый, если его нет.
- wp_cache_get() - получает кэш.
Хуков нет.
Возвращает
true|false. false, если указанный ключ и группа кэша уже существуют; true, если кэш был добавлен.
Использование
wp_cache_add( $key, $data, $group, $expire );
- $key(число/строка) (обязательный)
- Ключ кэша, используемый для обращения к кэшу в дальнейшем.
- $data(смешанный) (обязательный)
- Данные, которые нужно добавить в кэш.
- $group(строка)
- Название группы, к которой принадлежит кэш. Группа указывается для удобства, чтобы кэши в одинаковыми ключами можно было различать, по группе в которой он находится.
По умолчанию: 'default' - $expire(число)
- Время жизни кэша (в секундах). Не используется по умолчанию. Предназначен для плагинов объектного кэширования.
Примеры
#1 Добавим кэш если его нет
Для демонстрации работы wp_cache_add() возьмем код функции get_the_terms(). Функция при вызове сохраняет данные в кэш и при повторных вызовах берет данные из кэша и не делает повторный запрос в БД.
// некоторые строки для наглядности я удалил
function _get_the_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 . '_relationships' );
}
}
return $terms;
} #2 Использование объектного кэша
Этот пример бесполезен, если вы не используете плагины объектного кэширования. Но если используйте, смотрите сколько кода можно не выполнять, благодаря кэшу:
<?php
function wp_widget_recent_entries( $args ) {
$cache_key = 'widget_recent_entries';
$cahe_on = true;
if( $cahe_on ){
$output = wp_cache_get( $cache_key, 'widget' );
if( $output ){
echo $output;
return;
}
ob_start();
}
extract( $args );
$options = get_option( 'widget_recent_entries' );
$title = empty( $options['title'] ) ? __( 'Recent Posts' ) : apply_filters( 'widget_title', $options['title'] );
$number = (int) $options['number'];
if( ! $number ){
$number = 10;
}
elseif( $number < 1 ){
$number = 1;
}
elseif( $number > 15 ){
$number = 15;
}
$r = new WP_Query( [
'posts_per_page' => $number,
'nopaging' => 0,
'post_status' => 'publish',
'caller_get_posts' => 1,
] );
if( $r->have_posts() ) :
echo $before_widget;
if( ! empty( $title ) ){
echo $before_title . $title . $after_title;
}
?>
<ul>
<?php while( $r->have_posts() ) : $r->the_post(); ?>
<li><a href="<?php the_permalink() ?>"><?= esc_html( get_the_title() ?: get_the_ID() ) ?></a></li>
<?php endwhile; ?>
</ul>
<?php
echo $after_widget;
wp_reset_query(); // Restore global post data
endif;
if( $cahe_on ){
wp_cache_add( $cache_key, ob_get_flush(), 'widget' );
}
}
?> #3 Получим статистику по имеющемуся кэшу
Такую статистику логично получать в конце работы PHP скрипта (в конце страницы)
global $wp_object_cache; $wp_object_cache->stats(); // Выведет на экран информацию о кэше
Заметки
- Смотрите: WP_Object_Cache::add()
- Global. WP_Object_Cache.
$wp_object_cacheObject cache global instance.
Список изменений
| С версии 2.0.0 | Введена. |
Код wp_cache_add() wp cache add WP 7.0
function wp_cache_add( $key, $data, $group = '', $expire = 0 ) {
global $wp_object_cache;
return $wp_object_cache->add( $key, $data, $group, (int) $expire );
}