Диагностика проблемы: зачем нужно автоматическое удаление товаров по статусу
В интернет-магазинах на WooCommerce часто накапливаются товары, которые уже не продаются или помечены как неактивные. Это приводит к загромождению каталога, снижению удобства управления, а иногда и к проблемам с производительностью. Автоматизация удаления таких товаров помогает поддерживать базу данных в актуальном состоянии без ручных операций.
Как понять, что товары нужно удалять автоматически?
- Товары имеют специальный статус или метку, например, 'outofstock' или пользовательское поле 'inactive'.
- Товары не обновлялись длительное время (например, более 6 месяцев).
- Накопилось большое количество устаревших товаров, замедляющих работу сайта.
Пошаговое решение: как настроить автоматическое удаление товаров по неактивному статусу
1. Определение признака неактивного товара
В WooCommerce стандартно нет статуса "неактивный", но можно использовать кастомное поле или тег для пометки товаров, которые нужно удалять.
Например, добавим мета-ключ _inactive_product со значением yes для таких товаров.
2. Создание WP-Cron задачи для регулярной проверки
Добавим в functions.php или в отдельный плагин следующий код для регистрации и планирования задачи:
if ( ! wp_next_scheduled( 'wc_delete_inactive_products_daily' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_inactive_products_daily' );
}
3. Функция удаления неактивных товаров
Функция будет искать товары с мета-ключом _inactive_product == yes и датой последнего обновления старше заданного срока (например, 30 дней), затем удалять их без возможности восстановления.
function wc_delete_inactive_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_inactive_product',
'value' => 'yes',
],
],
'date_query' => [
[
'column' => 'post_modified_gmt',
'before' => '30 days ago',
],
],
'fields' => 'ids',
];
$query = new WP_Query( $args );
if ( ! empty( $query->posts ) ) {
foreach ( $query->posts as $product_id ) {
wp_delete_post( $product_id, true ); // true = безвозвратное удаление
}
}
}
add_action( 'wc_delete_inactive_products_daily', 'wc_delete_inactive_products' );
4. Проверка работы задачи WP-Cron
Убедитесь, что WP-Cron активен и запускается регулярно. Для проверки можно использовать плагин WP Crontrol или выполнить вручную:
do_action('wc_delete_inactive_products_daily');Если товары с указанной меткой и датой удаления есть, они будут удалены сразу.
Проверка результата после внедрения
- Добавьте тестовый товар с мета-ключом
_inactive_product = yesи датой обновления более 30 дней назад (можно вручную в БД или через код). - Запустите вручную задачу или дождитесь автоматического запуска WP-Cron.
- Проверьте, что товар был удалён (не отображается в админке и базе данных).
- Проверьте логи ошибок и уведомления сервера, чтобы убедиться в отсутствии проблем.
Частые ошибки и как их исправить
- Товары не удаляются: проверьте, что WP-Cron работает, а событие
wc_delete_inactive_products_dailyзапланировано. Можно временно заменить 'daily' на 'hourly' для теста. - Удаляются не те товары: убедитесь, что мета-ключ и значение заданы корректно. Проверьте запрос WP_Query отдельно.
- WP-Cron не запускается на сервере: настройте системный cron, если сайт не получает посетителей, либо используйте плагин для запуска cron задач вручную.
- Потеря важных товаров: добавьте дополнительную проверку или уведомление перед удалением, например, отправку письма админу.
Практические советы по безопасности и производительности
- Используйте безвозвратное удаление (
wp_delete_post($id, true)) только если уверены, что резервное копирование настроено. - Для больших баз делайте удаление партиями (например, по 20 товаров за раз), чтобы избежать таймаутов. Пример:
function wc_delete_inactive_products_batch() {
$args = [
'post_type' => 'product',
'posts_per_page' => 20,
'meta_query' => [
[
'key' => '_inactive_product',
'value' => 'yes',
],
],
'date_query' => [
[
'column' => 'post_modified_gmt',
'before' => '30 days ago',
],
],
'fields' => 'ids',
];
$query = new WP_Query( $args );
if ( ! empty( $query->posts ) ) {
foreach ( $query->posts as $product_id ) {
wp_delete_post( $product_id, true );
}
}
}
- Резервное копирование перед удалением — обязательная мера.
- Для более сложных сценариев можно интегрировать с плагинами типа Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wponline.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-tovarov-po-neaktivnomu-statusu) для дополнительной оптимизации базы.
Сравнение вариантов реализации автоматического удаления
| Метод | Преимущества | Недостатки | Рекомендации |
|---|---|---|---|
| WP-Cron с кастомным кодом (как в статье) | Гибкость, возможность тонкой настройки | Зависимость от работы WP-Cron, требует навыков программирования | Лучше для опытных разработчиков, требует тестирования |
| Плагины автоматизации (например, WP Bulk Delete) | Удобный интерфейс, быстрое внедрение | Меньше контроля, возможны конфликты | Подходит для простых случаев, если не требуется кастомизация |
| Ручное удаление через админку | Простота, нет кода | Трудозатратно, риск ошибок при больших объемах | Использовать только для единичных удалений |