Диагностика проблемы: зачем и когда удалять неактивные варианты товаров
В магазинах WooCommerce нередко накапливаются варианты товаров, которые больше не продаются или неактивны. Они занимают место в базе данных, могут путать покупателей и влиять на производительность сайта. Особенно актуально, если каталог содержит сотни или тысячи товаров с множественными вариациями.
Задача — автоматически находить и удалять неактивные варианты (variations), которые не использовались или не обновлялись длительное время, например, 90 дней. При этом нужно сделать это без плагинов, чтобы уменьшить нагрузку и сохранить контроль над процессом.
Как проверить, есть ли неактивные варианты в WooCommerce
- В админке WooCommerce перейдите в раздел Товары > Вариации (если такой нет, откройте товар с вариациями и посмотрите список вариаций).
- Обратите внимание на вариации со статусом
draftилиprivate, либо на те, у которых в метаданных нет продаж и обновлений. - Подключитесь к базе данных и выполните SQL-запрос, чтобы найти вариации без заказов и обновлений:
SELECT p.ID, p.post_title, p.post_status FROM wp_posts p LEFT JOIN wp_woocommerce_order_items oi ON p.ID = oi.order_item_id WHERE p.post_type = 'product_variation' AND p.post_modified < DATE_SUB(NOW(), INTERVAL 90 DAY) AND oi.order_item_id IS NULL;
Пошаговое решение: автоматическое удаление неактивных вариаций через WP-Cron
1. Создайте функцию для удаления неактивных вариантов
function wpb_delete_inactive_variations() {
global $wpdb;
$days_inactive = 90; // период бездействия в днях
// Получаем ID вариаций, которые не обновлялись более 90 дней и не были в заказах
$query = $wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN (SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_items) oi ON p.ID = oi.order_item_id
WHERE p.post_type = 'product_variation'
AND p.post_modified < %s
AND oi.order_item_id IS NULL",
date('Y-m-d H:i:s', strtotime("-{$days_inactive} days"))
);
$inactive_variations = $wpdb->get_col($query);
if (empty($inactive_variations)) {
return;
}
foreach ($inactive_variations as $variation_id) {
wp_delete_post($variation_id, true); // принудительное удаление
}
}2. Зарегистрируйте WP-Cron событие для регулярного запуска
if (!wp_next_scheduled('wpb_delete_variations_daily')) {
wp_schedule_event(time(), 'daily', 'wpb_delete_variations_daily');
}
add_action('wpb_delete_variations_daily', 'wpb_delete_inactive_variations');3. Добавьте код в functions.php вашей темы или в отдельный плагин
Так вы сможете управлять кодом централизованно и избежать удаления при смене темы.
Проверка результата после внедрения
- Выполните вручную запуск функции из консоли WP-CLI:
wp eval 'wpb_delete_inactive_variations();'и проверьте логи ошибок. - Перед и после запуска функции выполните SQL-запрос из раздела диагностики, чтобы убедиться, что неактивные вариации удалены.
- Проверьте в админке WooCommerce — вариации должны исчезнуть.
- Убедитесь, что на фронтенде сайта нет ошибок и товары отображаются корректно.
Частые ошибки и как их исправить
- Ошибка: Нет эффекта от cron-задачи. Проверьте, что WP-Cron работает (например, запустите
wp cron event run wpb_delete_variations_daily). Если сайт с низкой посещаемостью — cron может не запускаться автоматически, используйте системный cron для вызова wp-cron.php. - Удаляются нужные варианты. Проверьте логику фильтрации по дате и заказам. Добавьте дополнительные проверки перед удалением, например, статус вариации
publish. - Производительность падает при выполнении функции. Ограничьте количество удаляемых вариаций за один запуск функцией
array_slice()или используйте пагинацию в SQL.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед запуском автоматических удалений.
- Для больших магазинов лучше разбить удаление на несколько этапов, чтобы не нагружать сервер.
- Используйте транзиенты или опцию для хранения времени последнего запуска, чтобы не запускать функцию чаще, чем нужно.
- Для надежности cron-задачи на продакшене настройте системный cron вызова WP-Cron:
* * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1 - Если вы используете WPShop Clearfy Pro, он может помочь с очисткой и оптимизацией базы без лишнего кода: https://wpshop.ru/plugins/clearfy