Диагностика проблемы накопления старого контента в WooCommerce
При эксплуатации WooCommerce магазин накапливает большое количество данных: старые заказы, неактивные вариации товаров, черновики и ревизии, а также метаданные, которые не используются. Это приводит к росту базы данных, увеличению времени отклика сайта и замедлению админки.
Чтобы проверить, есть ли у вас «мусор» в базе, выполните SQL-запросы для оценки объема данных:
SELECT post_type, COUNT(*) AS count FROM wp_posts WHERE post_type IN ('shop_order', 'product_variation') GROUP BY post_type;
SELECT COUNT(*) FROM wp_postmeta WHERE post_id NOT IN (SELECT ID FROM wp_posts);
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'revision';Также полезно оценить размер таблиц базы данных через phpMyAdmin или команду SHOW TABLE STATUS.
Пошаговое решение: автоматическое удаление старых заказов и неактивных вариаций
Удаление заказов по статусу и дате без плагинов
Реализуем очистку заказов старше N дней с определенными статусами (например, отменённые, завершённые):
function wc_delete_old_orders() {
global $wpdb;
$days = 90; // Удалять заказы старше 90 дней
$statuses = ['wc-cancelled', 'wc-completed'];
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
foreach ($statuses as $status) {
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
$status,
$date_threshold
));
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
}
add_action('wp_loaded', 'wc_delete_old_orders');Эту функцию лучше запускать через WP-Cron раз в сутки, чтобы не нагружать сервер при каждом заходе на сайт.
Удаление неактивных вариаций товаров
Неактивные вариации — те, у которых нет атрибутов или которые не используются в каталоге. Вот скрипт для их удаления:
function wc_delete_inactive_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_variation_description',
'compare' => 'NOT EXISTS',
],
],
];
$variations = get_posts($args);
foreach ($variations as $variation) {
$parent_id = wp_get_post_parent_id($variation->ID);
if (!$parent_id) {
wp_delete_post($variation->ID, true);
}
}
}
add_action('wp_loaded', 'wc_delete_inactive_variations');Оптимизацию можно расширить удалением ревизий и временных транзиентов.
Проверка результата после внедрения
- Проверьте количество заказов старше установленного порога в админке WooCommerce.
- Выполните SQL-запросы из раздела диагностики повторно — количество удалённых записей должно уменьшиться.
- Оцените скорость загрузки страниц админки и фронтенда до и после оптимизации с помощью инструментов типа Query Monitor и GTmetrix.
Частые ошибки при автоматическом удалении и как их исправить
- Удаление активных заказов: Неправильная проверка статусов может привести к удалению важных заказов. Всегда фильтруйте по корректным статусам, используйте префикс
wc-. - Ошибки с зависимостями: Не удаляйте вариации без проверки наличия родительского продукта — это приводит к ошибкам и «потерям» данных.
- Перегрузка сервера: Запуск удаления большого объема данных без разбивки на партии (batch processing) может вызвать тайм-ауты. Используйте WP-Cron или разнесите выполнение по времени.
- Отсутствие резервной копии: Перед массовым удалением всегда делайте резервную копию базы данных.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($id, true)для полного удаления, чтобы очистить все связанные метаданные. - Для регулярной очистки настройте WP-Cron задачу, например:
if (!wp_next_scheduled('wc_daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'wc_daily_cleanup');
}
add_action('wc_daily_cleanup', 'wc_delete_old_orders');
add_action('wc_daily_cleanup', 'wc_delete_inactive_variations');- Проверяйте и очищайте таблицу
wp_optionsот устаревших transient и опций, влияющих на производительность. - Для масштабных магазинов рассмотрите использование специализированных плагинов оптимизации, например, Clearfy Pro (https://wpshop.ru/plugins/clearfy), которые автоматизируют очистку и оптимизацию.
Сравнение способов удаления старого контента в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручной SQL-запрос | Быстро, без лишнего кода | Риск ошибок, сложно автоматизировать |
| Код на PHP + WP-Cron | Автоматизация, безопасное удаление через API WP | Требует навыков программирования |
| Плагины оптимизации | Удобство, расширенный функционал | Могут влиять на производительность, платные опции |