Диагностика задачи: зачем автоматизировать удаление товаров в WooCommerce
В крупных интернет-магазинах на WooCommerce часто накапливаются товары, которые давно не продаются, имеют отрицательный или нулевой запас, либо связаны с отменёнными заказами. Это негативно влияет на пользовательский опыт, SEO и производительность сайта. Ручное управление товарами – трудоёмкий процесс, который легко автоматизировать с помощью WP-Cron и кастомных скриптов.
Как автоматически удалять товары по статусу заказов
В WooCommerce по умолчанию есть несколько статусов заказов: pending, processing, completed, cancelled, refunded и другие. Например, можно настроить удаление товаров, которые связаны только с отменёнными (cancelled) или возвращёнными (refunded) заказами и не имеют других продаж.
Пример кода для удаления товаров без успешных заказов
function wpbit_delete_products_by_order_status() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'fields' => 'ids',
];
$products = get_posts($args);
foreach ($products as $product_id) {
$orders = wc_get_orders([
'limit' => -1,
'status' => ['completed', 'processing'],
'product_id' => $product_id,
]);
if (empty($orders)) {
// Проверим, есть ли заказы с отменённым или возвращённым статусом
$cancelled_orders = wc_get_orders([
'limit' => 1,
'status' => ['cancelled', 'refunded'],
'product_id' => $product_id,
]);
if (!empty($cancelled_orders)) {
wp_delete_post($product_id, true); // Полное удаление товара
}
}
}
}
add_action('wpbit_daily_cleanup', 'wpbit_delete_products_by_order_status');Этот код нужно запускать по Cron, например, с помощью WP-Cron, чтобы периодически очищать магазин.
Настройка WP-Cron для ежедневного запуска
function wpbit_register_daily_event() {
if (!wp_next_scheduled('wpbit_daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpbit_daily_cleanup');
}
}
add_action('wp', 'wpbit_register_daily_event');Автоматическое удаление товаров с нулевым или отрицательным запасом
WooCommerce хранит количество товара в метаполе _stock. Можно написать функцию, которая удаляет товары с запасом <= 0, если они не продаются.
function wpbit_delete_products_by_stock() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock',
'value' => 0,
'compare' => '<=',
'type' => 'NUMERIC'
]
],
'fields' => 'ids',
];
$products = get_posts($args);
foreach ($products as $product_id) {
$orders = wc_get_orders([
'limit' => 1,
'status' => ['completed', 'processing'],
'product_id' => $product_id,
]);
if (empty($orders)) {
wp_delete_post($product_id, true);
}
}
}
add_action('wpbit_daily_cleanup', 'wpbit_delete_products_by_stock');Проверка результата после внедрения
- Запустите Cron вручную для теста (через WP CLI:
wp cron event run wpbit_daily_cleanup). - Проверьте, что товары с указанными условиями действительно удалены (через админку или запросы в базе).
- Убедитесь, что случайные товары не удалились — проверяйте логи и делайте резервные копии перед запуском.
Частые ошибки и как их исправить
- Пустой результат в
wc_get_orders: убедитесь, что в вашем WooCommerce версии 3.0+ и вы используете правильные параметры для фильтрации заказов. - Удаление не тех товаров: всегда фильтруйте товары по статусам заказов и запасам, добавляйте дополнительные проверки (например, дата последней продажи).
- WP-Cron не срабатывает: проверьте, что на хостинге разрешены WP-Cron или настройте системный cron для вызова
wp-cron.php. - Потеря данных: перед массовым удалением делайте резервное копирование базы данных.
Практические советы по безопасности и производительности
- Для больших магазинов разбивайте обработку на части — используйте
posts_per_pageс пагинацией и сохраняйте прогресс в опциях. - Запускайте тяжелые задачи в ночное время или при низкой нагрузке сайта.
- Используйте транзакции базы данных при массовых изменениях (если есть доступ к DB напрямую).
- Ограничьте доступ к функциям удаления — запускайте код только с правами администратора.
Сравнение способов автоматизации удаления товаров
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин для очистки WooCommerce | Простота настройки, готовый интерфейс | Может быть тяжеловесным, ограниченная кастомизация |
| Кастомный WP-Cron с PHP кодом | Гибкость, точное соответствие требованиям | Требует навыков разработки, возможны ошибки при неправильном коде |
| Ручное удаление через админку | Контроль над каждым товаром | Трудозатратно, не подходит для больших баз |