Диагностика задачи: зачем удалять вариант товара программно
В WooCommerce у вас могут появляться вариативные товары с множеством вариантов (атрибутов). Иногда требуется автоматически удалять определённые варианты, например, если они устарели, неактуальны или не должны отображаться для определённых пользователей или условий. Удаление вручную через админку неудобно при большом количестве товаров или при динамическом изменении ассортимента.
Задача: удалить вариант товара программно при сохранении родительского вариативного товара.
Как определить, что вариант удалён
- Вариант исчезает из списка вариаций в админке.
- Вариант не выводится на странице товара.
- Нет ошибок в логах WordPress.
- Проверка через REST API или SQL — вариант удалён из базы.
Пошаговое решение: удаление варианта товара через хук
1. Используем хук save_post_product
Он срабатывает при сохранении товара (тип записи product или product_variation).
2. Проверяем, что это вариативный товар
Используем функцию wc_get_product() и метод is_type('variable').
3. Получаем все вариации товара
С помощью метода get_children().
4. Удаляем вариант по условию, например, по ID или атрибуту
function wplang_remove_variation_on_save( $post_id, $post, $update ) {
if ( wp_is_post_revision( $post_id ) ) {
return;
}
$product = wc_get_product( $post_id );
if ( ! $product || ! $product->is_type( 'variable' ) ) {
return;
}
// Получаем вариации
$variations = $product->get_children();
foreach ( $variations as $variation_id ) {
$variation = wc_get_product( $variation_id );
if ( ! $variation ) {
continue;
}
// Пример условия: удалить вариант с атрибутом color = red
$attributes = $variation->get_attributes();
if ( isset( $attributes['attribute_pa_color'] ) && $attributes['attribute_pa_color'] === 'red' ) {
// Удаляем вариант
wp_delete_post( $variation_id, true );
}
}
}
add_action( 'save_post_product', 'wplang_remove_variation_on_save', 10, 3 );Проверка результата после внедрения
- Сохраните вариативный товар в админке.
- Проверьте, что вариант с атрибутом
color=redисчез из вариаций. - Обновите страницу товара на фронтенде — вариант не должен отображаться.
- Используйте SQL-запрос:
SELECT * FROM wp_posts WHERE post_parent = <ID вариативного товара> AND post_type = 'product_variation';— проверьте, что варианта нет.
Частые ошибки и как их исправить
- Удаление не происходит: Проверьте, что хук
save_post_productиспользуется с правильными параметрами и что функция вызывается. - Вариант не удаляется из базы: Убедитесь, что используете
wp_delete_post($variation_id, true)с параметромtrueдля полного удаления. - Удаляются не те варианты: Проверьте точность условия по атрибутам (имена атрибутов должны включать префикс
attribute_pa_для глобальных атрибутов). - Ошибка с метаданными: Иногда нужно очистить кэш WooCommerce и перегенерировать транзиенты, чтобы изменения отобразились.
Практические советы по безопасности и производительности
- Добавляйте проверку
current_user_can('edit_product', $post_id), чтобы убедиться, что только администраторы/менеджеры могут триггерить удаление. - Не вызывайте удаление вариантов на каждом обновлении, если условие не изменилось, чтобы избежать лишних операций.
- Кэшируйте результаты
get_children(), если вызываете функцию много раз. - Используйте транзакции базы данных при массовых удалениях для целостности данных.
Сравнение способов удаления вариаций в WooCommerce
| Метод | Код | Плюсы | Минусы |
|---|---|---|---|
| Удаление вручную в админке | – | Просто и понятно | Не подходит для массовых или автоматических задач |
| Удаление через WP-CLI | | Быстро для массовых операций | Требует доступа к серверу |
Удаление через хук save_post_product | | Автоматизация, интеграция с логикой сайта | Нужно учитывать правильные условия и безопасность |