Что такое пустые вариации товаров и почему их нужно удалять
В WooCommerce вариации товаров — это отдельные записи с собственными атрибутами, ценами и запасами. Иногда в базе накапливаются пустые вариации без цены, без артикулов или с нулевым запасом, которые не нужны и мешают работе магазина: они замедляют запросы, создают путаницу в админке и влияют на SEO.
Автоматическое удаление таких вариаций поможет поддерживать базу в порядке без лишних затрат времени.
Диагностика проблемы: как определить пустые вариации
Для начала нужно понять, какие вариации считаются пустыми. Обычно критерии такие:
- Цена вариации не задана или равна 0
- Артикул (SKU) отсутствует
- Статус вариации — черновик или скрыт
- Отсутствует физический запас товара (stock = 0 и управление запасами включено)
В админке WooCommerce можно фильтровать вариации по статусу, но для комплексной проверки нужна кастомная выборка.
Шаги решения: скрипт для автоматического удаления пустых вариаций
Реализуем функцию, которая будет запускаться через WP-Cron или вручную и удалять вариации по заданным критериям.
1. Создаем функцию для поиска и удаления
function wptest_delete_empty_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'post_status' => ['publish', 'private', 'draft'],
];
$variations = get_posts($args);
$deleted = 0;
foreach ($variations as $variation) {
$variation_id = $variation->ID;
$price = get_post_meta($variation_id, '_price', true);
$sku = get_post_meta($variation_id, '_sku', true);
$stock_qty = get_post_meta($variation_id, '_stock', true);
$manage_stock = get_post_meta($variation_id, '_manage_stock', true);
// Критерии удаления
if ((empty($price) || $price == 0) && empty($sku)) {
wp_delete_post($variation_id, true);
$deleted++;
continue;
}
// Если управление запасами включено и запас равен 0
if ($manage_stock === 'yes' && intval($stock_qty) <= 0) {
wp_delete_post($variation_id, true);
$deleted++;
}
}
return $deleted;
}2. Запуск функции вручную или по расписанию
Для теста можно вызвать функцию в файле functions.php или через админ-панель, например, с помощью админ-страницы или плагина для запуска PHP кода.
add_action('admin_init', function() {
if (isset($_GET['wptest_delete_variations'])) {
$count = wptest_delete_empty_variations();
echo "Удалено пустых вариаций: " . $count;
exit;
}
});Для автоматизации стоит добавить WP-Cron задачу:
if (!wp_next_scheduled('wptest_cron_delete_empty_variations')) {
wp_schedule_event(time(), 'daily', 'wptest_cron_delete_empty_variations');
}
add_action('wptest_cron_delete_empty_variations', 'wptest_delete_empty_variations');Проверка результата после внедрения
- Перейдите в WooCommerce → Товары → Вариации и убедитесь, что пустых вариаций больше нет.
- Выполните SQL-запрос для проверки количества вариаций с пустой ценой:
SELECT COUNT(*) FROM wp_posts p 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 = '' OR pm.meta_value = '0'); - Проверьте логи ошибок и подтверждение удаления (если реализовано логирование).
Частые ошибки и как их исправить
- Неправильный пост-тип или статус: убедитесь, что ищете именно
product_variationс нужными статусами (publish,private,draft). - Удаление вариаций, которые используются: проверьте, что вариация не связана с активными товарами, иначе удаление приведет к ошибкам на фронтенде.
- Отсутствие прав на удаление: функция должна запускаться с правами администратора или через WP-Cron.
- WP-Cron не работает: проверьте, что на сервере включен WP-Cron и нет блокировок.
Практические советы по безопасности и производительности
- Перед массовым удалением всегда создавайте резервную копию базы данных.
- Используйте
wp_delete_post($id, true), чтобы полностью удалить вариацию, включая метаданные. - Для больших магазинов ограничьте количество удаляемых вариаций за один запуск, чтобы избежать таймаутов:
function wptest_delete_empty_variations_chunked($limit = 50) {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => $limit,
'post_status' => ['publish', 'private', 'draft'],
];
// ... остальной код как в основной функции
}- Регулярно очищайте базу данных с помощью плагинов вроде Clearfy Pro для удаления мусорных данных.
- Логируйте удаление, чтобы отслеживать процесс и ошибки.