Диагностика задачи: зачем удалять заказы после оплаты в WooCommerce
В стандартном WooCommerce заказы после оплаты сохраняются в базе навсегда. Это сильно увеличивает размер базы данных и может замедлять работу сайта, особенно при большом количестве покупок. Иногда нужно автоматически удалить оплаченные заказы спустя определённое время, например, для оптимизации или в целях конфиденциальности данных.
Важно понять, что WooCommerce не предоставляет встроенного инструмента для автоматического удаления заказов после оплаты, поэтому придётся использовать кастомный код.
Пошаговое решение: удаление оплаченных заказов через WP-Cron
1. Создаём функцию для удаления заказов со статусом 'completed'
В этом примере мы удалим все заказы, которые имеют статус completed старше 30 дней.
function wc_delete_completed_orders_older_than_30_days() {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
$orders = wc_get_orders(array(
'status' => 'completed',
'date_created' => '<' . $date_threshold,
'limit' => -1,
'return' => 'ids'
));
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_trash_post($order_id); // перемещаем заказ в корзину, чтобы избежать резких удалений
}
}2. Добавляем задачу в WP-Cron для регулярного удаления
function wc_schedule_order_cleanup() {
if (!wp_next_scheduled('wc_delete_old_completed_orders_hook')) {
wp_schedule_event(time(), 'daily', 'wc_delete_old_completed_orders_hook');
}
}
add_action('wp', 'wc_schedule_order_cleanup');
add_action('wc_delete_old_completed_orders_hook', 'wc_delete_completed_orders_older_than_30_days');3. Очистка корзины заказов (trash) для окончательного удаления
WordPress не удаляет записи из корзины сразу, поэтому нужно настроить регулярное удаление.
function wc_empty_orders_trash() {
global $wpdb;
$sql = "DELETE FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'trash'";
$wpdb->query($sql);
}
add_action('wc_empty_orders_trash_hook', 'wc_empty_orders_trash');
if (!wp_next_scheduled('wc_empty_orders_trash_hook')) {
wp_schedule_event(time(), 'weekly', 'wc_empty_orders_trash_hook');
}Проверка результата после внедрения
- В админке WooCommerce перейдите в Заказы и убедитесь, что оплаченные заказы старше 30 дней отображаются в корзине или удалены.
- Запустите вручную функцию
wc_delete_completed_orders_older_than_30_days()через WP-CLI или временно вызовите её в теме, чтобы проверить удаление. - Проверьте логи сервера и сайт на ошибки после запуска задач WP-Cron.
- Убедитесь, что WP-Cron работает: в файле
wp-config.phpне отключен, либо настройте системный cron для вызоваwp-cron.php.
Частые ошибки и как исправить
- Заказы не удаляются: Проверьте, что статус заказа действительно
completed. Некоторые оплаты могут оставлять статусprocessingилиon-hold, их нужно учитывать отдельно. - WP-Cron не запускается: На хостинге отключён WP-Cron? Настройте системный cron для вызова
wp-cron.phpили используйте плагин WP Crontrol для диагностики. - Удаляются не те заказы: Проверьте фильтр даты и статуса. Можно добавить логирование для отладки.
- Заказы не удаляются полностью: WordPress перемещает записи в корзину, их нужно удалять отдельно, как показано в примере.
Практические советы по безопасности и производительности
- Перед удалением заказов сделайте резервную копию базы данных.
- Не удаляйте заказы сразу, лучше перемещать их в корзину для возможности восстановления.
- Запускайте удаление заказов в ночное время, чтобы не нагружать сайт в часы пик.
- Если заказов много, разбивайте удаление на порции, чтобы избежать таймаутов.
- Включите логирование удалений для аудита и отладки.
Сравнение вариантов автоматического удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, WP Bulk Delete) | Простота настройки, интерфейс | Часто платные, могут конфликтовать с другими плагинами |
| Кастомный код + WP-Cron | Полный контроль, гибкость, бесплатно | Нужны навыки программирования, поддержка |
| Ручное удаление через админку | Безопасно, визуально понятно | Трудоёмко, не подходит для большого количества заказов |