Функция wp_defer_term_counting()
в WordPress позволяет временно отключить пересчет количества постов для терминов (элементов таксономии). Это особенно полезно при массовом добавлении или удалении постов, так как она помогает оптимизировать производительность, избегая частых вызовов функции пересчета.
wp_defer_term_counting( bool $defer = null ): bool
Параметры
- $defer (bool, optional):
- Если
true
, отключает пересчет и включает сохранение ID терминов для последующего пересчета. - Если
false
, выполняет пересчет для всех собранных ID терминов. - Если
null
, возвращает текущее состояние пересчета (включен или отключен).
- Если
Возвращаемое значение
Функция возвращает true
или false
, в зависимости от того, включен или отключен пересчет постов в элементах таксономии.
Как работает wp_defer_term_counting()
Эта функция позволяет избежать частых вызовов функции wp_update_term_count()
, что особенно актуально, когда нужно добавить или удалить большое количество постов. Например, при добавлении 500 постов в 20 рубрик, вызов wp_update_term_count()
будет происходить 500 раз, что значительно замедляет процесс. Используя wp_defer_term_counting()
, можно сначала добавить все посты, а затем выполнить один пересчет.
Пример 1: Ускорение импорта большого количества постов
Предположим, нам нужно добавить 1000 постов, каждый из которых будет принадлежать одной из 20 рубрик. Мы можем оптимизировать процесс импорта следующим образом:
$posts_data = [ /* массив данных постов */ ];
// Отключаем пересчет постов в рубриках
wp_defer_term_counting(true);
// Импортируем посты
foreach ($posts_data as $post_data) {
wp_insert_post($post_data);
}
// Включаем пересчет постов для всех собранных ID
wp_defer_term_counting(false);
Пример 2: Отложенные пересчеты постов при удалении тегов
Если у нас есть много схожих тегов, и мы хотим объединить их, переместив посты в основной тег, можно использовать wp_defer_term_counting()
для оптимизации:
$delete_tags_groups = [ /* массив групп тегов для удаления */ ];
// Отключаем пересчет постов в тегах
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 = [ /* массив ID постов для удаления */ ];
// Отключаем пересчет постов
wp_defer_term_counting(true);
// Удаляем посты
foreach ($to_delete as $post_id) {
wp_delete_post($post_id, true);
}
// Включаем пересчет постов для всех собранных ID
wp_defer_term_counting(false);
Заключение
Функция wp_defer_term_counting()
— это мощный инструмент для оптимизации работы с таксономиями в WordPress. Она позволяет избежать излишних пересчетов, что значительно ускоряет процессы импорта и удаления данных. Используя эту функцию, разработчики могут улучшить производительность своих сайтов и сделать их более отзывчивыми при работе с большими объемами данных.