Что такое нерабочие вариации и почему их нужно удалять
В WooCommerce вариации товаров — это отдельные дочерние продукты с уникальными атрибутами, которые позволяют пользователю выбирать разные опции (цвет, размер и т.д.). Иногда вариации становятся «нерабочими»: они могут быть отключены, неактивны или содержать неверные данные, что негативно влияет на пользовательский опыт и производительность сайта.
Удаление таких вариаций помогает:
- Уменьшить нагрузку на базу данных;
- Избавиться от ошибок на страницах товаров;
- Упростить администрирование каталога;
- Повысить скорость загрузки страниц.
Диагностика нерабочих вариаций WooCommerce
Чтобы определить нерабочие вариации, нужно проверить следующие критерии:
- Статус вариации: вариации должны иметь статус
publish. Статусdraftилиtrash— показатель проблемы. - Наличие атрибутов: вариации без атрибутов или с пустыми значениями не могут корректно отображаться.
- Наличие цены: вариация без цены не продается и считается некорректной.
- Наличие товара-родителя: вариация без связанного родительского товара — мусор в базе.
Для диагностики можно использовать SQL-запросы или WP-CLI. Например, чтобы найти вариации без цены:
SELECT p.ID FROM wp_posts p
LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id AND pm.meta_key = '_price'
WHERE p.post_type = 'product_variation' AND (pm.meta_value IS NULL OR pm.meta_value = '');Пошаговое решение: как автоматически удалять нерабочие вариации
Реализуем PHP-функцию, которая:
- Ищет вариации с проблемами (статус, цена, атрибуты);
- Удаляет такие вариации безопасно через WordPress API;
- Запускается вручную или по крону.
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function wpset_delete_invalid_variations() {
$args = [
'post_type' => 'product_variation',
'post_status' => ['publish', 'private'],
'numberposts' => -1,
];
$variations = get_posts($args);
foreach ($variations as $variation) {
$variation_id = $variation->ID;
// Проверяем цену
$price = get_post_meta($variation_id, '_price', true);
if (empty($price)) {
wp_delete_post($variation_id, true);
continue;
}
// Проверяем родителя
$parent_id = wp_get_post_parent_id($variation_id);
if (!$parent_id || get_post_status($parent_id) !== 'publish') {
wp_delete_post($variation_id, true);
continue;
}
// Проверяем атрибуты
$attributes = get_post_meta($variation_id, '_product_attributes', true);
$has_valid_attributes = false;
$variation_data = wc_get_product($variation_id);
if ($variation_data) {
$variation_attributes = $variation_data->get_attributes();
foreach ($variation_attributes as $attr_value) {
if (!empty($attr_value)) {
$has_valid_attributes = true;
break;
}
}
}
if (!$has_valid_attributes) {
wp_delete_post($variation_id, true);
}
}
}
// Для запуска вручную (удалите или закомментируйте после использования)
// add_action('init', 'wpset_delete_invalid_variations');Если нужно автоматизировать, добавьте cron-задачу, вызывающую wpset_delete_invalid_variations раз в сутки.
Как проверить, что удаление сработало
После запуска функции:
- Проверьте количество вариаций в админке WooCommerce — должно уменьшиться;
- Используйте WP-CLI для подсчёта вариаций:
wp post list --post_type=product_variation --format=count; - Проверьте страницы товаров с вариациями — не должно быть пустых вариантов;
- Выполните SQL-запросы диагностики — запросы из раздела диагностики не должны возвращать результатов.
Частые ошибки и как их исправить
- Удаляются нужные вариации: Проверьте логику проверки атрибутов и цены. Возможно, у вариаций цена хранится в другом метаполе или атрибуты заданы нестандартно.
- Функция не запускается: Убедитесь, что хук подключен или функция вызывается вручную.
- Ошибки прав доступа: Запускайте код с правами администратора или через WP-CLI.
- Потеря данных: Для предотвращения — делайте бэкап базы перед массовым удалением.
Практические советы по безопасности и производительности
- Безопасность: Никогда не запускайте массовое удаление без резервной копии;
- Производительность: Если вариаций очень много, разбивайте обработку на партии (например, по 100 штук) с помощью offset в
get_postsили используйте WP_Query с пагинацией; - Логирование: Добавьте запись в лог удалённых вариаций для последующего анализа;
- Использование плагинов: Если нужна расширенная очистка и оптимизация, рассмотрите плагины типа Clearfy Pro для комплексного удаления мусора и оптимизации WooCommerce.
Сравнение способов удаления нерабочих вариаций
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Ручное удаление в админке | Просто, без кода | Долго, неэффективно при большом количестве | Для единичных случаев |
| PHP-скрипт (как в статье) | Автоматизация, можно запускать по расписанию | Требует тестирования и резервного копирования | Оптимально при большом каталоге |
| Плагины (Clearfy и др.) | Доп. функции, удобный интерфейс, безопасность | Платные, могут нагружать сайт | Для комплексной оптимизации WooCommerce |