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

Что такое зависшие варианты товаров и почему их нужно удалять

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

Удаление таких вариантов вручную неудобно при большом количестве товаров, поэтому нужна автоматизация процесса с помощью кода.

Диагностика проблемы зависших вариантов

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

SELECT p.ID, p.post_parent, p.post_status
FROM wp_posts p
WHERE p.post_type = 'product_variation'
AND (p.post_status = 'trash' OR p.post_parent NOT IN (SELECT ID FROM wp_posts WHERE post_type='product' AND post_status='publish'));

Этот запрос показывает варианты, которые либо удалены (в корзине), либо у которых нет активного родительского товара. Такие варианты не используются и могут быть удалены.

Как проверить вручную через админку

  • В WooCommerce -> Товары -> Вариации ищите товары с пустым списком вариантов или с вариантами, не отображающимися на фронте.
  • Проверяйте наличие ошибок при редактировании вариативных товаров.

Пошаговое решение: автоматическое удаление зависших вариантов через WP-CLI

Лучший способ — использовать WP-CLI для периодической очистки. Пример команды и скрипта:

wp eval-file delete-stale-variations.php

Содержимое delete-stale-variations.php:

<?php

// Получаем все вариации без активного родительского товара или в корзине
$variations = new WP_Query([
    'post_type'      => 'product_variation',
    'post_status'    => ['trash', 'publish', 'private'],
    'posts_per_page' => -1,
    'fields'         => 'ids',
]);

foreach ($variations->posts as $variation_id) {
    $parent_id = wp_get_post_parent_id($variation_id);
    $parent_post = get_post($parent_id);

    if (!$parent_post || $parent_post->post_status !== 'publish') {
        // Удаляем зависший вариант
        wp_delete_post($variation_id, true); // true - без корзины
        echo "Удалён вариант ID: $variation_id (родитель $parent_id)\n";
    }
}

echo "Очистка завершена.\n";

Этот скрипт можно запускать по CRON или вручную для очистки.

Автоматизация с помощью WP-Cron

Добавьте в functions.php:

function schedule_stale_variations_cleanup() {
    if (!wp_next_scheduled('cleanup_stale_variations_hook')) {
        wp_schedule_event(time(), 'daily', 'cleanup_stale_variations_hook');
    }
}
add_action('wp', 'schedule_stale_variations_cleanup');

add_action('cleanup_stale_variations_hook', function() {
    $variations = new WP_Query([
        'post_type'      => 'product_variation',
        'post_status'    => ['trash', 'publish', 'private'],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ]);

    foreach ($variations->posts as $variation_id) {
        $parent_id = wp_get_post_parent_id($variation_id);
        $parent_post = get_post($parent_id);

        if (!$parent_post || $parent_post->post_status !== 'publish') {
            wp_delete_post($variation_id, true);
        }
    }
});

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

После запуска скрипта или срабатывания WP-Cron:

  • Повторите SQL-запрос из раздела диагностики — зависшие варианты должны отсутствовать.
  • Проверьте админку WooCommerce — варианты без родителя исчезнут.
  • Мониторьте логи WP-CLI или логи сайта на предмет ошибок удаления.

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

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

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

  • Перед запуском очистки сделайте резервную копию базы данных.
  • Ограничьте запуск автоматической очистки до одного раза в сутки, чтобы не нагружать сервер.
  • Проверяйте логи ошибок PHP и MySQL после внедрения скрипта.
  • Используйте транзакции или бэкапы, если база большая и операция длительная.

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

МетодПреимуществаНедостаткиПрименимость
WP-CLI скриптБыстрое выполнение, без нагрузки на фронтТребует доступа к серверуДля продвинутых пользователей и администраторов
WP-Cron с PHP кодомАвтоматизация, не требует вмешательстваЗависит от посещаемости сайта, может не сработать вовремяДля сайтов с регулярным трафиком
Ручное удаление через админкуПростота, визуальный контрольТрудозатратно, неудобно при большом количествеДля небольших магазинов
Автоматический импорт постов из внешнего источника в WordPress
07.04.2026
Как создать нестандартные типы постов с аксессуарами в WordPress
28.01.2026
Как создать уникальные слаги для пользовательских типов записей в WordPress
04.03.2026
Как удалить редиректы в WordPress: полное практическое руководство
04.11.2025
Создание динамических ролей пользователей в WordPress
11.04.2026