Диагностика проблемы удаления товаров в WooCommerce
Часто в интернет-магазинах на WooCommerce возникает необходимость массового удаления товаров по определённым критериям: категория, статус, дата создания, наличие или отсутствие на складе и т.д. При большом количестве товаров ручное удаление через админку занимает много времени и может вызвать ошибки.
Стандартные плагины не всегда подходят, так как часто предлагают только удаление по категориям или нуждаются в дополнительной настройке. Поэтому оптимальным решением будет написать собственный скрипт на PHP, который удалит товары по заданным условиям через WP_Query и функции WooCommerce.
Пошаговое решение: удаляем товары по условию через код
1. Создаём WP_Query для выборки товаров
Для начала нужно сформировать правильный запрос для выборки товаров, например, все товары из категории "распродажа", которые не обновлялись более 6 месяцев.
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'sale',
],
],
'date_query' => [
[
'before' => '6 months ago',
],
],
'fields' => 'ids',
];
$query = new WP_Query($args);
2. Удаляем товары в цикле с помощью wp_delete_post
После получения списка ID товаров, мы можем безопасно удалить каждый продукт с помощью функции wp_delete_post. Если хотите удалить без перемещения в корзину — используйте параметр true.
if ($query->have_posts()) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true — удаление без корзины
}
}
3. Добавляем этот код в безопасное место
Рекомендуется добавить этот код в кастомный плагин или в functions.php активной темы, но запускать только однократно, чтобы не удалить товары повторно.
Для одноразового запуска можно добавить проверку по GET-параметру, например:
if (isset($_GET['delete_sale_products']) && current_user_can('manage_woocommerce')) {
// код удаления
}
Проверка результата удаления товаров
Чтобы убедиться, что товары удалены, выполните следующие шаги:
- Перейдите в WooCommerce > Товары и проверьте, что товары из категории "распродажа" старше 6 месяцев отсутствуют.
- В базе данных в таблице
wp_postsзаписи с типомproductи соответствующими ID должны отсутствовать. - При необходимости используйте WP-CLI команду
wp post list --post_type=product --field=IDдля проверки списка.
Частые ошибки и как их исправить
- Ошибка: Товары не удаляются, хотя код выполняется.
Причина: Пользователь не имеет прав администратора или роль не включаетmanage_woocommerce.
Решение: Проверьте права пользователя и используйтеcurrent_user_can()для ограничения доступа. - Ошибка: Скрипт зависает или превышает время выполнения.
Причина: Большое количество товаров.
Решение: Разбейте удаление на порции, используя параметрposts_per_pageс ограничением и запускайте цикл несколько раз или через WP-Cron. - Ошибка: После удаления товары отображаются в админке.
Причина: Кеширование.
Решение: Очистите кеш сайта и кеш браузера.
Практические советы по безопасности и производительности
- Перед массовым удалением обязательно сделайте бэкап базы данных.
- Используйте
wp_delete_post($id, true)для полного удаления без перемещения в корзину, чтобы не захламлять базу. - Для больших магазинов лучше удалять по частям, чтобы избежать превышения лимита памяти и времени выполнения.
- Добавьте логирование удалённых ID товаров в файл, чтобы при необходимости восстановить или проанализировать действия.
- Используйте
current_user_can('manage_woocommerce'), чтобы ограничить запуск кода только администратору магазина.
Сравнение методов удаления товаров WooCommerce
| Метод | Плюсы | Минусы | Подходит для |
|---|---|---|---|
| Удаление вручную через админку | Просто, без кода | Долго, неудобно при большом количестве | Малые магазины |
| Плагины массового удаления | Удобный интерфейс, настройки | Могут быть платными, не всегда гибкие | Средние магазины |
| Код через WP_Query и wp_delete_post | Максимальная гибкость, автоматизация | Требует знаний PHP, осторожность | Крупные магазины, разработчики |