Диагностика проблемы с удалением товаров в WooCommerce
В интернет-магазинах на WooCommerce часто возникает задача автоматически удалять товары, которые не продаются длительное время или у которых заканчивается срок актуальности. Стандартными средствами WooCommerce это реализовать сложно — требуется написать кастомный код или использовать плагины. Основные признаки необходимости автоматизации:
- В каталоге остаются товары с нулевым остатком, которые не планируется пополнять;
- Есть товары с ограниченным сроком актуальности (например, сезонные или промо-товары);
- Администратор тратит много времени на ручное удаление устаревших товаров.
Если не удалять такие товары, страдает пользовательский опыт и SEO — сайт загружен устаревшим контентом.
Пошаговое решение: автоматическое удаление товаров по остатку и дате
1. Добавляем кастомное поле с датой удаления
Для управления датой удаления у товара создайте произвольное поле (custom meta) delete_after_date. Его можно добавить вручную через админку или программно:
add_action('woocommerce_product_options_general_product_data', function() {
woocommerce_wp_text_input([
'id' => 'delete_after_date',
'label' => 'Дата удаления товара (YYYY-MM-DD)',
'desc_tip' => true,
'description' => 'Товар будет автоматически удалён после указанной даты'
]);
});
add_action('woocommerce_process_product_meta', function($post_id) {
if (isset($_POST['delete_after_date'])) {
update_post_meta($post_id, 'delete_after_date', sanitize_text_field($_POST['delete_after_date']));
}
});2. Создаём WP-Cron задачу для ежедневной проверки товаров
Добавьте функцию, которая ежедневно проверяет товары и удаляет те, у которых:
- Остаток равен 0;
- Дата в
delete_after_dateменьше или равна текущей.
function auto_delete_expired_products() {
$today = date('Y-m-d');
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
'relation' => 'AND',
[
'key' => '_stock',
'value' => '0',
'compare' => '=',
'type' => 'NUMERIC'
],
[
'key' => 'delete_after_date',
'value' => $today,
'compare' => '<=',
'type' => 'DATE'
]
]
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
wp_delete_post(get_the_ID(), true); // без возможности восстановления
}
}
wp_reset_postdata();
}
if (!wp_next_scheduled('auto_delete_expired_products_hook')) {
wp_schedule_event(time(), 'daily', 'auto_delete_expired_products_hook');
}
add_action('auto_delete_expired_products_hook', 'auto_delete_expired_products');3. Проверяем остаток товара
В WooCommerce остаток хранится в мета-поле _stock. Если у вас используется управление запасами, убедитесь, что оно включено для товаров, чтобы это поле корректно обновлялось.
Проверка результата после внедрения
- Создайте тестовый товар с остатком 0 и датой удаления, например, вчерашней.
- Запустите вручную функцию
auto_delete_expired_productsчерез WP-CLI:
wp eval 'auto_delete_expired_products();'- Убедитесь, что товар удалился из админки и на сайте.
- Проверьте логи сервера и работу WP-Cron (например, с плагином WP Control) — должна быть запланирована ежедневная задача.
Частые ошибки и как их исправить
- Товары не удаляются, хотя условия выполняются: Проверьте, что WP-Cron работает корректно. На некоторых хостингах WP-Cron не запускается автоматически, используйте системный cron для вызова
wp-cron.php. - Удаляются не те товары: Проверьте правильность мета-запроса. Например, поле
_stockдолжно быть числом, а дата — в формате YYYY-MM-DD. - Удаление происходит, но товары остаются в базе: Используйте
wp_delete_post($id, true)с параметромtrueдля безвозвратного удаления. - Проблемы с производительностью при большом каталоге: Делайте выборку и удаление партиями, например, по 50 товаров за запрос.
Практические советы по безопасности и производительности
- Используйте безвозвратное удаление только для товаров, которые точно не понадобятся — резервируйте базу перед внедрением.
- Ограничьте права пользователей, чтобы никто случайно не менял дату удаления без контроля.
- Для больших магазинов оптимизируйте запросы, используйте индексы в БД по мета-полям.
- Проверяйте логи WP-Cron и ошибок PHP, чтобы вовремя отлавливать сбои автоматизации.
Сравнение вариантов реализации удаления товаров
| Метод | Плюсы | Минусы | Рекомендуем |
|---|---|---|---|
| Плагин автоматизации удаления | Быстрая настройка, готовые функции | Может нагружать сайт, ограничения в настройках | Для небольших магазинов |
| Кастомный WP-Cron с мета-полями | Гибкость, точный контроль, легко расширять | Требует навыков программирования, настройка cron | Для средних и больших проектов |
| Ручное удаление через админку | Простота, нет кода | Затратно по времени, риск ошибок | Для малых магазинов с небольшим ассортиментом |