Диагностика проблемы: почему нужно удалять старый контент в WooCommerce
На крупных интернет-магазинах на WooCommerce со временем накапливается большое количество устаревших товаров, заказов и черновиков. Это негативно сказывается на производительности сайта, замедляет административную панель и увеличивает размер базы данных. Автоматическое удаление такого контента позволяет поддерживать магазин в актуальном состоянии и оптимизировать работу сервера.
Определение устаревшего контента
Чаще всего под старым контентом понимают:
- Продукты, неактивные более 6 месяцев;
- Черновики и авто-сохранения товаров старше 30 дней;
- Заказы со статусом «Отменен» или «Возврат» старше 1 года.
Важно правильно определить критерии, чтобы не удалить нужные данные.
Пошаговое решение: создание скрипта для автоматического удаления
1. Удаление старых продуктов
Для удаления продуктов, которые не обновлялись более 180 дней и находятся в статусе «черновик» или «приватный», можно использовать WP_Query и функцию wp_delete_post.
function delete_old_products() {
$args = [
'post_type' => 'product',
'post_status' => ['draft', 'private'],
'date_query' => [
[
'column' => 'post_modified_gmt',
'before' => '180 days ago',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$old_products = get_posts($args);
foreach ($old_products as $product_id) {
wp_delete_post($product_id, true); // true — принудительное удаление без перемещения в корзину
}
}
add_action('wp_scheduled_delete', 'delete_old_products');2. Очистка старых заказов с определенными статусами
Заказы в WooCommerce — это тип поста shop_order. Для удаления заказов со статусом cancelled или refunded старше 365 дней:
function delete_old_cancelled_orders() {
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-refunded'],
'date_query' => [
[
'column' => 'post_date_gmt',
'before' => '365 days ago',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$orders = get_posts($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}
add_action('wp_scheduled_delete', 'delete_old_cancelled_orders');3. Автоматизация через WP-Cron
Чтобы регулярное удаление происходило автоматически, добавим задачу в планировщик WordPress.
function schedule_old_content_cleanup() {
if (!wp_next_scheduled('wp_custom_old_content_cleanup')) {
wp_schedule_event(time(), 'daily', 'wp_custom_old_content_cleanup');
}
}
add_action('wp', 'schedule_old_content_cleanup');
add_action('wp_custom_old_content_cleanup', function() {
delete_old_products();
delete_old_cancelled_orders();
});Проверка результата после внедрения
- В административной панели WooCommerce проверьте наличие старых продуктов и заказов — они должны исчезнуть спустя сутки после активации.
- Для отладки временно добавьте
error_logв функции удаления, чтобы видеть, какие ID удаляются. - Выполните вручную крон-задачу через WP-CLI:
wp cron event run wp_custom_old_content_cleanup, чтобы проверить работу кода сразу.
Частые ошибки и как их исправить
- Удаление нужных данных из-за неправильного условия даты — всегда проверяйте, что
date_queryнастроен правильно, и тестируйте на копии сайта. - Неправильные статусы заказов — статусы WooCommerce имеют префикс
wc-. Без него заказы не найдутся. - Отсутствие прав на удаление — убедитесь, что код выполняется с правами администратора (обычно в кроне это не проблема).
- Запуск крона не происходит — проверьте, что WordPress Cron включен и сайт получает трафик, или настройте системный cron.
Практические советы по безопасности и производительности
- Резервное копирование базы данных перед внедрением автоматического удаления — обязательно.
- Включите логирование удалений для последующего аудита.
- Разбивайте удаление на порции, чтобы не перегружать сервер при большом объеме данных.
- Используйте транзакции базы данных при возможности для целостности данных.
Сравнение вариантов реализации удаления старого контента
| Способ | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудоемко, риск пропуска |
| Автоматизация через WP-Cron (код) | Полный контроль, гибкость | Требует навыков, возможны ошибки |
| Плагины очистки базы (например, WP-Optimize) | Удобство, дополнительные функции | Может удалить лишнее, нагрузка |