Автоматическое удаление товаров WooCommerce с отсутствующими вариациями

Диагностика проблемы отсутствующих вариаций в WooCommerce

В интернет-магазинах на WooCommerce часто появляются товары с вариациями, которые по разным причинам становятся недоступными (отсутствуют на складе, сняты с производства и т.п.). Если все вариации товара отсутствуют, такой товар теряет смысл и мешает покупателям. Ручное удаление таких товаров неудобно при большом каталоге. Поэтому нужна автоматизация удаления товаров, у которых нет доступных вариаций.

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

Каждый вариативный товар в WooCommerce хранит вариации как дочерние посты с типом product_variation. У вариаций может быть мета-ключ _stock_status со значением instock или outofstock. Если у всех вариаций статус outofstock, товар считается отсутствующим.

Пошаговое решение: удаление товаров без доступных вариаций

Для автоматизации процесса напишем кастомный скрипт, который можно запускать вручную или через WP-Cron. Он просматривает все вариативные товары, проверяет статус вариаций и удаляет товары без доступных вариаций.

1. Функция для проверки вариаций и удаления товаров

function delete_variation_products_without_stock() {
    // Получаем все вариативные товары
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'tax_query'      => [
            [
                'taxonomy' => 'product_type',
                'field'    => 'slug',
                'terms'    => 'variable',
            ],
        ],
        'fields' => 'ids',
    ];
    $product_ids = get_posts($args);

    foreach ($product_ids as $product_id) {
        $variations = new WP_Query([
            'post_type'      => 'product_variation',
            'post_parent'    => $product_id,
            'posts_per_page' => -1,
            'fields'         => 'ids',
        ]);

        $has_instock = false;
        foreach ($variations->posts as $variation_id) {
            $stock_status = get_post_meta($variation_id, '_stock_status', true);
            if ($stock_status === 'instock') {
                $has_instock = true;
                break;
            }
        }

        if (!$has_instock) {
            // Удаляем товар без доступных вариаций
            wp_delete_post($product_id, true); // true для полного удаления
        }
    }
}

2. Запуск функции по расписанию с WP-Cron

Чтобы автоматизировать удаление, регистрируем событие в WP-Cron, например, раз в сутки:

if (!wp_next_scheduled('daily_delete_outofstock_variable_products')) {
    wp_schedule_event(time(), 'daily', 'daily_delete_outofstock_variable_products');
}

add_action('daily_delete_outofstock_variable_products', 'delete_variation_products_without_stock');

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

  • Запустите функцию вручную из темы или плагина, например, добавив вызов delete_variation_products_without_stock(); в файл functions.php и обновив сайт.
  • Проверьте, что товары с вариациями, все из которых имеют _stock_status = outofstock, удалены из админки WooCommerce.
  • В базе данных таблице wp_posts эти товары теперь отсутствуют.
  • Убедитесь, что товары с хотя бы одной вариацией в наличии не удалены.

Частые ошибки и способы исправления

  • Ошибка: Функция не удаляет товары.
    Причина: Вариации не имеют корректного мета-ключа _stock_status или статус хранится в другом месте.
    Решение: Проверьте метаполя вариаций через phpMyAdmin или плагин Debug Info. Убедитесь, что _stock_status используется и содержит 'instock' или 'outofstock'.
  • Ошибка: Функция удаляет товары с доступными вариациями.
    Причина: Некорректная логика проверки статуса.
    Решение: Проверьте циклы и условие if ($stock_status === 'instock') — оно должно прерывать проверку и не удалять товар.
  • Ошибка: WP-Cron не запускается.
    Причина: На сервере отключены внешние запросы или нет посещений сайта.
    Решение: Настройте системный cron для запуска wp-cron.php или запускайте функцию вручную.

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

  • Удаление товаров — необратимая операция. Рекомендуется сначала делать резервные копии базы данных.
  • Запуск функции на больших магазинах может нагрузить сервер. Оптимизируйте запросы, например, обрабатывайте товары пакетно.
  • Добавьте журналирование удалённых товаров для аудита, например, через error_log() или запись в отдельную таблицу.
  • Для более гибкой автоматизации можно расширить скрипт, учитывая даты последнего обновления товара или другие параметры.

Сравнение подходов: плагин vs кастомный код

КритерийПлагинКастомный кодКомпромисс
ГибкостьОграничена настройкамиМаксимальнаяИспользовать плагин с возможностью добавления своих фильтров
ПроизводительностьМожет потреблять ресурсыОптимизирован под задачуКод с кешированием и пакетной обработкой
БезопасностьЗависит от разработчикаЗависит от качества кодаРегулярные обновления и код-ревью
АвтоматизацияЧасто встроенаНужно настраивать самостоятельноДобавление WP-Cron
Автоматическое обновление остатков товаров в WooCommerce с помощью WordPress хуков
09.06.2026
Оптимизация пользовательских полей для вариативных товаров в WooCommerce на WordPress
02.03.2026
Автоматический импорт постов из Telegram в WordPress
05.03.2026
Как создать собственный шорткод в WordPress
11.11.2025
Как автоматизировать удаление старых комментариев в WordPress
09.03.2026