Как удалить оставшиеся товары WooCommerce после удаления категории

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

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

Основные причины:

  • Удаление категории происходит вручную через админку, но товары с этой категорией не обновляются автоматически.
  • Товары могут иметь несколько категорий, и удаление одной не затрагивает остальные.
  • В базе остаются товары с пустым значением категорий, что приводит к ошибкам в фильтрации и отображении.

Шаги для удаления товаров, связанных с удалённой категорией

1. Определение ID удалённой категории

Для начала нужно получить ID категории, которую вы удалили или хотите удалить вместе с товарами. Это можно сделать в админке WordPress в разделе "Товары > Категории" наведя курсор на нужную категорию и посмотрев ссылку.

2. Использование WP-CLI для быстрого удаления товаров из категории

Если у вас есть доступ к консоли сервера с WP-CLI, самое быстрое решение — удалить товары, у которых есть удалённая категория.

wp post delete $(wp post list --post_type=product --tax_query='taxonomy=product_cat,field=term_id,terms=ID_категории' --format=ids) --force

Замените ID_категории на нужный числовой идентификатор.

3. PHP-скрипт для удаления товаров по категории

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

function delete_products_by_category_id($category_id) {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'tax_query' => [
            [
                'taxonomy' => 'product_cat',
                'field' => 'term_id',
                'terms' => $category_id,
                'include_children' => false,
            ],
        ],
        'fields' => 'ids',
    ];
    $products = get_posts($args);
    foreach ($products as $product_id) {
        wp_delete_post($product_id, true);
    }
}

// Использование: замените 123 на ID категории
add_action('init', function() {
    if (current_user_can('administrator')) {
        delete_products_by_category_id(123);
    }
});

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

  • Перейдите в админку > Товары и убедитесь, что товары из удалённой категории отсутствуют.
  • Проверьте на фронтенде сайта, что страницы удалённой категории и связанные товары не отображаются.
  • Выполните SQL-запрос для проверки отсутствия товаров с данной категорией (через phpMyAdmin или любой клиент):
SELECT p.ID, p.post_title FROM wp_posts p
JOIN wp_term_relationships tr ON p.ID = tr.object_id
JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
WHERE tt.term_id = 123 AND p.post_type = 'product';
<

Запрос не должен возвращать никаких записей.

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

  • Ошибка: товары не удаляются, потому что удаление происходит без параметра force и посты попадают в корзину.
    Решение: используйте wp_delete_post($product_id, true); или WP-CLI с --force для полного удаления.
  • Ошибка: товары принадлежат нескольким категориям, и удаление одной категории не учитывает это.
    Решение: проверяйте связи с другими категориями и решайте, нужно ли удалять товары целиком или только отвязывать от категории.
  • Ошибка: скрипт запускается на каждом запросе и замедляет работу сайта.
    Решение: добавьте проверку, чтобы скрипт запускался только один раз, например, через transient или по специальному GET-параметру.

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

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

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

МетодПреимуществаНедостаткиКогда использовать
WP-CLIБыстрое, надежное, не нагружает сайтТребует доступа к консоли сервераБольшие магазины, администраторы с доступом к серверу
PHP-код (functions.php или плагин)Работает без доступа к серверуМожет замедлить сайт, риск таймаутаМалые магазины, когда консоль недоступна
Удаление вручную через админкуПросто, без кодаТовары не удаляются автоматически, долгоМалое количество товаров
Как создать динамическую страницу в WordPress с помощью shortcode
19.12.2025
Как удалить или изменить авторские права в метаданных WordPress
08.02.2026
Автоматическое удаление старого контента в WordPress по типу постов и дате
14.03.2026
Как создать собственный shortcode в WordPress с примером кода
10.11.2025
Как сделать отзывную AJAX-форму обработки на WordPress
05.01.2026