Диагностика проблемы: зачем удалять старый контент в WooCommerce
Интернет-магазины на WooCommerce со временем накапливают большое количество устаревших продуктов, заказов и черновиков, которые не используются. Это приводит к увеличению размера базы данных, замедлению админки и ухудшению производительности сайта. Важно своевременно очищать старый контент, чтобы поддерживать скорость и стабильность работы.
Основные категории, которые часто требуют автоматической очистки:
- Продукты, не продававшиеся или не обновлявшиеся долгое время
- Старые заказы с определённым статусом (например, отменённые, просроченные)
- Черновики и авто-сохранения, которые уже не актуальны
Как определить, какой контент можно удалять автоматически
Перед настройкой автоматического удаления необходимо определить бизнес-логику. Например:
- Продукты, которых не было в заказах последние 6 месяцев
- Заказы со статусом "отменён" старше 3 месяцев
- Черновики старше 30 дней
Для диагностики можно использовать SQL-запросы к базе данных или плагины аналитики, чтобы выявить такие записи.
Пошаговое решение: автоматизация удаления с помощью WP-CLI и пользовательского кода
1. Удаление старых продуктов без продаж
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function wplite_delete_old_unsold_products() {
// Период в днях
$days = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));
// Получаем ID продуктов, не участвовавших в заказах
global $wpdb;
$product_ids = $wpdb->get_col($wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.post_title
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND p.post_date < %s
GROUP BY p.ID
HAVING COUNT(oi.order_item_id) = 0",
$date_threshold
));
if (!empty($product_ids)) {
foreach ($product_ids as $product_id) {
wp_delete_post($product_id, true);
}
}
}Этот код удалит опубликованные продукты, которые не имели заказов за последние 6 месяцев.
2. Удаление старых отменённых заказов
Для удаления заказов со статусом cancelled, старше 90 дней:
function wplite_delete_old_cancelled_orders() {
$days = 90;
$date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled',
'date_query' => array(
array(
'before' => $date_threshold,
'inclusive' => true,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}3. Очистка старых черновиков
Удаляем черновики, созданные более 30 дней назад:
function wplite_delete_old_drafts() {
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));
$args = array(
'post_status' => 'draft',
'post_type' => 'any',
'date_query' => array(
array(
'before' => $date_threshold,
'inclusive' => true,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$drafts = get_posts($args);
foreach ($drafts as $draft_id) {
wp_delete_post($draft_id, true);
}
}4. Планирование автоматизации с помощью cron
Чтобы запускать эти функции автоматически, используйте WP-Cron:
if (!wp_next_scheduled('wplite_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wplite_cleanup_hook');
}
add_action('wplite_cleanup_hook', 'wplite_cleanup_all');
function wplite_cleanup_all() {
wplite_delete_old_unsold_products();
wplite_delete_old_cancelled_orders();
wplite_delete_old_drafts();
}Проверка результата после внедрения
- Зайдите в админку WooCommerce и проверьте количество продуктов и заказов до и после выполнения скриптов.
- Используйте WP-CLI для подсчёта записей:
wp post list --post_type=product --format=countиwp post list --post_type=shop_order --post_status=wc-cancelled --format=count. - Проверьте логи сервера и WP-Cron, чтобы убедиться, что задачи выполняются без ошибок.
Частые ошибки и как исправить
- Удаление нужных продуктов: Неправильно настроенный период времени или условия могут привести к удалению актуальных товаров. Всегда тестируйте на копии сайта.
- Неправильно настроенный WP-Cron: Если WP-Cron не срабатывает, запланированные задачи не будут выполняться. Проверьте, что на хостинге разрешены cron-задачи, используйте системный cron для вызова
wp-cron.php. - Отсутствие резервных копий: Перед массовым удалением обязательно делайте резервные копии базы данных.
- Ошибка в SQL-запросах: Проверьте корректность запросов и используйте
prepareдля безопасности.
Практические советы по безопасности и производительности
- Используйте транзакции или batch-удаления, чтобы не перегружать базу при большом количестве записей.
- Ограничьте количество удаляемых записей за один запуск, например по 100, чтобы избежать таймаутов.
- Проверяйте права пользователя и запускайте удаление от имени администратора.
- Логируйте удалённые ID для возможности аудита.
Сравнение способов автоматического удаления старого контента в WooCommerce
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Код в functions.php + WP-Cron | Гибкость, контроль, без сторонних плагинов | Необходимы навыки программирования, риск ошибок | Для опытных разработчиков, уникальные условия |
| WP-CLI команды | Быстро, удобно для администрирования, подходит для больших сайтов | Требуется доступ к серверу, командная строка | Для серверных администраторов, автоматизация задач |
| Плагины очистки (например WP-Optimize) | Простота использования, готовое решение | Меньше гибкости, возможна нагрузка | Для новичков, небольших магазинов |