wp-lessons.ru wordpress WP-Lessons

WooCommerce: автоматическое удаление неактивных вариаций товаров без плагинов

Что такое неактивные вариации и зачем их удалять?

В WooCommerce вариации товаров — это отдельные записи, связанные с основным товаром. Иногда на сайте накапливается много вариаций, которые не продаются, не отображаются в каталоге или не используются. Это увеличивает размер базы данных и замедляет работу сайта. Автоматическое удаление таких вариаций помогает поддерживать чистоту данных и улучшить производительность.

Как диагностировать наличие неактивных вариаций?

Для начала нужно понять, какие вариации считать неактивными. Обычно это вариации, которые:

  • не опубликованы (статус не "publish"),
  • не имеют продаж за определённый период,
  • не отображаются в каталоге (например, скрыты или черновики),
  • не связаны с активными товарами.

Диагностика выполняется через SQL-запрос или WP-CLI. Пример запроса для поиска неопубликованных вариаций:

SELECT ID, post_parent, post_status FROM wp_posts WHERE post_type = 'product_variation' AND post_status != 'publish';

Ещё можно проверить продажи вариаций через таблицы WooCommerce заказов, но это сложнее и требует отдельного запроса.

Пошаговое решение: автоматическое удаление неактивных вариаций

Для удаления вариаций без плагинов используем WP-CLI и PHP-код с хуком cron.

1. Скрипт удаления неактивных вариаций

function delete_inactive_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'post_status'    => ['draft', 'pending', 'private'],
        'posts_per_page' => -1,
        'fields'         => 'ids'
    ];

    $query = new WP_Query($args);
    if ($query->have_posts()) {
        foreach ($query->posts as $variation_id) {
            wp_delete_post($variation_id, true);
        }
    }
}

// Добавим в wp-cron для еженедельного запуска
add_action('wp_scheduled_delete_inactive_variations', 'delete_inactive_variations');

if (!wp_next_scheduled('wp_scheduled_delete_inactive_variations')) {
    wp_schedule_event(time(), 'weekly', 'wp_scheduled_delete_inactive_variations');
}

Этот код удалит все вариации со статусом, отличным от «publish».

2. Дополнительная фильтрация по дате создания и продажам

Для более сложных условий (например, без продаж за 3 месяца) нужно расширить логику, например, используя метаданные заказов.

Проверка результата после внедрения

  • Через админку WooCommerce откройте товар с вариациями — проверьте, что неактивные вариации исчезли.
  • Запустите SQL-запрос из раздела диагностики повторно — неактивных вариаций быть не должно.
  • Проверьте логи cron (например, с помощью плагина WP Crontrol) — задача должна запускаться еженедельно.

Частые ошибки и как их исправить

  • Вариации не удаляются: проверьте, что cron-задача зарегистрирована и запускается. Можно вызвать функцию вручную через WP-CLI.
  • Удаляются активные вариации: будьте внимательны с параметрами запроса. Проверьте, что в post_status указаны только неактивные статусы.
  • Ошибка нехватки ресурсов при удалении: если вариаций много, делайте удаление пакетами с пагинацией.

Практические советы по безопасности и производительности

  • Перед удалением сделайте резервную копию базы данных, чтобы можно было восстановить данные.
  • Используйте wp_delete_post($variation_id, true) с флагом true для полного удаления без помещения в корзину.
  • Для больших магазинов используйте пакетное удаление и ставьте задачу на время низкой нагрузки.
  • Не удаляйте вариации, если они связаны с активными заказами — это может привести к ошибкам на сайте.

Сравнение способов удаления неактивных вариаций

МетодПлюсыМинусыКомпромисс
WP-CLIБыстро, без нагрузки на сайтТребует доступа к серверуИспользовать для разовых операций
PHP-код с cronАвтоматизация, работает без вмешательстваМожет нагружать сайт при большом объёмеУдалять пакетами, настроить время запуска
Плагины (Clearfy и др.)Удобный интерфейс, дополнительные функцииМожет замедлять сайт, платные версииИспользовать для комплексной оптимизации
×
Сайт, который вау!
-15%

на премиум-тему
JournalX для WordPress

Хватай промо и действуй ⋙