Проблема: накопление неактивных товаров в каталоге WooCommerce
Многие владельцы интернет-магазинов на WooCommerce сталкиваются с проблемой, когда в базе остаются товары, которые давно не продаются, неактивны или сняты с продажи. Это увеличивает нагрузку на базу данных, ухудшает производительность и затрудняет работу с каталогом. Автоматизация удаления таких товаров поможет поддерживать магазин в актуальном состоянии без ручного контроля.
Диагностика проблемы: как определить неактивные товары
Для начала нужно понять, какие товары считать неактивными. Обычно это:
- товары с статусом
draftилиprivate; - товары, у которых дата последней модификации или публикации была давно (например, более 180 дней назад);
- товары с нулевым количеством продаж и без заказов;
- товары, у которых установлен статус
outofstock.
Проверить товары с такими параметрами можно с помощью SQL-запросов к базе или WP_Query с нужными аргументами.
Пошаговое решение: автоматическое удаление неактивных товаров через WP-Cron
1. Создаем функцию для выборки и удаления неактивных товаров
function wpclass_delete_inactive_products() {
// Параметры для выборки товаров
$args = [
'post_type' => 'product',
'post_status' => ['draft', 'private', 'trash'],
'date_query' => [
[
'column' => 'post_modified_gmt',
'before' => '180 days ago',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
],
],
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $product_id) {
// Удаляем товар без возможности восстановления (force delete)
wp_delete_post($product_id, true);
}
}
}2. Регистрируем событие WP-Cron для запуска функции раз в сутки
add_action('wpclass_daily_cleanup', 'wpclass_delete_inactive_products');
if (!wp_next_scheduled('wpclass_daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpclass_daily_cleanup');
}3. Добавляем код в файл темы functions.php или создаем маленький плагин
Рекомендуется использовать отдельный плагин для удобства контроля и отключения, если потребуется.
Проверка результата
После внедрения кода:
- Подождите выполнение WP-Cron (обычно при посещении сайта);
- Проверьте, что товары с указанными параметрами действительно удалились из каталога и базы данных;
- Для проверки можно временно добавить
error_logили уведомления, например:
function wpclass_delete_inactive_products() {
// ...
if ($query->have_posts()) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true);
error_log('Deleted product ID: ' . $product_id);
}
}
}Логи можно посмотреть в файле debug.log, если включен WP_DEBUG_LOG.
Частые ошибки и как их исправить
- Товары не удаляются: возможно, WP-Cron не срабатывает. Проверьте работу Cron с помощью плагина WP Crontrol или замените вызов на прямой запуск функции для теста.
- Удаляются лишние товары: проверьте правильность условий выборки в
WP_Query, особенно параметрыpost_statusиmeta_query. - Ошибка прав доступа: убедитесь, что пользователь запускающий WP-Cron имеет права на удаление товаров, обычно это администратор сайта.
- Большая нагрузка при удалении: если товаров много, разбейте удаление на части с ограничением
posts_per_pageи используйте повторный запуск Cron.
Практические советы по безопасности и производительности
- Перед автоматическим удалением сделайте резервную копию базы данных.
- Не используйте удаление с параметром
force_delete = true, если хотите возможность восстановления — замените на мягкое удаление. - Оптимизируйте запросы, добавляя индексы в базу, если выборка по мета-полям занимает много времени.
- Для повышения производительности используйте кеширование и разбивайте процесс удаления на несколько шагов.
Альтернативы: код против плагинов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код на PHP (WP-Cron) | Гибкость, нет зависимости от сторонних плагинов, можно кастомизировать под свои условия | Требует навыков разработки, возможны ошибки при некорректном написании |
| Плагины для очистки каталога | Простота использования, готовые интерфейсы и настройки | Могут быть тяжелыми, влиять на производительность, не всегда подходят под узкие задачи |