WP_DEFER_TERM_COUNTING() в WordPress: оптимизация подсчёта терминов.

# 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.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *