Диагностика задачи: зачем удалять заказы по дате и статусу
В WooCommerce с течением времени накапливается большое количество заказов, многие из которых уже неактуальны: например, завершённые или отменённые заказы старше определённого срока. Это может негативно влиять на производительность базы данных и затруднять администрирование магазина. Стандартного функционала для массового удаления заказов по дате и статусу в админке нет, а популярные плагины часто удаляют только по статусу. Поэтому необходимо реализовать кастомное решение на PHP.
Как получить и проверить заказы по дате и статусу
Для начала важно корректно сформировать WP_Query или WC_Order_Query, чтобы получить заказы по нужным параметрам. Например, заказы со статусом completed старше 30 дней.
$date = date('Y-m-d H:i:s', strtotime('-30 days'));
$args = [
'limit' => -1,
'status' => 'completed',
'date_created' => '<' . $date
];
$orders = wc_get_orders($args);
Данный запрос вернёт все завершённые заказы, созданные раньше 30 дней назад.
Проверка результата выборки
Чтобы убедиться, что выборка корректна, можно вывести количество заказов:
echo 'Найдено заказов: ' . count($orders);
Если значение кажется неожиданным, проверьте правильность формата даты и статус заказа. Статусы должны передаваться без префикса wc- — например, completed, cancelled, failed.
Пошаговое решение: удаление заказов с помощью PHP-кода
Чтобы массово удалить заказы, можно использовать следующий код. Его рекомендуется запускать один раз, например, через functions.php временно или через плагин для пользовательских сниппетов.
function wpstock_delete_old_completed_orders() {
$date = date('Y-m-d H:i:s', strtotime('-30 days'));
$args = [
'limit' => -1,
'status' => 'completed',
'date_created' => '<' . $date
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$order_id = $order->get_id();
wp_delete_post($order_id, true); // принудительное удаление
}
echo 'Удалено заказов: ' . count($orders);
}
// Запуск функции
wpstock_delete_old_completed_orders();
В данном коде:
- Используется
wc_get_orders()для выборки заказов; - Удаление происходит через
wp_delete_postс параметромtrueдля обхода корзины; - Функция выводит количество удалённых заказов.
Как запустить код безопасно
Чтобы не запускать удаление при каждом заходе на сайт, можно обернуть вызов функции в условие, например, проверять GET-параметр:
if (isset($_GET['delete_old_orders']) && current_user_can('manage_woocommerce')) {
wpstock_delete_old_completed_orders();
}
Тогда вызов https://your-site.com/?delete_old_orders=1 удалит старые заказы, если пользователь имеет права администратора.
Проверка результата после внедрения
После выполнения удаления:
- Зайдите в раздел WooCommerce > Заказы, установите фильтр по статусу и дате;
- Убедитесь, что заказы старше 30 дней со статусом
completedотсутствуют; - Проверьте базу данных (таблица
wp_postsс типомshop_order), что соответствующие записи удалены; - Проверьте логи сайта на наличие ошибок в процессе удаления.
Частые ошибки и как их исправить
- Неверный формат даты в запросе: используйте формат
Y-m-d H:i:sи сравнение с<для выбора по дате создания. - Статус заказов указан с префиксом
wc-: дляwc_get_orders()нужно указывать статус без префикса. - Удаление не происходит: проверьте, что функция вызывается, и у пользователя есть права на удаление заказов.
- Заказы удаляются, но метаданные остаются:
wp_delete_postс параметромtrueудаляет все связанные данные, но если есть нестандартные таблицы, их нужно чистить отдельно.
Практические советы по безопасности и производительности
- Запускайте массовое удаление заказов в периоды низкой нагрузки, чтобы избежать блокировки сайта.
- Перед удалением сделайте резервную копию базы данных.
- Для больших магазинов разбивайте удаление на партии по 100-200 заказов, чтобы не превысить лимит памяти и время выполнения скрипта.
- Используйте WP-CLI для больших выборок: команда
wp post delete $(wp post list --post_type='shop_order' --post_status='completed' --date_query_column='post_date' --before='30 days ago' --format=ids)удалит заказы быстро и без нагрузки на сайт. - Если часто требуется удалять заказы, рассмотрите написание WP-Cron задачи с таким же кодом, чтобы автоматизировать процесс.
Сравнительная таблица способов удаления заказов WooCommerce
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
PHP-сниппет с wc_get_orders и wp_delete_post | Гибкость, можно фильтровать по статусам и датам | При большом количестве заказов может быть медленно | Средние и небольшие магазины, точечное удаление |
| WP-CLI | Очень быстрое удаление, без нагрузки на сайт | Требует доступа к серверу и навыков командной строки | Большие магазины, массовая очистка |
| Плагины массового удаления заказов | Простота использования, интерфейс | Могут не поддерживать сложные фильтры по дате | Быстрое удаление без кода |