wpcat.ru wordpress WPCat.ru

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

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

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

Как обнаружить пустые варианты в админке WooCommerce

  • Перейдите в «Товары» → «Вариации» (если есть отдельный фильтр по типу варианта) или откройте нужный товар с вариациями;
  • Обратите внимание на вариации без цены, без атрибутов или со статусом «Черновик»;
  • Если вариантов слишком много, используйте фильтры или экспорт CSV для анализа.

Диагностика через базу данных

Варианты товаров — это записи с типом post_type = 'product_variation' в таблице wp_posts. Чтобы найти пустые варианты, можно выполнить SQL-запрос:

SELECT p.ID, p.post_title, pm.meta_key, pm.meta_value FROM wp_posts p LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'product_variation' AND (pm.meta_key = '_price' AND (pm.meta_value IS NULL OR pm.meta_value = ''));

Этот запрос покажет варианты без установленной цены. Аналогично можно проверить атрибуты и наличие.

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

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

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

function delete_empty_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_price',
                'value'   => '',
                'compare' => '='
            ]
        ]
    ];

    $variations = get_posts($args);
    $deleted_count = 0;

    foreach ($variations as $variation) {
        wp_delete_post($variation->ID, true); // принудительное удаление
        $deleted_count++;
    }

    return $deleted_count;
}

// Вызов функции (например, в admin_init, но желательно после резервного копирования)
add_action('admin_init', function() {
    if (current_user_can('manage_woocommerce') && isset($_GET['delete_empty_variations'])) {
        $count = delete_empty_variations();
        wp_die("Удалено пустых вариантов: " . $count . ". <a href=\"admin.php?page=wc-settings\">Вернуться</a>");
    }
});

После добавления кода в functions.php перейдите по URL https://example.com/wp-admin/admin.php?delete_empty_variations=1 (замените example.com на ваш домен). Скрипт удалит все варианты без цены.

Расширение: удаление вариантов без цены и без атрибутов

function delete_empty_variations_extended() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
    ];

    $variations = get_posts($args);
    $deleted_count = 0;

    foreach ($variations as $variation) {
        $price = get_post_meta($variation->ID, '_price', true);
        $attributes = get_post_meta($variation->ID, '_variation_attributes', true);

        if (empty($price) || empty($attributes)) {
            wp_delete_post($variation->ID, true);
            $deleted_count++;
        }
    }

    return $deleted_count;
}

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

  • Перейдите в админку WooCommerce → Товары и откройте любой товар с вариациями;
  • Проверьте, что пустые варианты исчезли;
  • Запустите SQL-запрос из раздела диагностики повторно — пустых вариантов с пустой ценой больше не будет;
  • Проверьте работу фронтенда: вариации отображаются корректно, нет пустых опций.

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

  • Ничего не удаляется: возможно, критерии поиска пустых вариантов заданы неправильно (например, цена задана, но атрибуты пустые). Проверьте, что именно считать «пустыми» вариантами.
  • Удалились нужные варианты: перед удалением сделайте бэкап базы. Можно добавить дополнительную проверку на мета-данные или дату создания.
  • Функция не срабатывает при вызове по URL: убедитесь, что у пользователя есть права manage_woocommerce, и параметры GET передаются корректно.
  • Появились ошибки при удалении: проверьте, нет ли конфликтов с другими плагинами, которые блокируют удаление записей.

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

  • Всегда делайте полную резервную копию базы данных перед массовыми удалениями.
  • Запускайте удаление вне пиковых часов — если вариантов очень много, можно реализовать пакетную обработку с лимитом на количество удалений за один запрос.
  • Чтобы избежать появления пустых вариантов в будущем, контролируйте импорт и редактирование товаров, используйте валидацию.
  • Для регулярной чистки можно настроить Cron-задачу с вызовом функции удаления.

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

СпособПлюсыМинусыПример
Ручное удаление в админкеПросто, не требует кодаМного времени при большом количествеУдаление вариаций по одной
SQL-запросы в базеБыстро и массовоРиск ошибочных удалений, требует опытаDELETE из wp_posts по условиям
PHP код с wp_delete_postБезопаснее, можно кастомизироватьНужно писать и тестировать кодФункция delete_empty_variations()
Плагины очистки WooCommerceАвтоматизация, интерфейсЗависимости и нагрузкаClearfy Pro (https://wpshop.ru/plugins/clearfy?source=wpcat.ru&medium=article&campaign=woocommerce-samostoyatelno-udalit-pustye-varianti-tovarov)
×
-15%
на премиум плагин
My Popup

Повысьте конверсию!

Получить скидку »