# WP_DEFER_TERM_COUNTING() │ WP 2.5.0
Функция WP_DEFER_TERM_COUNTING()
позволяет включать или отключать подсчёт терминов (категорий и тегов).
## Возвращаемое значение
- true
или false
— показывает, включён ли подсчёт терминов.
## Использование
```php
wp_defer_term_counting( $defer );
Где $defer
— это true
, если нужно включить подсчёт терминов, и false
, если отключить его. По умолчанию значение не задано (null
).
Примеры использования
Пример 1: Ускорение импорта большого количества записей
Допустим, нам нужно добавить 1000 записей в базу данных, каждая из которых будет иметь разные категории и теги. У нас есть 20 категорий и 50 тегов, то есть одни и те же категории и теги будут использоваться для разных записей. В таком случае мы можем оптимизировать код импорта, отложив пересчёт количества записей для каждой категории и тега.
$posts_data = [ ... ]; // Здесь хранится информация о постах
// Отключаем пересчёт записей в категориях и собираем ID
wp_defer_term_counting( true );
// Импортируем записи
foreach( $posts_data as $post_data ){
wp_insert_post( $post_data );
}
// Пересчитываем записи в категориях для всех собранных ID
wp_defer_term_counting( false );
Пример 2: Откладываем пересчёт записей в тегах при удалении тегов
Предположим, у нас много похожих тегов, и мы хотим их оптимизировать — сгруппировать все похожие теги, выбрать один основной тег и переместить все записи к нему, удалив другие теги.
Мы можем удалять теги и перемещать их записи к основному тегу с помощью функции wp_delete_term()
с дополнительными параметрами:
$delete_tag = 25; // ID удаляемого тега
$main_tag = 15; // ID основного тега
wp_delete_term( $delete_tag, 'post_tag', [ 'default' => $main_tag, 'force_default' => 1 ] );
Функция wp_update_term_count()
будет вызываться для каждой перемещённой записи. Например, если у нас в группе 4 тега (один основной), а три неосновных тега содержат по 20 записей, то при удалении этих 3 тегов функция пересчёта будет вызвана 20 раз.
Чтобы избежать этого и вызвать функцию пересчёта только один раз вместо 20, мы можем отложить пересчёт:
$delete_tags_groups = [ ... ]; // Массив групп тегов для удаления
// Отключаем подсчёт для тегов и собираем их ID
wp_defer_term_counting( true );
// Удаление тегов
foreach( $delete_tags_groups as $tags ){
$main_tag = array_shift( $tags );
foreach( $tags as $delete_tag ){
wp_delete_term( $delete_tag, 'post_tag', [ 'default' => $main_tag, 'force_default' => 1 ] );
}
}
// Пересчитываем записи в тегах для всех собранных ID
wp_defer_term_counting( false );
Пример 3: Ускорение удаления записей
Если нам нужно удалить 1,000,000 записей, чтобы ускорить этот процесс, мы можем использовать следующий код:
wp_suspend_cache_addition( true ); // Отключаем кэш
wp_defer_term_counting( true ); // Отключаем пересчёт
$to_delete = [ 15, 12, 14, ... ]; // ID записей для удаления
// Отключаем пересчёт записей в категориях и собираем ID
wp_defer_term_counting( true );
// Удаляем записи
foreach( $to_delete as $post_id ){
wp_delete_post( $post_id, true );
}
// Пересчитываем записи в категориях для всех собранных ID
wp_defer_term_counting( false );
Изменения
Функция была введена в версии 2.5.0.
Исходный код функции
Вот как выглядит функция wp_defer_term_counting()
в исходном коде:
function wp_defer_term_counting( $defer = null ) {
static $_defer = false;
if ( is_bool( $defer ) ) {
$_defer = $defer;
// Сбрасываем любые отложенные подсчёты.
if ( ! $defer ) {
wp_update_term_count( null, null, true );
}
}
return $_defer;
}
Теперь вы знаете, как использовать функцию WP_DEFER_TERM_COUNTING()
для оптимизации работы с записями и тегами в WordPress.