Диагностика проблемы: зачем и когда нужно удалять неактивные варианты товаров
В WooCommerce часто возникают ситуации, когда в товаре накапливаются варианты, которые перестали быть актуальными: устаревшие цвета, размеры, комплектации. Эти варианты занимают место в базе данных, усложняют администрирование и могут сбивать с толку покупателей. Автоматическое удаление неактивных вариантов по расписанию помогает поддерживать базу данных в актуальном состоянии и улучшает производительность магазина.
Определение «неактивного» варианта товара
Вариант считается неактивным, если он:
- не опубликован (
post_status != 'publish'), или - имеет остаток на складе равный нулю (
_stock = 0), и - не был продан и не обновлялся длительное время (например, 3 месяца).
В зависимости от логики магазина критерии можно корректировать.
Пошаговое решение: код для автоматического удаления неактивных вариантов товаров
1. Создаем функцию для удаления вариантов по критериям
function wpb_remove_inactive_variations() {
// Период неактивности в днях
$days_inactive = 90;
$date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days_inactive . " days"));
// Получаем ID всех вариативных товаров
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'post_status' => ['publish', 'private', 'draft'],
'date_query' => [
[
'column' => 'post_modified_gmt',
'before' => $date_threshold,
],
],
'fields' => 'ids',
];
$variation_ids = get_posts($args);
foreach ($variation_ids as $variation_id) {
$stock = get_post_meta($variation_id, '_stock', true);
$stock_status = get_post_meta($variation_id, '_stock_status', true);
$post_status = get_post_status($variation_id);
// Проверяем условия неактивности
if (($post_status !== 'publish' || $stock == 0 || $stock_status === 'outofstock')) {
// Удаляем вариант без восстановления
wp_delete_post($variation_id, true);
}
}
}2. Добавляем крон-задачу для запуска функции ежедневно
if (!wp_next_scheduled('wpb_daily_remove_inactive_variations')) {
wp_schedule_event(time(), 'daily', 'wpb_daily_remove_inactive_variations');
}
add_action('wpb_daily_remove_inactive_variations', 'wpb_remove_inactive_variations');3. Регистрируем деактивацию крон-задачи при выключении плагина или темы
function wpb_deactivate_cron() {
$timestamp = wp_next_scheduled('wpb_daily_remove_inactive_variations');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpb_daily_remove_inactive_variations');
}
}
register_deactivation_hook(__FILE__, 'wpb_deactivate_cron');Как проверить, что решение работает
- В базе данных просмотреть таблицу
wp_postsс типомproduct_variationи статусомpublish. Запомнить количество до выполнения скрипта. - Запустить функцию вручную (через WP-CLI или временно добавить вызов
wpb_remove_inactive_variations()вfunctions.php). - Проверить, что варианты с нулевым остатком и статусом не
publishудалены. - Для автоматической проверки подождать выполнение крон-задачи (ежедневно) и сравнить количество вариантов.
Частые ошибки и как их исправить
- Ошибка: Крон-задача не запускается.
Причина: Отсутствие посетителей на сайте или отключен WP-Cron.
Решение: Настроить системный cron для вызоваwp-cron.phpили использовать плагин типа WP Crontrol для теста. - Ошибка: Удаляются нужные варианты.
Причина: Слишком агрессивные критерии отбора.
Решение: Добавьте дополнительную проверку, например, дату последней продажи или мета-данные, чтобы не удалять варианты, которые недавно покупались. - Ошибка: Функция вызывает ошибку из-за памяти.
Решение: Обрабатывать варианты партиями, используя пагинацию в WP_Query.
Практические советы по безопасности и производительности
- Не удаляйте варианты сразу, если не уверены. Лучше сначала добавить метку «неактивно» и вручную подтвердить удаление.
- Для больших магазинов обработку вариантов лучше разбить на несколько шагов по времени (например, через WP-Cron с интервалом в несколько часов).
- Резервное копирование базы данных перед автоматическим удалением — обязательный пункт.
- Ограничьте выполнение функции по времени, чтобы избежать превышения лимита памяти и времени выполнения скрипта.
Сравнение способов удаления неактивных вариантов товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простой, контролируемый процесс | Трудоемко, неэффективно при большом количестве |
| Плагины для очистки WooCommerce | Автоматизация, готовый интерфейс | Дополнительные зависимости, возможные конфликты |
| Кастомный код с WP-Cron (данный способ) | Полный контроль, нет лишних плагинов | Требует навыков, возможные ошибки при неверной настройке |