WordPress как на ладони
Новые WordPress шаблоны Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

wp_cache_add() WP 2.0.0

Добавляет данные в кэш, если кэша с указанным ключом еще нет.

Отличается от wp_cache_set(), только тем что в "add" проверяется наличие кэша. Если кэша еще нет, то управление передается методу set (функции wp_cache_set), если есть, то функция ничего не делает и возвращает false.

Параметр $expire не используется по умолчанию, потому что по умолчанию, кэш сохраняется при генерации страницы и исчезает по окончании работы PHP скрипта. Этот параметр предназначен для плагинов объектного кэширования, которые сохраняют кэш в файлы и кэш используется с самого начала генерации страницы.

Смотрите также:

wp_cache_set() - обновляет кэш, если он уже есть или добавляет новый, если его нет.
wp_cache_get() - получает кэш.

Является основой для: wp_load_alloptions()
Работает на основе: WP_Object_Cache::add()
✈ 1 раз = 0.000168с = быстро | 50000 раз = 1.83с = быстро PHP 7.1.11, WP 4.9.8

Хуков нет.

Возвращает

false/true. 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) {
	if ( '%BEG_OF_TITLE%' != $args['before_title'] ) {
		if ( $output = wp_cache_get('widget_recent_entries', 'widget') )
			return print($output);
		ob_start();
	}

	extract($args);
	$options = get_option('widget_recent_entries');
	$title = empty($options['title']) ? __('Recent Posts') : apply_filters('widget_title', $options['title']);
	if( !$number = (int) $options['number'] )
		$number = 10;
	elseif ( $number < 1 )
		$number = 1;
	elseif ( $number > 15 )
		$number = 15;

	$r = new WP_Query(array('showposts' => $number, 'what_to_show' => 'posts',
		'nopaging' => 0, 'post_status' => 'publish', 'caller_get_posts' => 1));
	if ($r->have_posts()) :
		?>
		<?php echo $before_widget; ?>
			<?php if ( !empty( $title ) ) { echo $before_title . $title . $after_title; } ?>
			<ul>
			<?php  while ($r->have_posts()) : $r->the_post(); ?>
			<li><a href="<?php the_permalink() ?>">
				<?php if ( get_the_title() ) the_title(); else the_ID(); ?>
			</a></li>
			<?php endwhile; ?>
			</ul>
		<?php echo $after_widget; ?>
		<?php
		wp_reset_query();  // Restore global post data stomped by the_post().
	endif;

	if( '%BEG_OF_TITLE%' != $args['before_title'] )
		wp_cache_add('widget_recent_entries', ob_get_flush(), 'widget');
}
?>

#3 Получим статистику по имеющемуся кэшу

Такую статистику логично получать в конце работы PHP скрипта (в конце страницы)

global $wp_object_cache;
$wp_object_cache->stats();

// Выведет на экран информацию о кэше

Код wp_cache_add: wp-includes/cache.php VER 4.9.8

<?php
function wp_cache_add( $key, $data, $group = '', $expire = 0 ) {
	global $wp_object_cache;

	return $wp_object_cache->add( $key, $data, $group, (int) $expire );
}

Cвязанные функции

Из метки: cache (кэш кеш)

2 коммента
  • flexo

    Как можно закешировать запрос wp_query? Обновляется редко (например раз в день), но запрос вытягивает все кастомные записи, а потом несколько данных метаполей, используется для посроения карт. Запрос занимает 0,0690 сек. Подскажите плиз

    Ответитьгод назад #
Здравствуйте, !     Войти . Зарегистрироваться