Диагностика проблемы: зачем и когда удалять неактивные товары в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются товары, которые долгое время не продаются, не обновляются или имеют статус «черновик»/«откл.» без перспективы возвращения. Это приводит к увеличению объема базы данных и замедлению работы сайта. Автоматическое удаление таких товаров помогает поддерживать базу в актуальном состоянии, снижая нагрузку и упрощая администрирование.
Настройка автоматического удаления неактивных товаров через WP-Cron
1. Критерии отбора товаров для удаления
Определим, что считать «неактивным» товаром. Обычно это:
- статус
draftилиpendingболее 30 дней; - статус
privateилиtrash; - отсутствие продаж за последние 3 месяца;
- отсутствие обновления описания и цены за 90 дней.
Выбранные критерии можно адаптировать под конкретный магазин.
2. Создаем пользовательскую функцию удаления
Добавим код в файл functions.php вашей темы (рекомендуется использовать дочернюю) или в отдельный плагин:
function wpmanual_delete_inactive_products() {
$args = array(
'post_type' => 'product',
'post_status' => array('draft', 'pending', 'private', 'trash'),
'date_query' => array(
array(
'column' => 'post_modified_gmt',
'before' => '90 days ago',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'total_sales',
'value' => 0,
'compare' => '=',
'type' => 'NUMERIC',
),
array(
'key' => 'total_sales',
'compare' => 'NOT EXISTS',
),
),
);
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true - удаляет безвозвратно
}
}
}3. Регистрируем CRON-задачу для регулярного запуска
Добавим планировщик в functions.php:
function wpmanual_schedule_inactive_products_deletion() {
if (!wp_next_scheduled('wpmanual_delete_inactive_products_event')) {
wp_schedule_event(time(), 'daily', 'wpmanual_delete_inactive_products_event');
}
}
add_action('wp', 'wpmanual_schedule_inactive_products_deletion');
add_action('wpmanual_delete_inactive_products_event', 'wpmanual_delete_inactive_products');4. Очистка CRON при деактивации темы или плагина
function wpmanual_clear_inactive_products_deletion_cron() {
$timestamp = wp_next_scheduled('wpmanual_delete_inactive_products_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpmanual_delete_inactive_products_event');
}
}
register_deactivation_hook(__FILE__, 'wpmanual_clear_inactive_products_deletion_cron');Как проверить, что автоматическое удаление сработало
- Проверьте логи сервера или включите WP_DEBUG_LOG, чтобы отследить ошибки.
- Выполните вручную функцию
wpmanual_delete_inactive_products()через WP-CLI или временно вызовите ее в шаблоне (например, вызов вfunctions.php), чтобы убедиться, что товары удаляются. - Проверяйте список товаров в админке WooCommerce — неактивные должны удаляться автоматически.
- Используйте плагин WP Crontrol для просмотра и управления запланированными задачами.
Частые ошибки и как их исправить
- CRON не запускается: На многих хостингах WP-Cron работает только при посещении сайта. Для надежной работы настройте системный CRON на сервере или используйте плагин WP Crontrol.
- Удаляются не те товары: Проверьте параметры
WP_Query, особенно статусы и даты. Добавьте вывод ID товаров для отладки. - Отсутствует поле
total_sales: Это мета поле WooCommerce. Если оно не создается, убедитесь, что хотя бы один раз был оформлен заказ с этим товаром. - Удаление происходит слишком часто или редко: Проверьте расписание CRON, оптимально — 1 раз в день.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии перед автоматическим удалением данных.
- Не используйте
wp_delete_postс параметромtrueбез уверенности — можно сначала пометить товары меткой, а потом удалять. - Для больших магазинов делайте удаление порциями (например, по 50 товаров за один запуск) чтобы избежать превышения лимитов памяти и времени выполнения.
- Проверяйте нагрузку сервера и логи ошибок после внедрения скрипта.
Сравнение методов автоматического удаления товаров
| Метод | Преимущества | Недостатки | Рекомендуемые случаи |
|---|---|---|---|
| Плагин автоклинера | Простота настройки, готовый интерфейс | Может быть избыточным, нагрузка | Маленькие магазины без разработчика |
| WP-Cron + кастомный код | Гибкость, точное соответствие требованиям | Требует знаний PHP и WordPress | Средние и крупные магазины, кастомизация |
| Ручное удаление через WP-CLI | Максимальный контроль | Не автоматизировано, требует доступа к серверу | Опытные администраторы, внеплановые чистки |