Диагностика проблемы: зачем удалять неактивные товары в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются товары с неактивным статусом (например, "Черновик" или "Отключен"), которые не отображаются покупателям, но занимают место в базе данных и замедляют работу сайта. Автоматическое удаление таких товаров поможет поддерживать чистоту каталога и оптимизировать производительность.
Как проверить наличие неактивных товаров
Для начала нужно убедиться, что в базе есть товары, которые имеют статус, отличный от "publish". Для этого можно использовать следующий SQL-запрос (через phpMyAdmin или WP-CLI):
SELECT ID, post_title, post_status FROM wp_posts WHERE post_type = 'product' AND post_status != 'publish';Если запрос вернул записи, значит такие товары есть, и их можно безопасно удалять или архивировать.
Пошаговое решение: автоматическое удаление товаров с заданным статусом
1. Добавляем функцию удаления в functions.php или в кастомный плагин
Ниже пример кода, который удаляет товары со статусом "draft" старше 30 дней. Код запускается по крону ежедневно.
function wpelement_delete_old_draft_products() {
$args = [
'post_type' => 'product',
'post_status' => 'draft',
'date_query' => [
[
'column' => 'post_date',
'before' => '30 days ago',
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$draft_products = get_posts($args);
if (!empty($draft_products)) {
foreach ($draft_products as $product_id) {
wp_delete_post($product_id, true); // true — удалить без перемещения в корзину
}
}
}
// Регистрируем ежедневное событие в WP-Cron
if (!wp_next_scheduled('wpelement_daily_delete_draft_products')) {
wp_schedule_event(time(), 'daily', 'wpelement_daily_delete_draft_products');
}
add_action('wpelement_daily_delete_draft_products', 'wpelement_delete_old_draft_products');2. Как настроить удаление по другим статусам и условиям
Если нужно удалять товары в статусах "pending", "private" или кастомных, просто замените параметр post_status на массив с нужными статусами:
'post_status' => ['draft', 'pending', 'private'],Также можно изменить условие по дате или добавить фильтры по категориям или метаполям.
Проверка результата после внедрения
После добавления кода и ожидания запуска cron (можно запустить вручную через WP-CLI или плагин для управления cron):
- Снова выполните SQL-запрос из раздела диагностики — товары со статусом "draft" старше 30 дней должны отсутствовать.
- Проверьте в админке WooCommerce — список товаров должен обновиться.
- Убедитесь, что на сайте не исчезли активные товары.
Частые ошибки и как их исправить
- Крон не запускается: Проверьте, работает ли WP-Cron, нет ли блокировок на сервере. Можно использовать плагин "WP Crontrol" для диагностики и ручного запуска.
- Удаляются не те товары: Проверьте правильность параметров в запросе
get_posts, особенноpost_statusиdate_query. - Удаление не происходит: Возможно, функция
wp_delete_postне вызывается или есть ошибки PHP — проверьте логи ошибок и включите WP_DEBUG.
Практические советы по безопасности и производительности
- Удаляйте только товары с неактивным статусом и с достаточным запасом по дате (например, старше 30 дней) чтобы избежать случайного удаления новых товаров.
- Всегда делайте резервные копии базы перед внедрением автоматических удалений.
- При большом количестве товаров разбивайте удаление на части, чтобы избежать превышения лимитов памяти и времени выполнения:
foreach (array_chunk($draft_products, 50) as $chunk) {
foreach ($chunk as $product_id) {
wp_delete_post($product_id, true);
}
sleep(1); // пауза, чтобы снизить нагрузку
}- Для мониторинга работы можно добавить логирование удаленных товаров в отдельный файл или таблицу.
Сравнение способов удаления неактивных товаров в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто и безопасно для небольших магазинов | Неэффективно при большом количестве товаров |
| Использование плагинов (например, WP Bulk Delete) | Удобный интерфейс, гибкие фильтры | Дополнительная нагрузка, может конфликтовать с другими плагинами |
| Автоматизация через WP-Cron и кастомный код | Полный контроль, можно интегрировать с другими процессами | Требует навыков разработки, риски при ошибках кода |