Как удалить старые вариации товаров в WooCommerce с помощью кода

Диагностика проблемы с вариациями в WooCommerce

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

Чтобы понять, есть ли у вас такие проблемы, выполните следующие действия:

  • Перейдите в админку WordPress → Товары → Вариации (через фильтр по типу продукта).
  • Посмотрите, есть ли товары с большим количеством вариаций, которые уже не продаются или дублируются.
  • Проверьте размер таблиц базы данных wp_posts (где хранятся вариации с типом product_variation).
  • Используйте запрос в базе данных для подсчёта вариаций по товарам:
SELECT post_parent, COUNT(*) as variations_count 
FROM wp_posts 
WHERE post_type = 'product_variation' 
GROUP BY post_parent 
ORDER BY variations_count DESC;

Если количество вариаций слишком большое или есть явно устаревшие, стоит их удалить.

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

WooCommerce хранит вариации как дочерние записи типа product_variation в таблице wp_posts. Для удаления вариаций необходимо:

  1. Определить критерии старых вариаций (например, дата создания старше года, статус "черновик" или кастомное поле).
  2. Написать PHP-скрипт с использованием WP_Query для выборки таких вариаций.
  3. Удалить вариации с помощью wp_delete_post() с параметром true для полного удаления.

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

function delete_old_product_variations() {
    $date_threshold = date('Y-m-d H:i:s', strtotime('-1 year'));

    $args = array(
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'date_query'     => array(
            array(
                'before' => $date_threshold,
            ),
        ),
        'fields'         => 'ids',
        'post_status'    => 'any',
    );

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $variation_id) {
            wp_delete_post($variation_id, true);
        }
        echo count($query->posts) . ' старых вариаций удалено.';
    } else {
        echo 'Старые вариации не найдены.';
    }
}
// Для запуска функции добавьте вызов ниже или интегрируйте в админку
// delete_old_product_variations();

Удаление вариаций по статусу "черновик"

Иногда в WooCommerce остаются вариации с нестандартным статусом, например "draft", которые можно удалить так:

function delete_draft_variations() {
    $args = array(
        'post_type'      => 'product_variation',
        'post_status'    => 'draft',
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $query = new WP_Query($args);

    foreach ($query->posts as $variation_id) {
        wp_delete_post($variation_id, true);
    }
    echo count($query->posts) . ' вариаций в статусе draft удалено.';
}
// delete_draft_variations();

Как проверить, что удаление сработало

После запуска скрипта выполните следующие проверки:

  • Проверьте, что количество вариаций действительно уменьшилось. Через SQL-запрос:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation';
  • Зайдите в админку WooCommerce и убедитесь, что в товарах нет старых вариаций.
  • Проверьте логи ошибок и убедитесь, что нет предупреждений о попытке удаления уже удалённых записей.
  • Убедитесь, что сайт работает корректно, а вариации, которые нужны, остались.

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

  • Ошибка: Удаляются нужные вариации.
    Причина: Неправильно выбран критерий (например, слишком большой период времени или неучтённый статус).
    Решение: Тщательно фильтруйте по дате, статусу и родителю (товару).
  • Ошибка: Скрипт не удаляет вариации.
    Причина: Неправильные параметры WP_Query или отсутствие прав на удаление.
    Решение: Проверьте права пользователя, используйте 'post_status' => 'any', убедитесь, что WP_Query возвращает результаты.
  • Ошибка: Зависания или таймауты при удалении большого количества вариаций.
    Решение: Делайте удаление по частям с помощью пагинации или WP-CLI.

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

  • Перед удалением сделайте резервную копию базы данных.
  • Используйте wp_delete_post($id, true) для полного удаления вариаций без помещения в корзину.
  • Для больших сайтов удаляйте вариации пакетами (например, по 100 штук) с паузами.
  • После удаления выполните оптимизацию базы данных, например, с помощью плагина Clearfy Pro (ссылка).
  • Проверяйте наличие связанных мета-данных и таксономий, которые могут остаться после удаления вариаций.

Сравнение способов удаления вариаций в WooCommerce

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПросто, визуально понятноТрудоёмко при большом количестве вариацийНебольшие каталоги, единичные случаи
PHP-скрипт с WP_QueryАвтоматизация, гибкость фильтровТребуется базовое программированиеСредние и крупные сайты, регулярное обслуживание
WP-CLI командыБыстро, подходит для больших объёмовНужен доступ к серверу, знания командной строкиКрупные проекты, опытные администраторы
WooCommerce: автоматическое отключение способов оплаты при проблемах с интернет-соединением
30.05.2026
WooCommerce: автоматическое отключение способов оплаты при проблемах с интернет-соединением
03.06.2026
Как создать настройку в личном кабинете WordPress для пользователей
10.12.2025
Как отключить автоматические обновления в WordPress
30.01.2026
Как использовать REST API в WordPress для создания уникальных функций
16.11.2025