WooCommerce: как удалить заблокированные товары без риска

Что такое заблокированные товары в WooCommerce и почему их нужно удалять

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

Диагностика: как определить заблокированные товары

Для начала нужно понять, какие товары считаются заблокированными на вашем сайте. Обычно это:

  • Товары с мета-ключом _stock_status со значением outofstock и нулевым остатком.
  • Товары с установленным статусом draft или pending, которые не публикуются.
  • Товары, у которых есть ошибки в метаданных или отсутствуют обязательные атрибуты.

Чтобы проверить, какие товары попадают под эти условия, используйте следующий SQL-запрос на базе данных WordPress:

SELECT ID, post_title, post_status FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product'
AND ((pm.meta_key = '_stock_status' AND pm.meta_value = 'outofstock')
OR p.post_status IN ('draft', 'pending'));

В результате получите список товаров, которые потенциально можно считать заблокированными.

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

Удаление товаров напрямую из базы данных опасно и может привести к потере данных о заказах и связях. Используйте WordPress API для удаления, чтобы все связанные метаданные и связи корректно очищались.

1. Создаем резервную копию

Перед любыми изменениями обязательно создайте полную резервную копию базы данных и файлов сайта.

2. Используем WP-CLI для поиска и удаления

WP-CLI позволяет быстро работать с большим числом товаров.

# Получаем ID заблокированных товаров
wp post list --post_type=product --field=ID --meta_key=_stock_status --meta_value=outofstock --post_status=publish > outofstock-products.txt

# Просматриваем список, проверяем вручную
cat outofstock-products.txt

# Удаляем товары (только после проверки!)
cat outofstock-products.txt | xargs -I % wp post delete % --force

# Аналогично можно удалить товары со статусом draft/pending
wp post delete $(wp post list --post_type=product --post_status=draft,pending --field=ID) --force

3. Используем PHP-скрипт для удаления с проверками

Если WP-CLI недоступен, можно использовать такой скрипт, например, в файле remove-blocked-products.php в корне темы или отдельном плагине:

<?php
function remove_blocked_products() {
  $args = [
    'post_type' => 'product',
    'posts_per_page' => -1,
    'post_status' => ['publish', 'draft', 'pending'],
    'meta_query' => [[
      'key' => '_stock_status',
      'value' => 'outofstock'
    ]]
  ];

  $query = new WP_Query($args);
  if ($query->have_posts()) {
    while ($query->have_posts()) {
      $query->the_post();
      $product_id = get_the_ID();
      // Проверка на наличие заказов с этим товаром
      $orders = wc_get_orders(['limit' => 1, 'status' => 'any', 'product_id' => $product_id]);
      if (empty($orders)) {
        wp_delete_post($product_id, true); // Удаляем навсегда
      } else {
        error_log("Товар $product_id не удален — есть заказы");
      }
    }
    wp_reset_postdata();
  }
}
remove_blocked_products();
?>

Этот код сначала проверит, есть ли связанные с товаром заказы. Если есть — товар не удалит.

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

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

  • В админке WooCommerce отсутствуют удалённые товары.
  • В базе данных отсутствуют записи в таблицах wp_posts и wp_postmeta для удалённых товаров.
  • Заказы с удалёнными товарами корректно отображаются (товары в них не должны исчезать полностью, WooCommerce хранит данные заказа отдельно).
  • Ошибки в логах отсутствуют.

Для проверки базы можно выполнить SQL:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product' AND ID IN (список_удалённых_ID);

Если вернёт 0 — удаление прошло успешно.

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

  • Удаление товаров без проверки заказов. В результате потеря данных о прошлых продажах. Решение: всегда проверяйте наличие связей с заказами перед удалением.
  • Удаление через SQL без очистки метаданных. Может привести к «мусору» в базе, конфликтам и ошибкам при обновлениях. Используйте WP API или WP-CLI.
  • Работа без резервной копии. Любая ошибка может привести к потере данных, восстановить которые будет сложно.
  • Удаление товаров, которые используются в кэшах или сторонних плагинах. После удаления очищайте кэш и проверьте интеграции.

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

  • Для массовых операций используйте WP-CLI — это быстрее и снижает нагрузку на сервер.
  • Оптимизируйте базу данных после удаления (например, с помощью плагина Clearfy Pro https://wpshop.ru/plugins/clearfy?utm_source=wpsell.ru&utm_medium=article&utm_campaign=woocommerce-kak-udalit-zablokirovannye-tovary-bez-riska), чтобы убрать оставшиеся мусорные записи.
  • Не удаляйте товары прямо на рабочем сайте — сначала попробуйте на копии или staging-сервере.
  • Регулярно мониторьте состояние товаров и складских остатков, чтобы заблокированные товары не накапливались.

Сравнение способов удаления заблокированных товаров

МетодПлюсыМинусы
Удаление через WP-CLIБыстро, безопасно, очищает все связиТребует доступа к командной строке
Удаление через PHP-скрипт с WP APIКонтроль логики, проверка заказовМедленнее, требует программирования
Удаление напрямую через SQLБыстроРиск повреждения базы, оставляет мусор
Как настроить автоматический экспорт товаров WooCommerce в CSV
14.02.2026
Автоматическое создание отчетов по продажам WooCommerce с примерами кода
18.02.2026
WooCommerce: как исключить товары из корзины по атрибутам
28.07.2026
Как добавить вывод стоимости отсутствующих товаров в корзине WooCommerce
25.05.2026
Как создать автоматический импорт изображений в WordPress
16.04.2026

Совсем скоро здесь заработает сайт о вордпресс. И будет он связан с продажами, магазинами или чем-то таким.