Как автоматизировать удаление старых вариативных товаров WooCommerce

Диагностика проблемы: зачем удалять старые вариативные товары

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

Как определить, какие вариативные товары можно удалить

  • Товары без заказов за последние 12 месяцев;
  • Товары со статусом "черновик" или "в ожидании" более 6 месяцев;
  • Вариации товара, которые не используются в заказах или неактивны;
  • Товары, помеченные меткой "устаревший" или с кастомным полем, указывающим на устаревание.

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

Для реализации решения используем WP-CLI или создание PHP-скрипта с использованием WP Cron для регулярного запуска.

1. Подключение и подготовка

Создайте в папке темы или плагина файл delete-old-variable-products.php. В нем опишите функцию для поиска и удаления товаров.

2. Код для поиска и удаления старых вариативных товаров

<?php
function wpguest_delete_old_variable_products() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'post_status'    => ['publish', 'draft', 'pending'],
        'tax_query'      => [[
            'taxonomy' => 'product_type',
            'field'    => 'slug',
            'terms'    => 'variable',
        ]],
        'date_query'     => [[
            'column'    => 'post_date',
            'before'    => '1 year ago',
        ]],
        'fields'         => 'ids',
    ];
    $old_products = get_posts($args);

    foreach ($old_products as $product_id) {
        // Проверяем, есть ли у товара заказы
        $orders = wc_get_orders([
            'limit'        => 1,
            'status'       => ['completed', 'processing', 'on-hold'],
            'product_id'   => $product_id,
        ]);
        if (empty($orders)) {
            // Удаляем вариации
            $product = wc_get_product($product_id);
            if ($product && $product->is_type('variable')) {
                $variations = $product->get_children();
                foreach ($variations as $variation_id) {
                    wp_delete_post($variation_id, true);
                }
            }
            // Удаляем сам товар
            wp_delete_post($product_id, true);
        }
    }
}

// Запуск функции через WP-Cron (например, раз в неделю)
add_action('wpguest_weekly_cleanup_hook', 'wpguest_delete_old_variable_products');

if (!wp_next_scheduled('wpguest_weekly_cleanup_hook')) {
    wp_schedule_event(time(), 'weekly', 'wpguest_weekly_cleanup_hook');
}
?>

3. Добавление в functions.php или плагин

Этот код можно добавить в functions.php вашей темы или создать отдельный мини-плагин для удобства.

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

  • Запустите функцию вручную через WP-CLI: wp eval 'wpguest_delete_old_variable_products();'
  • Проверьте, что товары, отвечающие критериям, отсутствуют в списке продуктов WooCommerce.
  • Проверьте базу данных — таблица wp_posts не содержит удалённых товаров и вариаций.
  • Убедитесь, что на сайте не появляются ошибки и отсутствуют ссылки на удалённые товары.

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

  • Удаление товаров с активными заказами: Проверьте корректность фильтра по заказам — функция wc_get_orders должна возвращать пустой массив для удаления.
  • Вариации не удаляются: Убедитесь, что используете метод get_children() для получения вариаций и вызываете wp_delete_post для каждой.
  • Функция не запускается по расписанию: Проверьте, что события WP-Cron активны, и нет конфликтов с плагинами, блокирующими WP-Cron.
  • Перегрузка сервера при большом количестве товаров: Разбейте удаление на порции, например, по 50 товаров за один запуск.

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

  • Используйте wp_delete_post с параметром true для полного удаления, включая метаданные.
  • Перед удалением сделайте резервную копию базы.
  • Для больших магазинов ограничьте количество удаляемых товаров за один запуск, используя параметр posts_per_page и WP Cron с коротким интервалом.
  • Добавьте логирование удалённых товаров для контроля.
  • Не удаляйте товары, если вы не уверены в отсутствии заказов — используйте дополнительные проверки по метаданным и заказам.

Сравнение способов автоматизации удаления

МетодПреимуществаНедостатки
Ручное удаление через админ-панельПростота, контрольТрудозатратно, риск ошибок при большом объёме
Плагин для очистки товаров (например, Bulk Delete)Интерфейс, фильтрыМожет быть платным, нагрузка на сайт
Код на PHP с WP-Cron (описанный способ)Автоматизация, гибкость, кастомизацияТребует навыков, настройка WP-Cron
Как автоматизировать удаление старого контента WooCommerce по дате
20.05.2026
Как автоматизировать удаление неиспользуемых вариативных изображений WooCommerce
12.05.2026
Как автоматизировать управление ролями пользователей в WordPress с помощью кода и плагинов
12.04.2026
Автоматизация изменения статусов заказов WooCommerce через код
17.07.2026
Как автоматизировать удаление старого кеша в WordPress
08.04.2026