Диагностика проблемы: зачем удалять неактивные варианты товаров
В WooCommerce часто накапливаются неактивные или устаревшие вариации товаров: без остатков, давно не активные, или снятые с продажи. Это замедляет работу сайта, увеличивает размер базы данных и усложняет администрирование каталога. Автоматическое удаление неактивных вариантов позволяет поддерживать базу в чистоте без ручной работы.
Как определить, какие варианты считать неактивными
Для автоматической очистки нужно чётко понимать критерии неактивности. Обычно это:
- отсутствие остатков в запасах (
stock_quantity = 0) - статус варианта — «черновик» или «скрыт» (
post_status) - отсутствие продаж за последний период (опционально, требует дополнительного анализа заказов)
В нашем примере возьмём первый и второй критерии, как самые простые для реализации.
Пошаговое решение: создание WP-Cron задачи для удаления неактивных вариантов
Для автоматизации используем встроенный WP-Cron, который запускает функцию по расписанию. В ней мы находим все вариации с нулевым остатком или статусом «черновик» и удаляем их.
1. Регистрация пользовательского расписания
add_filter('cron_schedules', function($schedules) {
if (!isset($schedules['daily'])) {
$schedules['daily'] = [
'interval' => 86400,
'display' => __('Once Daily')
];
}
return $schedules;
});Используем стандартный интервал «daily» (раз в день).
2. Планирование задачи при активации плагина или темы
register_activation_hook(__FILE__, function() {
if (!wp_next_scheduled('wpb_delete_inactive_variations')) {
wp_schedule_event(time(), 'daily', 'wpb_delete_inactive_variations');
}
});
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('wpb_delete_inactive_variations');
});3. Реализация функции удаления вариантов
add_action('wpb_delete_inactive_variations', function() {
// Запрос вариантов с нулевым остатком или статусом 'draft'
$args = [
'post_type' => 'product_variation',
'post_status' => ['publish', 'draft'],
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '='
]
]
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $variation) {
// Проверяем статус
if ($variation->post_status === 'draft' || get_post_meta($variation->ID, '_stock_status', true) === 'outofstock') {
wp_delete_post($variation->ID, true); // Безвозвратно удаляем
}
}
}
wp_reset_postdata();
});Проверка результата
- Перейдите в раздел «Товары — Вариации» в админке WooCommerce и убедитесь, что неактивные варианты удалены.
- Проверьте наличие запланированной задачи в WP-Cron с помощью плагина
Cron Managerили аналогичного. - Для теста можно уменьшить интервал запуска WP-Cron на несколько минут и вручную запустить событие в Cron Manager.
Частые ошибки и их исправление
- Задача WP-Cron не запускается: проверьте, что на сайте посещения, которые запускают WP-Cron, или настройте системный cron для вызова
wp-cron.php. - Вариации не удаляются: убедитесь, что запрос WP_Query корректно находит варианты с нужным статусом и мета-данными. Используйте
error_logилиvar_dumpдля отладки. - Удаляются лишние варианты: уточните критерии отбора в
meta_queryиpost_status. - Нарушение целостности данных: перед удалением создайте резервную копию базы, чтобы избежать потерь.
Практические советы по безопасности и производительности
- Удаляйте записи с помощью функции
wp_delete_postс параметромtrue, чтобы не оставлять мусор в базе. - При большом количестве вариаций разбивайте удаление на порции, чтобы не перегрузить сервер.
- Используйте транзакции базы данных или проверяйте связи вариаций с родительскими товарами.
- Ограничьте права пользователя, под которым запускается WP-Cron, чтобы избежать случайных удалений.
Сравнение подходов для автоматического удаления неактивных вариаций
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с пользовательским кодом | Гибкость, бесплатно, без сторонних плагинов | Зависит от посещаемости сайта, требуется тестирование |
| Плагины очистки WooCommerce | Простота настройки, готовые функции | Может нагружать сайт, не всегда гибко |
| Ручная очистка через SQL-запросы | Быстро и эффективно при больших объемах | Риск ошибок, требует навыков SQL |