Диагностика проблемы: когда нужно удалять вариант товара программно
В WooCommerce вариации товара — это отдельные записи типа product_variation. Иногда требуется программно удалять определённые варианты, например, при изменении настроек или бизнес-логики, чтобы избежать ошибок или устаревших данных в каталоге.
Задача: удалить вариант товара при выполнении определённого условия (например, вариация с определённым атрибутом или мета-полем), чтобы не плодить лишние данные и не использовать админку вручную.
Как удалить вариант товара через хук: пошаговое решение
1. Используем хук save_post_product для проверки и удаления
При сохранении родительского товара можно проверить вариации и удалить ненужные. Пример кода:
add_action('save_post_product', 'wplang_remove_product_variation', 20, 3);
function wplang_remove_product_variation($post_id, $post, $update) {
// Проверяем, что это не автосохранение
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
// Получаем все вариации для товара
$args = array(
'post_type' => 'product_variation',
'post_parent' => $post_id,
'numberposts' => -1,
'post_status' => 'any',
);
$variations = get_posts($args);
foreach ($variations as $variation) {
$attr_color = get_post_meta($variation->ID, 'attribute_pa_color', true);
// Удаляем вариацию, если цвет "red"
if ($attr_color === 'red') {
wp_delete_post($variation->ID, true); // true - удаление навсегда
}
}
}2. Альтернативный хук woocommerce_update_product
Можно использовать хук WooCommerce для удаления вариаций после обновления товара через API:
add_action('woocommerce_update_product', 'wplang_remove_variations_on_update');
function wplang_remove_variations_on_update($product_id) {
$product = wc_get_product($product_id);
if (!$product || $product->get_type() !== 'variable') return;
$variations = $product->get_children();
foreach ($variations as $variation_id) {
$variation = wc_get_product($variation_id);
$color = $variation->get_attribute('pa_color');
if ($color === 'red') {
wp_delete_post($variation_id, true);
}
}
}Проверка результата после внедрения
- Откройте родительский товар с вариациями.
- Сохраните товар (обновите его в админке).
- Проверьте, что вариации с атрибутом
pa_color = redудалились (в админке или через SQL запрос:SELECT * FROM wp_posts WHERE post_parent = <ID_товара> AND post_type = 'product_variation';). - Проверьте, что сайт корректно отображает оставшиеся вариации.
Частые ошибки и как их исправить
- Вариации не удаляются: убедитесь, что хук вызывается (добавьте
error_log()илиdie()для теста). Проверьте права пользователя и режим автосохранения. - Удаляются не те варианты: проверьте правильность мета-ключа и значения атрибута. В WooCommerce атрибуты вариаций хранятся в формате
attribute_pa_{slug}. - Удаление вызывает ошибки или потерю данных: используйте
wp_delete_post($id, true)для полного удаления, но убедитесь в резервном копировании БД перед массовым удалением. - Проблемы с кэшированием: очистите кэш WooCommerce и браузера, если изменения не отображаются.
Практические советы по безопасности и производительности
- При удалении вариаций лучше работать в момент сохранения товара, а не при каждом запросе, чтобы снизить нагрузку.
- Добавьте проверку nonce и прав текущего пользователя, если код используется вне админки.
- Резервное копирование базы — обязательный шаг перед массовыми операциями удаления.
- Избегайте длительных циклов с большим количеством вариаций, разбивайте задачи на части или используйте WP-CLI для пакетной обработки.
Сравнение вариантов удаления вариаций
| Метод | Пример использования | Плюсы | Минусы |
|---|---|---|---|
Хук save_post_product | PHP код при сохранении товара | Простота, интеграция с админкой | Срабатывает только при сохранении товара |
Хук woocommerce_update_product | Обновление через API или код | Универсальность, подходит для API | Может не сработать при простом редактировании |
| WP-CLI | Удаление через консоль | Быстро, для массовых операций | Требует SSH доступа |