Как удалить заблокированные или неактивные товары WooCommerce с помощью кода

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

В WooCommerce нередко возникают ситуации, когда товары остаются в статусе «заблокирован» (например, сняты с публикации) или «неактивны» (черновики, запланированные), что мешает корректной работе магазина и усложняет управление каталогом. Такие товары могут засорять базу данных, влиять на производительность и вызывать путаницу в админке.

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

  • Ошибки импорта или автоматической синхронизации товаров из внешних источников;
  • Остатки от удалённых или неактуальных продуктов;
  • Ручное создание товаров, которые позже не были активированы или удалены;
  • Конфликты с плагинами, блокирующими публикацию товаров.

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

Для массового удаления товаров с конкретным статусом в WooCommerce удобно использовать WP-CLI или PHP-скрипты. Рассмотрим способ через PHP-код, который можно добавить в файл functions.php вашей темы или в отдельный кастомный плагин.

1. Определяем статусы товаров для удаления

В WooCommerce для товаров используются следующие статусы постов:

  • publish — опубликованные товары;
  • draft — черновики;
  • pending — ожидающие обзора;
  • private — приватные товары;
  • trash — удалённые (в корзине);
  • и другие кастомные статусы, которые могут быть у вас в магазине.

Для удаления заблокированных и неактивных товаров, обычно, нужно удалить товары со статусом draft и/или pending.

2. Код для удаления товаров по статусу

function wpnews_delete_woocommerce_products_by_status( $status = 'draft' ) {
    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        return 'Нет прав для выполнения операции';
    }

    $args = array(
        'post_type'      => 'product',
        'post_status'    => $status,
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $query = new WP_Query( $args );
    if ( empty( $query->posts ) ) {
        return 'Товары со статусом "' . $status . '" не найдены';
    }

    foreach ( $query->posts as $product_id ) {
        wp_delete_post( $product_id, true ); // true — удаление без корзины
    }

    return 'Удалено товаров: ' . count( $query->posts );
}

// Пример вызова:
echo wpnews_delete_woocommerce_products_by_status( 'draft' );

Этот код удалит все товары со статусом draft. Аналогично можно вызвать функцию с pending или любым другим статусом.

3. Безопасное выполнение

Рекомендуется запускать удаление один раз, например, через ajax в админке или временно вставить вызов в functions.php, а после выполнения удалить вызов, чтобы не удалять товары повторно.

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

Чтобы убедиться, что удаление сработало:

  • Перейдите в WooCommerce > Товары и отфильтруйте по статусам draft или pending. Если товаров нет — удаление прошло успешно.
  • Проверьте таблицу wp_posts в базе данных, выбрав post_type = 'product' и post_status указанных статусов; там не должно остаться записей.
  • Также проверьте, что на фронтенде магазина не отображаются удалённые товары.

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

  • Удаление не происходит: Проверьте права пользователя, от имени которого выполняется код. Функция current_user_can('manage_woocommerce') должна возвращать true.
  • Остались товары в других статусах: Убедитесь, что вызываете функцию с правильным статусом (например, pending, private).
  • Удаление только в корзину, а не полное: В wp_delete_post второй параметр должен быть true для полного удаления без корзины.
  • Код вызывает ошибки: Проверьте, что код запускается в контексте WordPress (например, не напрямую через браузер без загрузки WP).

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

  • Перед массовым удалением сделайте полное резервное копирование базы данных.
  • Удаляйте товары пакетами, если их очень много, чтобы избежать превышения лимитов памяти или времени выполнения.
  • Используйте WP-CLI для удаления, если доступен, это быстрее и безопаснее для больших баз.
  • Для регулярной очистки можно настроить WP-Cron с подобным кодом, но с ограничением по количеству товаров за раз.

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

МетодПлюсыМинусыПример
PHP-скрипт в functions.phpПрост в реализации, гибкийРиск забыть удалить код, нагрузка на сайтКод из статьи
WP-CLIБыстро, без нагрузки на сайтТребуется SSH-доступwp post delete $(wp post list --post_type=product --post_status=draft --field=ID) --force
Плагины очистки базыУдобство интерфейсаМогут не учитывать кастомные статусыWP Sweep, Advanced Database Cleaner
Как использовать WP-CLI для управления плагинами в WordPress
17.04.2026
Как избежать проблем с AJAX в WordPress при загрузке файлов
23.02.2026
Как использовать REST API для автоматизации управления заказами в WooCommerce
27.04.2026
Как отключить AJAX в корзине WooCommerce и почему это может понадобиться
14.12.2025
Как автоматически удалять старые новости в WordPress
11.04.2026