Диагностика проблемы с большим объемом данных в WooCommerce
С течением времени WooCommerce-магазин накапливает множество заказов, товаров, вариаций и метаданных. Это приводит к увеличению размера базы данных, снижению производительности сайта и усложнению резервного копирования. Особенно остро стоит вопрос с заказами со статусами «отменён», «завершён» или «обработан», которые уже не актуальны, а также с неактивными вариациями товаров.
Чтобы понять, насколько сильно база данных раздуты, выполните следующие SQL-запросы в phpMyAdmin или через WP CLI:
-- Количество заказов по статусам
SELECT post_status, COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;
-- Количество вариаций товаров
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation';
-- Количество метаданных для заказов
SELECT COUNT(*) FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'shop_order');
Обратите внимание на большое количество заказов со статусами, которые можно считать устаревшими (например, cancelled, completed старше 90 дней), а также на вариации товаров, которые не продаются или не используются.
Пошаговое автоматическое удаление старого контента в WooCommerce
1. Удаление старых заказов по статусу и дате
Добавьте следующий код в файл functions.php вашей дочерней темы или в свой плагин с пользовательскими функциями. Этот скрипт удалит заказы со статусами 'cancelled' и 'completed', старше 90 дней, и связанные с ними метаданные.
function wc_delete_old_orders() {
global $wpdb;
$statuses_to_delete = ['wc-cancelled', 'wc-completed'];
$date_threshold = date('Y-m-d H:i:s', strtotime('-90 days'));
foreach ($statuses_to_delete as $status) {
// Получаем ID заказов для удаления
$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
));
if (!empty($order_ids)) {
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
}
}
// Регистрируем Cron задачу, если еще не зарегистрирована
if (!wp_next_scheduled('wc_delete_old_orders_daily')) {
wp_schedule_event(time(), 'daily', 'wc_delete_old_orders_daily');
}
add_action('wc_delete_old_orders_daily', 'wc_delete_old_orders');
2. Удаление неактивных вариаций товаров
Неактивные вариации - это вариации, которые не продаются или не имеют атрибутов. Чтобы их удалить, используйте следующий код:
function wc_delete_inactive_variations() {
global $wpdb;
// Получаем ID вариаций без атрибутов (пустых метаполей вариаций)
$variation_ids = $wpdb->get_col(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key LIKE 'attribute_%'
WHERE p.post_type = 'product_variation'
GROUP BY p.ID
HAVING COUNT(pm.post_id) = 0"
);
if (!empty($variation_ids)) {
foreach ($variation_ids as $variation_id) {
wp_delete_post($variation_id, true);
}
}
}
// Запускаем после очистки старых заказов
add_action('wc_delete_old_orders_daily', 'wc_delete_inactive_variations');
Проверка результата после внедрения
- Проверьте количество заказов в админке WooCommerce до и после запуска скрипта.
- Выполните SQL-запросы из раздела диагностики повторно — количество заказов и вариаций должно уменьшиться.
- Убедитесь, что страницы заказов со старыми статусами не выводятся и не загружаются.
- Проверьте логи Cron (через плагин WP Crontrol или через системные логи), чтобы убедиться, что задача выполняется ежедневно.
Частые ошибки и как их исправить
- Не удаляются заказы: проверьте, что статусы указаны с префиксом
wc-(например,wc-cancelled), иначе запрос не найдет записи. - Удаление не происходит по расписанию: убедитесь, что Cron планировщик WordPress работает корректно, нет запретов на выполнение WP-Cron в настройках сервера.
- Удаляются нужные заказы: всегда тестируйте на копии сайта и корректно задавайте порог по дате, чтобы не потерять актуальные данные.
- Вариации не удаляются: возможно, у вариаций есть скрытые атрибуты, проверьте метаполя через SQL или используйте расширенный отладчик.
Практические советы по безопасности и производительности
- Для больших баз данных удаление большого количества заказов за один запуск может привести к таймауту. Разбейте удаление на батчи, например, по 50 заказов за раз.
- Используйте транзакции или создавайте резервные копии базы перед массовым удалением, чтобы избежать потери данных.
- Оптимизируйте таблицы базы данных после удаления большого количества записей с помощью команды
OPTIMIZE TABLE wp_posts, wp_postmeta;. - Для улучшения производительности можно дополнительно к удалению старых данных интегрировать плагин Clearfy Pro от WPShop для автоматической чистки дубликатов и оптимизации базы.
- Не забывайте об ограничении прав доступа к коду удаления - выполняйте эти действия только с правами администратора.
Сравнение вариантов удаления старого контента
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Плагин для очистки WooCommerce | Удобство, готовые настройки, поддержка | Зависимость от плагина, нагрузка, платные функции | Если нужна быстрая настройка без кода |
| Ручной PHP-код (как в статье) | Полный контроль, гибкость, бесплатный | Нужны навыки разработки, риски при ошибках | Для опытных разработчиков и кастомных задач |
| SQL-запросы напрямую | Самый быстрый способ | Риск повредить базу, нет проверки зависимостей | Для разовых операций на копии базы |