Диагностика проблемы: зачем удалять вариации товаров программно
В WooCommerce вариации (варианты) товаров создаются как дочерние записи типа product_variation, связанных с родительским товаром типа variable. Иногда возникает необходимость массово удалить вариации, например, при смене структуры каталога, очищении «мусорных» вариантов, исправлении ошибок импорта или для оптимизации базы данных. Удаление вручную через админку неудобно и долго, особенно при большом количестве вариаций.
Простой способ — написать PHP-скрипт, который удалит вариации программно, с контролем и возможностью фильтрации.
Как найти ID вариаций и проверить их количество
Перед удалением нужно убедиться, что мы правильно определяем вариации для удаления.
global $wpdb;
$product_id = 123; // ID вариативного товара
$variations = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_parent = %d AND post_type = 'product_variation' AND post_status != 'trash'",
$product_id
));
echo 'Найдено вариаций: ' . count($variations);
print_r($variations);Этот код выводит ID всех вариаций для товара с ID 123. Можно запускать в файле темы, плагине для отладки или через WP-CLI.
Пошаговое решение: удаление вариаций через WP-функции
Удалять нужно через функцию wp_delete_post() с параметром $force_delete = true, чтобы удалить пост без перемещения в корзину.
function wc_delete_product_variations( $product_id ) {
$variations = get_children([
'post_parent' => $product_id,
'post_type' => 'product_variation',
'post_status' => ['publish', 'private', 'pending', 'draft']
]);
if ( empty($variations) ) {
return 'Вариаций не найдено';
}
foreach ( $variations as $variation ) {
wp_delete_post( $variation->ID, true );
}
return 'Удалено вариаций: ' . count($variations);
}
// Пример вызова
echo wc_delete_product_variations(123);Код можно поместить в файл functions.php темы для однократного запуска, либо в кастомный плагин.
Удаление вариаций по условию
Если нужно удалить вариации с определённым атрибутом, можно добавить фильтрацию:
function wc_delete_variations_by_attribute( $product_id, $attribute_slug, $attribute_value ) {
$variations = get_children([
'post_parent' => $product_id,
'post_type' => 'product_variation',
'post_status' => ['publish', 'private']
]);
$deleted_count = 0;
foreach ( $variations as $variation ) {
$variation_id = $variation->ID;
$terms = wp_get_post_terms( $variation_id, 'pa_' . $attribute_slug );
foreach ( $terms as $term ) {
if ( $term->slug === $attribute_value ) {
wp_delete_post( $variation_id, true );
$deleted_count++;
break;
}
}
}
return 'Удалено вариаций с атрибутом ' . $attribute_value . ': ' . $deleted_count;
}
// Пример: удалить все вариации с цветом red
echo wc_delete_variations_by_attribute( 123, 'color', 'red' );Как проверить результат после удаления
- Перейдите в админку WooCommerce, откройте товар 123. Вкладка вариаций должна быть пустой.
- Повторно выполните код для подсчёта вариаций — должен вернуть 0.
- Через базу данных проверьте, что для
post_parent = 123нет записей с типомproduct_variation.
Частые ошибки и как их исправить
- Вариации не удаляются: проверьте, что используете
wp_delete_post($id, true)с параметромtrue. Без него пост попадёт в корзину, и может казаться, что удаление не произошло. - Удаляются не те вариации: убедитесь, что правильно указали
post_parentи фильтры по атрибутам. - Ошибка при попытке получить вариации: возможно, в базе нестандартные статусы или типы постов. Используйте расширенный запрос с перечислением статусов.
- Проблемы с правами пользователя: код должен запускаться с правами администратора или через WP-CLI, иначе удаление заблокируется.
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Для удаления вариаций большого количества товаров используйте WP-CLI, чтобы избежать тайм-аутов PHP.
- Проверяйте нагрузку на сервер при массовых операциях, лучше делать пакетами по 50-100 вариаций.
- Добавляйте проверку nonce и прав пользователя, если делаете интерфейс удаления в админке.
- Если часто требуется подобная очистка, рассмотрите создание собственного плагина с журналированием удалений.
Сравнение способов удаления вариаций WooCommerce
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Удаление вручную через админку | Простота, визуальный контроль | Долго при большом количестве, нет автоматизации | WooCommerce > Товары > Вариации |
| SQL-запросы напрямую в базе | Скорость, можно массово | Риск повреждения данных, нет очистки связанных метаданных | DELETE FROM wp_posts WHERE post_type = 'product_variation' AND post_parent = 123; |
| PHP-код с wp_delete_post() | Безопасно, корректно удаляет все связи | Медленнее, требует программирования | Пример из статьи |