Проблема: накопление отменённых и отложенных заказов в WooCommerce
Магазины на WooCommerce часто сталкиваются с тем, что в базе данных накапливается большое количество заказов со статусами cancelled и on-hold. Это не только замедляет работу сайта, но и усложняет аналитику. Автоматическое удаление таких заказов по определённому критерию (например, по времени) поможет поддерживать базу в порядке.
Диагностика проблемы
Для начала убедитесь, что в базе действительно много заказов с нужными статусами. Для этого выполните SQL-запрос через phpMyAdmin или wp-cli:
SELECT post_status, COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;
Если количество заказов со статусами wc-cancelled или wc-on-hold значительно, стоит автоматизировать их удаление.
Пошаговое решение: создание скрипта для удаления заказов по статусу и дате
Реализуем функцию, которую можно запустить через WP-Cron для регулярного удаления заказов старше X дней со статусом cancelled или on-hold.
1. Функция удаления заказов
function wps_delete_old_orders() {
$statuses = array('wc-cancelled', 'wc-on-hold');
$days_ago = 30; // Удалять заказы старше 30 дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_ago} days"));
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses,
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - удаление без перемещения в корзину
}
}
2. Добавление задачи в WP-Cron
Добавим ежедневный крон-запуск функции:
if (!wp_next_scheduled('wps_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wps_daily_delete_old_orders');
}
add_action('wps_daily_delete_old_orders', 'wps_delete_old_orders');
3. Очистка при деактивации плагина или темы
function wps_deactivate_cleanup() {
wp_clear_scheduled_hook('wps_daily_delete_old_orders');
}
register_deactivation_hook(__FILE__, 'wps_deactivate_cleanup');
Проверка результата после внедрения
- Запустите функцию вручную, чтобы проверить корректность удаления:
wps_delete_old_orders();
- Проверьте в админке WooCommerce количество заказов со статусами
ОтменёниОжидает оплаты. - Повторно выполните SQL-запрос из раздела диагностики, чтобы убедиться, что количество заказов уменьшилось.
- Проверьте журнал ошибок сервера на предмет ошибок во время удаления.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что в базе статусы заказов начинаются с
wc-. WooCommerce добавляет префиксwc-к статусам. В запросах обязательно указывайте полный статус, например,wc-cancelled. - Функция не выполняется по расписанию: убедитесь, что WP-Cron работает. Для проверки вызовите
wp-cron.phpвручную через браузер или curl. - Удаление заказов приводит к потере важных данных: проверьте, что политика удаления соответствует требованиям бухгалтерии и хранения данных.
- Проблемы с производительностью при большом количестве заказов: разбейте удаление на порции с помощью параметра
'posts_per_page' => 50и запускайте функцию несколько раз.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии базы перед запуском массового удаления.
- Используйте транзакции или проверяйте успешность удаления при работе с большим объёмом данных.
- Для крупных магазинов лучше запускать удаление в ночное время, чтобы не нагружать базу в часы пик.
- Используйте
wp_suspend_cache_invalidation(true)в начале функции иwp_suspend_cache_invalidation(false)в конце для оптимизации кэширования.
Сравнение вариантов удаления заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное удаление из админки | Удаление заказов по одному в WooCommerce | Просто, не требует кода | Трудоёмко при большом количестве заказов |
| SQL-запрос | Удаление заказов напрямую через базу данных | Быстро и эффективно | Риск нарушения целостности данных, требует опыта |
| Автоматизация через WP-Cron с PHP | Регулярное удаление через функцию и крон-задачу | Автоматично, безопасно, гибко | Требует написания и тестирования кода |