Диагностика проблемы: зачем удалять старые товары и заказы в WooCommerce
В интернет-магазинах на WooCommerce с течением времени накапливается множество товаров и заказов, которые уже не актуальны: устаревшие товары, отменённые или выполненные заказы. Это приводит к разрастанию базы данных, замедлению работы сайта и усложнению управления. Встроенных механизмов для автоочистки WooCommerce не предоставляет, поэтому приходится реализовывать удаление самостоятельно.
Как автоматизировать удаление старых товаров и заказов через код
1. Удаление товаров по дате последнего обновления
Для очистки товаров, которые не обновлялись, например, более 180 дней, используйте WP Cron для запуска регулярной задачи. В задаче пишем запрос, который получает ID товаров, и с помощью функции wp_delete_post() удаляем их вместе с метаданными.
function wc_auto_delete_old_products() {
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => [
[
'column' => 'post_modified_gmt',
'before' => '180 days ago',
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$old_products = get_posts($args);
foreach ($old_products as $product_id) {
wp_delete_post($product_id, true); // true – безвозвратное удаление
}
}
add_action('wc_daily_cleanup_hook', 'wc_auto_delete_old_products');
// Регистрируем ежедневное событие при активации темы или плагина
if (!wp_next_scheduled('wc_daily_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wc_daily_cleanup_hook');
}2. Автоматическое удаление заказов по статусу и дате
Заказы WooCommerce – это кастомный тип записи shop_order. Чтобы удалять, например, отменённые заказы старше 30 дней, используем похожий подход.
function wc_auto_delete_old_orders() {
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled'],
'date_query' => [
[
'column' => 'post_date_gmt',
'before' => '30 days ago',
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$old_orders = get_posts($args);
foreach ($old_orders as $order_id) {
wp_delete_post($order_id, true);
}
}
add_action('wc_daily_cleanup_hook', 'wc_auto_delete_old_orders');Пошаговое решение: как внедрить код в WooCommerce
- Добавьте оба куска кода в файл
functions.phpактивной дочерней темы или создайте небольшой плагин для кастомных функций. - Убедитесь, что крон-событие
wc_daily_cleanup_hookзарегистрировано и запускается (можно проверить WP-Cron с плагином WP Crontrol). - Запустите крон вручную через WP Crontrol или дождитесь автоматического запуска для проверки удаления.
- Проверьте базу данных через phpMyAdmin: записи старых товаров и заказов должны быть удалены.
Как проверить, что удаление работает
- Перед применением сделайте резервную копию базы данных.
- Создайте тестовый товар с датой изменения более 180 дней назад (можно вручную изменить поле
post_modified_gmtв базе). - Создайте тестовый заказ со статусом
wc-cancelledи датой старше 30 дней. - Запустите крон-событие вручную или дождитесь его срабатывания.
- Проверьте, что тестовые записи удалены.
- Проверьте логи сервера на ошибки, если удаление не происходит.
Частые ошибки и как их исправить
- Крон-событие не запускается. Решение: убедитесь, что WP-Cron работает, используйте плагин WP Crontrol для диагностики.
- Удаление не происходит из-за прав доступа. Убедитесь, что текущий пользователь имеет права на удаление записей, код работает на уровне сервера.
- Удаляются не те записи. Проверьте параметры
post_typeиpost_statusв запросах. - Производительность падает при большом количестве записей. Разбейте удаление на небольшие партии, например, по 50 записей за один запуск, используя параметр
posts_per_page. - Удаление не учитывает вариативные товары. В WooCommerce вариативные товары — это дочерние посты с типом
product_variation. Если нужно, добавьте отдельный запрос для удаления вариаций.
Практические советы по безопасности и производительности
- Перед удалением всегда создавайте резервные копии базы (например, с помощью плагина UpdraftPlus или вручную).
- Для больших магазинов разбивайте удаление на пакеты и запускайте по крону с интервалами, чтобы избежать таймаутов.
- Используйте транзакции базы данных, если пишете более сложную логику на SQL.
- Для контроля логируйте удалённые ID в отдельный файл или таблицу для аудита.
- Регулярно проверяйте состояние вашего WP-Cron и при необходимости переключайтесь на системный cron вместо WP-Cron для лучшей надёжности.
Сравнение вариантов удаления старых товаров и заказов
| Способ | Плюсы | Минусы | Когда применять |
|---|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Неэффективно для большого количества записей | Маленькие магазины, единичные удаления |
| Плагины очистки базы (например, WP Sweep) | Готовое решение, интерфейс | Могут удалять лишнее, нагрузка на сервер | Средние магазины, при регулярной чистке |
| Кастомный код и WP-Cron (описанный способ) | Гибко, подстраивается под задачи, автоматизация | Требует навыков, потенциальные ошибки при реализации | Крупные магазины и проекты с уникальными требованиями |