wplang.ru wordpress WP Lang

Как удалить вариант товара в WooCommerce через хук: пошаговое руководство

Диагностика задачи: зачем удалять вариант товара программно

В 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
wp post delete <ID> --force
Быстро для массовых операцийТребует доступа к серверу
Удаление через хук save_post_product
// Пример выше
Автоматизация, интеграция с логикой сайтаНужно учитывать правильные условия и безопасность
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее