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

Почему стандартное удаление товара в WooCommerce может быть недостаточным

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

Чтобы полностью удалить товар и все его связи, нужно использовать программный подход с очищением всех данных вручную.

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

  • Проверьте таблицы БД: wp_postmeta на наличие мета-данных удалённого товара (post_id товара).
  • Проверьте таблицу wp_woocommerce_order_items и wp_woocommerce_order_itemmeta на связи с товаром.
  • Проверьте наличие отзывов (comments и commentmeta) с comment_post_ID товара.
  • Проверьте таблицу wp_wc_product_meta_lookup — там дублируются данные товаров для ускорения запросов.

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

Добавьте следующий код в файл functions.php вашей темы или в отдельный кастомный плагин. В коде используется ID товара, который нужно удалить.

function wc_delete_product_completely( $product_id ) {
    if ( ! $product_id || ! get_post( $product_id ) ) {
        return false;
    }

    // Удаляем заказы, связанные с товаром
    global $wpdb;

    // Получаем связанные order item IDs
    $order_item_ids = $wpdb->get_col( $wpdb->prepare(
        "SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_type = 'line_item' AND 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
    ) );

    if ( ! empty( $order_item_ids ) ) {
        foreach ( $order_item_ids as $item_id ) {
            $wpdb->delete( "{$wpdb->prefix}woocommerce_order_itemmeta", [ 'order_item_id' => $item_id ], [ '%d' ] );
            $wpdb->delete( "{$wpdb->prefix}woocommerce_order_items", [ 'order_item_id' => $item_id ], [ '%d' ] );
        }
    }

    // Удаляем отзывы (комментарии) связанные с товаром
    $comments = get_comments( [ 'post_id' => $product_id, 'status' => 'all' ] );
    foreach ( $comments as $comment ) {
        wp_delete_comment( $comment->comment_ID, true );
    }

    // Удаляем мета-данные товара
    delete_post_meta_by_key( '_product_attributes' ); // пример удаления атрибутов, можно адаптировать

    // Удаляем данные из таблицы wc_product_meta_lookup
    $wpdb->delete( "{$wpdb->prefix}wc_product_meta_lookup", [ 'product_id' => $product_id ], [ '%d' ] );

    // Удаляем сам товар
    wp_delete_post( $product_id, true );

    return true;
}

// Использование функции
// Замените 123 на ID нужного товара
wc_delete_product_completely( 123 );

Данный код удаляет товар с ID 123, все связанные с ним заказы (строки товаров в заказах), отзывы к товару, дополнительные метаданные и записи в служебных таблицах WooCommerce. Это гарантирует очистку базы.

Как проверить, что товар и все связи удалены

  • Зайдите в админку WooCommerce и убедитесь, что товара нет.
  • Выполните SQL-запросы вручную или через инструменты разработчика, чтобы проверить отсутствие записей по ID товара в таблицах wp_postmeta, wp_woocommerce_order_items, wp_woocommerce_order_itemmeta, wp_wc_product_meta_lookup и comments.
  • Проверьте отчёты WooCommerce на отсутствие данных о товаре.

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

  • Ошибка: товар не удаляется полностью. Возможно, товар используется в активных заказах. Нужно сначала удалить строки товара в заказах, как показано в коде.
  • Ошибка: wp_delete_post возвращает false. Проверьте, существует ли товар с указанным ID и не удалён ли он ранее.
  • Ошибка: зависимые данные остаются. Проверьте дополнительные пользовательские таблицы или плагины, которые могут хранить данные о товаре.
  • Ошибка: SQL-запросы вызывают ошибки. Убедитесь, что префикс таблиц совпадает с вашим ($wpdb->prefix), и что запросы корректны. Лучше отлаживать на тестовом сайте.

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

  • Перед запуском удаления сделайте резервную копию базы данных.
  • Не запускайте массовое удаление на боевом сайте без тестирования.
  • Обрабатывайте удаление товара через AJAX или WP-CLI для удобства и избежания таймаутов.
  • Для массовых операций используйте пагинацию и пакетную обработку.
  • Не храните избыточные данные в метаполях, чтобы уменьшить нагрузку.

Сравнение способов удаления товаров в WooCommerce

СпособПлюсыМинусыРекомендации
Через админку WooCommerce Просто, не требует кода Не удаляет все связи, данные остаются Использовать для быстрого удаления, но проверять базу
Через SQL-запросы вручную Полный контроль, быстро Риск ошибок, требует знаний SQL Только для опытных, с резервным копированием
Через кастомный PHP-код (как в статье) Автоматизация, удаление всех связей Требует программирования, тестирования Лучший баланс для разработчиков
Как удалить ненужные виджеты в WordPress через функции темы
13.04.2026
WooCommerce: отключаем автообработку заказов и настраиваем ручное управление статусами
25.06.2026
WooCommerce: как массово удалить вариативные товары по атрибуту через код
29.06.2026
Как создать автоматические резервные копии WordPress без плохой нагрузки на сервер
17.03.2026
Как использовать WPRemark для автоматического сбора отзывов в WordPress
18.02.2026