Что такое неактивные вариации товаров и почему их нужно удалять
В WooCommerce неактивные вариации — это варианты товаров, которые не продаются, не отображаются в каталоге или не используются в заказах. Они создают нагрузку на базу данных, замедляют работу сайта и усложняют управление каталогом. Особенно актуально для магазинов с большим ассортиментом и частыми обновлениями.
Диагностика: как определить неактивные вариации товаров
Для начала нужно понять, какие вариации считаются неактивными. Обычно это:
- Вариации без продаж и просмотров за заданный период (например, 6 месяцев).
- Вариации с нулевым запасом и без заказов.
- Вариации, отключённые вручную или с пустыми атрибутами.
Проверить можно через SQL-запросы к базе данных, либо с помощью кода, который выбирает вариации с нужными параметрами.
Пример SQL для выявления вариаций без заказов и с нулевым запасом:
SELECT p.ID FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.ID
LEFT JOIN wp_postmeta pm ON pm.post_id = p.ID AND pm.meta_key = '_stock'
WHERE p.post_type = 'product_variation'
AND (oi.order_item_name IS NULL)
AND (pm.meta_value = '0' OR pm.meta_value IS NULL);Пошаговое решение задачи автоматического удаления неактивных вариаций
Реализуем функцию на PHP, которую можно запускать по расписанию через WP-Cron. Она будет искать неактивные вариации и удалять их.
Код для автоматического удаления неактивных вариаций:
function wpg_remove_inactive_variations() {
$days = 180; // Период без активности в днях
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock',
'value' => '0',
'compare' => '=',
],
],
'date_query' => [
'column' => 'post_modified',
'before' => $date_threshold,
],
'fields' => 'ids',
];
$variations = get_posts($args);
foreach ($variations as $variation_id) {
// Проверяем, были ли заказы с этой вариацией
$orders = wc_get_orders([
'limit' => 1,
'status' => ['completed', 'processing'],
'meta_key' => '_variation_id',
'meta_value' => $variation_id,
]);
if (empty($orders)) {
wp_delete_post($variation_id, true);
}
}
}
// Запуск функции через WP-Cron (пример раз в сутки)
if (!wp_next_scheduled('wpg_daily_remove_variations')) {
wp_schedule_event(time(), 'daily', 'wpg_daily_remove_variations');
}
add_action('wpg_daily_remove_variations', 'wpg_remove_inactive_variations');Обратите внимание, что проверка заказов по мета-ключу '_variation_id' может потребовать дополнительной настройки или адаптации под используемые плагины.
Проверка результата после внедрения
- Зайдите в админку WooCommerce → Товары → Вариации и проверьте, что неактивные вариации исчезли.
- В базе данных проверьте таблицу
wp_postsна наличие удалённых постов типаproduct_variation. - Включите логирование ошибок и проверяйте логи на предмет ошибок при удалении.
Частые ошибки и как их исправить
- Удаляются нужные вариации. Проверьте логику фильтрации в
get_posts, возможно, стоит добавить дополнительные условия. - Функция не запускается по расписанию. Убедитесь, что WP-Cron работает, и на сайте есть трафик для запуска задач.
- Проблемы с правами доступа. Запускать код нужно с правами администратора, а wp_delete_post требует корректных прав.
- Проверка заказов не работает. Стандартный WooCommerce не хранит связь вариации с заказом через мета-ключ '_variation_id', возможно, потребуется кастомный SQL-запрос.
Практические советы для безопасности и производительности
- Перед запуском автоматического удаления создайте бэкап базы данных.
- Запускайте удаление в низкую нагрузку сервера, чтобы избежать тайм-аутов.
- Добавьте логирование удалённых вариаций для возможного восстановления.
- Оптимизируйте запросы, ограничивайте количество вариаций, обрабатываемых за один запуск.
- Используйте WP-CLI для массового удаления, если данные слишком большие.
Сравнительная таблица вариантов удаления неактивных вариаций
| Способ | Плюсы | Минусы | Подходит для |
|---|---|---|---|
| Плагин очистки WooCommerce | Простота, интерфейс | Может быть тяжеловесным, не гибким | Малые и средние магазины |
| Кастомный код с WP-Cron (описано выше) | Гибкость, автоматизация, минимальные зависимости | Требует отладки, знания PHP и WP API | Разработчики, крупные магазины |
| Ручное удаление через админку | Контроль каждого варианта | Очень трудоёмко, риск ошибки | Малый ассортимент |