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

Диагностика проблемы: почему стандартное удаление товаров не всегда эффективно

При удалении товара через админку WooCommerce многие сталкиваются с тем, что данные товара остаются в базе: мета-поля, заказы, отзывы, связанные записи. Это увеличивает размер базы и может замедлять сайт. Особенно остро проблема проявляется при массовом удалении товаров или при необходимости очистить тестовые данные.

Стандартное удаление товара в WooCommerce не удаляет связанные заказы и некоторые пользовательские метаданные. Поэтому важно реализовать удаление всех связей программно.

Пошаговое решение: удаление товара и всех связанных данных через код

1. Использование стандартной функции удаления поста с очисткой мета-данных

WooCommerce товары - это кастомный тип записи product, удалять который нужно через WordPress-функцию wp_delete_post(). Однако она не удалит связанные заказы и отзывы.

function wc_delete_product_full( $product_id ) {
    if ( ! $product_id ) {
        return false;
    }
    // Удаление отзывов к товару
    $comments = get_comments( array(
        'post_id' => $product_id,
        'status' => 'all'
    ) );
    foreach ( $comments as $comment ) {
        wp_delete_comment( $comment->comment_ID, true );
    }
    
    // Удаление мета-данных товара
    $meta_keys = wc_get_product( $product_id )->get_meta_data();
    foreach ( $meta_keys as $meta ) {
        delete_post_meta( $product_id, $meta->key );
    }

    // Удаление связей с заказами
    global $wpdb;
    $wpdb->query( $wpdb->prepare(
        "DELETE FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_id IN (
            SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key = '_product_id' AND meta_value = %d
        )",
        $product_id
    ) );
    $wpdb->query( $wpdb->prepare(
        "DELETE FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key = '_product_id' AND meta_value = %d",
        $product_id
    ) );

    // Удаление самого товара
    wp_delete_post( $product_id, true );
    return true;
}

2. Использование функции для массового удаления товаров

Если нужно удалить несколько товаров за раз, используйте следующий код:

function wc_delete_products_bulk( $product_ids = array() ) {
    if ( empty( $product_ids ) || ! is_array( $product_ids ) ) {
        return false;
    }
    foreach ( $product_ids as $product_id ) {
        wc_delete_product_full( $product_id );
    }
    return true;
}

Проверка результата после внедрения

  • Проверьте в базе данных таблицы wp_posts и wp_postmeta — удалённые товары и связанные метаданные должны отсутствовать.
  • Проверьте таблицы wp_woocommerce_order_items и wp_woocommerce_order_itemmeta — записи с _product_id, соответствующим удалённым товарам, должны быть удалены.
  • В админке WooCommerce убедитесь, что товар не отображается в списках и в отчётах.
  • Проверьте, что отзывы к удалённым товарам отсутствуют в разделе комментариев.

Частые ошибки и как их исправить

  • Ошибка: Товар удаляется, но связанные заказы не очищаются.
    Причина: Неполное удаление записей из woocommerce_order_items и woocommerce_order_itemmeta. Решение — использовать SQL-запросы, как в примере выше.
  • Ошибка: Удаление не происходит из-за прав доступа.
    Причина: Скрипт вызывается без админских прав. Решение — запускать код с правами администратора или через wp-cli.
  • Ошибка: Ошибки в синтаксисе SQL-запросов.
    Причина: Неправильное использование $wpdb->prepare. Проверяйте запросы и используйте плейсхолдеры.
  • Ошибка: Остаточные данные в пользовательских таблицах.
    Причина: Если у вас есть кастомные таблицы, связанные с товарами, их нужно очищать отдельно вручную.

Практические советы по безопасности и производительности

  • Перед массовым удалением товаров всегда делайте резервную копию базы данных.
  • Для больших магазинов удаляйте товары пакетами по 50-100 штук, чтобы избежать перегрузки сервера.
  • Выполняйте тяжелые операции в фоне или через wp-cron с разбивкой по времени.
  • Не запускайте этот код с публичных страниц — только из административной части или консоли.
  • Используйте функции WordPress для удаления, чтобы избежать повреждения данных и сохранить целостность базы.

Сравнение методов удаления товаров в WooCommerce

МетодУдаляет все связиТребует плагиновПроизводительностьГибкость
Стандартное удаление через админкуНетНетВысокаяНизкая
Плагины очистки (например, WP Clean Up)Да, частичноДаСредняяСредняя
Код на PHP с полной очисткой (пример выше)ДаНетВысокая при правильной реализацииВысокая
Диагностика и решение проблем PHP Fatal Error в WordPress
09.01.2026
WooCommerce: автоматическое удаление заказов по статусу и времени через код
19.06.2026
Как автоматически удалять старые чёрные спам-комментарии в WordPress
04.04.2026
Как удалить неиспользуемые таксономии в WordPress
22.02.2026
Как удалить пустые категории в WordPress с помощью кода
27.03.2026