wplang.ru wordpress WP Lang

WooCommerce: как удалить вариант товара через хук

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

В 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_productPHP код при сохранении товараПростота, интеграция с админкойСрабатывает только при сохранении товара
Хук woocommerce_update_productОбновление через API или кодУниверсальность, подходит для APIМожет не сработать при простом редактировании
WP-CLIУдаление через консольБыстро, для массовых операцийТребует SSH доступа
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙