Диагностика проблемы: зачем удалять старые статусы заказов в WooCommerce
WooCommerce по умолчанию сохраняет все статусы заказов, включая кастомные и устаревшие. Со временем база данных может разрастаться, что замедляет запросы и усложняет администрирование. Особенно это актуально для магазинов с большим количеством заказов и кастомных статусов.
Проверьте текущие статусы заказов, выполнив SQL-запрос или используя функции WooCommerce для получения списка статусов:
global $order_statuses;
print_r(wc_get_order_statuses());Если среди них много неиспользуемых или временных, их стоит удалить.
Как автоматически удалять старые статусы заказов: пошаговое решение
1. Определяем, какие статусы считаются "старыми"
Для примера — удалим статусы, которые не использовались более 90 дней.
2. Создаем функцию для удаления статусов
WooCommerce не хранит статусы заказов в отдельной таблице, а использует пользовательские статусы как taxonomy. Чтобы удалить статус, нужно вручную удалить все заказы с этим статусом или изменить их статус, а затем убрать регистрацию статуса.
Пример кода для перевода заказов из старого статуса в стандартный и удаления статуса из регистрации:
function remove_old_order_statuses() {
$days_limit = 90;
$cutoff = strtotime("-" . $days_limit . " days");
$statuses = wc_get_order_statuses();
foreach ($statuses as $status_key => $status_label) {
if (strpos($status_key, 'wc-custom-') !== false) { // Фильтр для кастомных статусов
$args = [
'limit' => -1,
'status' => $status_key,
'date_modified' => '<' . date('Y-m-d', $cutoff),
'return' => 'ids',
];
$orders = wc_get_orders($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
// Переводим заказ в статус 'wc-completed'
$order->update_status('completed', 'Автоматическое обновление статуса');
}
// После переноса заказов можно удалить регистрацию статуса в вашем плагине/темe
// Например, удалить хук add_action('init', 'register_custom_status');
}
}
}
}
add_action('wp_loaded', 'remove_old_order_statuses');Обратите внимание, что удаление регистрации статуса вручную — это задача разработчика темы или плагина, где добавлен кастомный статус.
3. Автоматизация через WP-Cron
Чтобы функция запускалась регулярно, добавим задачу в WP-Cron:
function schedule_remove_old_statuses() {
if (!wp_next_scheduled('remove_old_order_statuses_cron_hook')) {
wp_schedule_event(time(), 'daily', 'remove_old_order_statuses_cron_hook');
}
}
add_action('wp', 'schedule_remove_old_statuses');
add_action('remove_old_order_statuses_cron_hook', 'remove_old_order_statuses');Проверка результата после внедрения
- В админке WooCommerce в разделе заказов проверьте, что заказы с указанными старыми статусами переведены в новый статус.
- Выполните
print_r(wc_get_order_statuses());— старые кастомные статусы не должны отображаться, если их регистрация удалена. - Проверьте логи сервера и WooCommerce на наличие ошибок.
- Проверьте, что WP-Cron успешно запускается (например, с помощью плагина WP Crontrol).
Частые ошибки и как их исправить
- Статусы не удаляются из списка: причина — статусы продолжают регистрироваться в теме или плагине, нужно найти и удалить регистрацию через
register_post_status. - Заказы не переводятся в новый статус: неправильный ключ статуса или заказ заблокирован другим плагином, проверьте статус и права доступа.
- WP-Cron не запускается: отсутствие посещений сайта, настройте системный Cron для запуска WP-Cron.
Практические советы по безопасности и производительности
- Перед массовым изменением статусов сделайте резервную копию базы данных.
- Не удаляйте статусы, если не уверены в последствиях — лучше переводить заказы в другой статус.
- Оптимизируйте WP-Cron, чтобы не запускать тяжелые задачи слишком часто.
- Используйте транзиенты или флаги, чтобы избежать повторного изменения одних и тех же заказов.
Сравнение способов удаления старых статусов заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление через плагин (например, Clearfy Pro) | Простота, интерфейс, безопасность | Зависимость от плагина, нагрузка |
| Код в functions.php или плагине | Гибкость, контроль, отсутствие сторонних зависимостей | Требует навыков, риски ошибок |
| Ручное удаление через базу данных | Максимальный контроль | Высокий риск, требует опытного администратора |