Диагностика проблемы: зачем удалять отключённые и неоплаченные заказы
WooCommerce накапливает большое количество заказов со статусами cancelled (отключён) и pending (ожидает оплаты). Это приводит к увеличению размера базы данных, замедлению бэкапа и снижению производительности административной панели. Особенно это критично для крупных магазинов с тысячами заказов.
Проверить количество заказов с указанными статусами можно через SQL-запрос к базе данных:
SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Если в ответе видно много wc-cancelled и wc-pending, стоит автоматизировать удаление устаревших заказов.
Пошаговое решение: автоматическое удаление заказов по статусу и дате
1. Создание функции для удаления заказов
Добавим в functions.php вашей темы или в отдельный плагин следующий код для удаления заказов, старше заданного количества дней:
function wpscan_delete_old_orders() {
$statuses = ['wc-cancelled', 'wc-pending']; // Статусы для удаления
$days_to_keep = 30; // Срок хранения заказов
$date_limit = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));
foreach ($statuses as $status) {
$args = [
'post_type' => 'shop_order',
'post_status' => $status,
'date_query' => [
[
'column' => 'post_date',
'before' => $date_limit,
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
}
}2. Настройка автоматического запуска с помощью WP-Cron
Чтобы функция выполнялась автоматически, зарегистрируем событие WP-Cron, например, раз в сутки:
function wpscan_schedule_order_cleanup() {
if (!wp_next_scheduled('wpscan_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpscan_daily_order_cleanup');
}
}
add_action('wp', 'wpscan_schedule_order_cleanup');
add_action('wpscan_daily_order_cleanup', 'wpscan_delete_old_orders');3. Очистка расписания при деактивации плагина или отключении кода
Если код добавлен в плагин, важно удалить расписание при деактивации:
function wpscan_deactivate_order_cleanup() {
$timestamp = wp_next_scheduled('wpscan_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpscan_daily_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpscan_deactivate_order_cleanup');Проверка результата после внедрения
Для проверки работы решения:
- Запустите функцию вручную в админке с помощью
wpscan_delete_old_orders();или используйте WP-CLI:wp eval 'wpscan_delete_old_orders();' - Проверьте количество заказов со статусом
cancelledиpendingдо и после выполнения функции через SQL-запрос. - Убедитесь, что заказы действительно удалены, а не просто переведены в корзину (
wp_delete_postс параметромtrueделает полное удаление). - Проверьте логи сервера на предмет ошибок во время выполнения WP-Cron.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что функция вызывается и что в базе есть заказы старше заданного срока. Проверьте права пользователя, под которым запускается WP-Cron.
- Удаляются не те заказы: Проверьте правильность статусов: WooCommerce использует префикс
wc-. Например,wc-cancelledвместо простоcancelled. - WP-Cron не срабатывает: Проверьте, что на сайте есть посещения (WP-Cron по умолчанию зависит от посещений). Для гарантированного запуска настройте системный cron на вызов
wp-cron.php. - Производительность падает при удалении: При большом количестве заказов разбейте удаление на порции (например, по 100 заказов за раз), чтобы не перегружать сервер.
Практические советы по безопасности и производительности
- Используйте полное удаление заказов
wp_delete_post($order_id, true), чтобы не оставлять мусор в базе (метаданные, записи в таблицах WooCommerce). - Для больших магазинов добавьте логирование удалённых заказов с указанием ID и даты удаления для аудита.
- Внедрите проверку nonce или ограничьте запуск функции только для администраторов, если добавляете кнопки ручного запуска в админке.
- Оптимизируйте запросы, используя
'fields' => 'ids'вget_posts, чтобы снизить нагрузку. - Если заказов слишком много, используйте пагинацию по 100 заказов за раз, чтобы не превышать лимиты памяти и времени выполнения.
Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку WooCommerce | Просто, без кода | Трудоёмко при большом количестве заказов | Небольшие магазины |
| Плагин для очистки заказов (например, WP Bulk Delete) | Готовое решение с интерфейсом | Зависимость от стороннего кода, возможные конфликты | Средние магазины без навыков кодинга |
| Кастомный код с WP-Cron (как в статье) | Гибкость, контроль, минимальная нагрузка | Требует навыков разработки и тестирования | Крупные магазины, требующие автоматизации |