Диагностика проблемы: почему нужно удалять старую решу в WooCommerce
В WooCommerce под «решей» понимают записи заказов с определённым статусом, например, отменённые или отклонённые заказы, которые больше не используются. Со временем таких заказов накапливается много, что может замедлить работу сайта и увеличить размер базы данных. Если не очищать базу, ухудшается производительность запросов и бэкапов.
Проверить количество таких заказов можно через phpMyAdmin, выполнив запрос:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';Если число превышает несколько тысяч, стоит задуматься об автоматизации удаления.
Пошаговое решение: настройка WP-Cron для удаления старых заказов
1. Создаём функцию для удаления заказов старше N дней с определённым статусом
Добавьте следующий код в functions.php вашей темы или в кастомный плагин:
function wplog_delete_old_cancelled_orders() {
global $wpdb;
$days = 30; // удалять заказы старше 30 дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'shop_order'
AND post_status = 'wc-cancelled'
AND post_date < %s",
$date_threshold
));
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — удаление без перемещения в корзину
}
}
}2. Регистрируем событие WP-Cron для регулярного запуска удаления
Добавьте в functions.php следующий код для создания события при активации темы:
function wplog_schedule_order_cleanup() {
if (!wp_next_scheduled('wplog_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wplog_daily_order_cleanup');
}
}
add_action('wp', 'wplog_schedule_order_cleanup');И привяжите функцию удаления к событию:
add_action('wplog_daily_order_cleanup', 'wplog_delete_old_cancelled_orders');3. Очистка при деактивации темы или плагина
Чтобы не создавать мусор в WP-Cron, добавьте удаление расписания:
function wplog_clear_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wplog_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wplog_daily_order_cleanup');
}
}
add_action('switch_theme', 'wplog_clear_order_cleanup_schedule');Проверка результата после внедрения
- Ожидайте выполнения задачи в 00:00 по серверному времени (стандартный запуск WP-Cron при посещении сайта).
- Для ручного запуска используйте WP-CLI:
wp cron event run wplog_daily_order_cleanup. - Проверьте базу заказов через phpMyAdmin, выполнив запрос из раздела диагностики, чтобы убедиться в уменьшении числа старых отменённых заказов.
- Добавьте логирование в функцию удаления, например,
error_log('Deleted order ID: '.$order_id);, чтобы отследить процесс в debug.log.
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически
Причина: отсутствие посещений сайта или отключён WP-Cron.
Решение: настроить системный cron на сервере для вызоваwp-cron.phpили запускать вручную через WP-CLI. - Заказы не удаляются
Причина: неверный статус заказа или дата.
Решение: проверьте статус в базе данных, возможно, статус в коде отличается (например,wc-cancelledvscancelled). - Удаляются нужные заказы
Причина: неправильный фильтр по дате или статусу.
Решение: добавьте дополнительные условия, например, проверяйте мета-данные заказа. - Производительность падает
Причина: удаление большого количества заказов за один цикл.
Решение: ограничьте количество удаляемых заказов за раз, например, черезLIMIT 50в запросе.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($order_id, true)с осторожностью, так как удаление без корзины необратимо. - Для сайтов с большим объёмом данных внедрите пакетную обработку удалений с использованием OFFSET и LIMIT.
- Отключайте WP-Cron и используйте системный cron для стабильности на высоконагруженных сайтах.
- Перед удалением делайте резервные копии базы данных.
- Если используете плагины кеширования, очищайте кеш после очистки заказов.
Сравнение вариантов автоматизации удаления заказов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| WP-Cron с кастомным кодом | Полный контроль, бесплатно, без сторонних плагинов | Зависит от посещаемости, требует навыков программирования | Средние и крупные сайты с разработчиком |
| Плагины для очистки базы | Простота установки, интерфейс | Могут конфликтовать, не всегда гибкие настройки | Малые сайты, без навыков кода |
| Системный cron с WP-CLI | Надёжность, не зависит от посещений | Нужен доступ к серверу и консоли | Крупные или высоконагруженные сайты |