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

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

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

Чтобы найти такие товары, можно использовать SQL-запросы и WP-CLI, либо написать PHP-скрипт для проверки и удаления.

Проверка наличия товаров без атрибутов и вариаций

Для начала убедимся, что такие товары действительно есть. Запрос для поиска товаров без атрибутов (custom taxonomy 'pa_*') и вариаций:

SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_term_relationships tr ON p.ID = tr.object_id
LEFT JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy LIKE 'pa_%'
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
GROUP BY p.ID
HAVING COUNT(tr.term_taxonomy_id) = 0;

Этот запрос вернёт ID и название товаров без атрибутов.

Для вариативных товаров проверим, есть ли у них дочерние товары типа 'product_variation':

SELECT parent.ID AS product_id, parent.post_title, COUNT(variation.ID) AS variations_count
FROM wp_posts parent
LEFT JOIN wp_posts variation ON variation.post_parent = parent.ID AND variation.post_type = 'product_variation'
WHERE parent.post_type = 'product'
AND parent.post_status = 'publish'
GROUP BY parent.ID
HAVING variations_count = 0;

Товары с zero вариаций требуют внимания.

Пошаговое решение: автоматизация очистки

1. Создание WP-CLI команды для удаления

WP-CLI — удобный инструмент для автоматизации. Создадим команду, которая удалит товары без атрибутов и вариаций.

if ( defined('WP_CLI') && WP_CLI ) {
    WP_CLI::add_command('wc-cleanup products', function() {
        global $wpdb;

        // Получаем ID товаров без атрибутов
        $products_no_attrs = $wpdb->get_col(
            "SELECT p.ID FROM {$wpdb->posts} p
            LEFT JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
            LEFT JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy LIKE 'pa_%'
            WHERE p.post_type = 'product' AND p.post_status = 'publish'
            GROUP BY p.ID
            HAVING COUNT(tr.term_taxonomy_id) = 0"
        );

        // Получаем ID вариативных товаров без вариаций
        $products_no_variations = $wpdb->get_col(
            "SELECT parent.ID FROM {$wpdb->posts} parent
            LEFT JOIN {$wpdb->posts} variation ON variation.post_parent = parent.ID AND variation.post_type = 'product_variation'
            WHERE parent.post_type = 'product' AND parent.post_status = 'publish'
            GROUP BY parent.ID
            HAVING COUNT(variation.ID) = 0"
        );

        $products_to_delete = array_unique(array_merge($products_no_attrs, $products_no_variations));

        if (empty($products_to_delete)) {
            WP_CLI::success('Нет товаров без атрибутов или вариаций для удаления.');
            return;
        }

        foreach ($products_to_delete as $product_id) {
            wp_delete_post($product_id, true);
            WP_CLI::log("Удалён товар ID {$product_id}");
        }

        WP_CLI::success('Очистка товаров завершена.');
    });
}

2. Запуск команды

В консоли сервера выполните:

wp wc-cleanup products

Команда выведет список удалённых товаров и успешное завершение.

3. Автоматизация с помощью cron

Чтобы регулярно удалять такие товары, можно добавить вызов команды в cron:

0 3 * * * /usr/bin/wp wc-cleanup products --path=/путь/к/wordpress --allow-root

Это выполнит очистку ежедневно в 3 часа ночи.

Проверка результата

  • Повторите SQL-запросы из раздела диагностики — они не должны возвращать товаров без атрибутов и вариаций.
  • Проверьте каталог магазина на наличие пустых или битых товаров.
  • Если использовался WP-CLI скрипт — убедитесь, что при повторном запуске он выводит "Нет товаров... для удаления".

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

  • Ошибка: WP-CLI команда не зарегистрировалась.
    Причина: скрипт добавлен вне плагина или не подключен при запуске.
    Решение: добавьте код в файл плагина или в functions.php темы, убедитесь, что WP_CLI определён.
  • Ошибка: Товары не удаляются.
    Причина: недостаточно прав или wp_delete_post вызывается без второго параметра true.
    Решение: используйте wp_delete_post($id, true) для полного удаления.
  • Ошибка: Удаляются нужные товары.
    Причина: нет точной фильтрации по атрибутам и вариациям.
    Решение: внимательно проверяйте SQL запросы, логируйте ID товаров перед удалением.

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

  • Перед запуском автоматического удаления всегда делайте резервную копию базы данных.
  • Тестируйте скрипты на staging-сайте, чтобы избежать потери данных.
  • Для больших магазинов используйте пагинацию при выборке товаров, чтобы не перегружать сервер.
  • Добавьте логирование удалённых товаров в отдельный файл для аудита.
  • Для повышения производительности очистку запускайте вне пиковых часов.

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

МетодПреимуществаНедостатки
SQL-запрос + ручное удалениеПростота, контроль над выборкой товаровРучная работа, риск ошибок при удалении
WP-CLI команда с автоматическим удалениемАвтоматизация, можно запускать по cron, быстроТребует навыков работы с WP-CLI, риски при ошибках в коде
Плагин очистки (например, Clearfy Pro)Интерфейс, дополнительные функции оптимизацииПотенциально платный, нагрузка на сайт
WooCommerce: автоматическое удаление пустых вариаций и вариантов с нулевым остатком
01.07.2026
Автозаполнение метаданных для постов WordPress: примеры и настройка
06.03.2026
WooCommerce: автоматическая очистка корзины после успешной оплаты
10.05.2026
WooCommerce: автоматическое удаление неактивных товаров по дате последнего изменения
02.06.2026
Как создать динамический блок с Ajax в WordPress
28.11.2025