Диагностика проблемы: зачем нужно автоматическое удаление старого контента в WooCommerce
В крупном интернет-магазине на WooCommerce с течением времени накапливаются устаревшие товары, старые заказы и неактивные купоны. Это негативно влияет на производительность базы данных, увеличивает время резервного копирования и усложняет управление магазином. Автоматизация удаления такого контента поможет поддерживать базу в актуальном состоянии без лишних затрат времени и ресурсов.
Какие типы контента можно удалять автоматически
- Товары: устаревшие или неактивные товары, которые не продаются и не должны отображаться в каталоге.
- Заказы: завершённые или отменённые заказы старше определённого срока.
- Купоны: неактивные или истёкшие купоны, которые уже не нужны.
Пошаговое решение: настройка автоматического удаления через WP-Cron и код
1. Создание функции удаления старых товаров
Для удаления товаров, которые не обновлялись месяц и более, используйте следующий код в файле functions.php вашей темы или в кастомном плагине:
function wpmanual_delete_old_products() {
$args = [
'post_type' => 'product',
'date_query' => [
[
'column' => 'post_modified_gmt',
'before' => '30 days ago',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
'post_status' => ['publish', 'pending', 'draft'],
];
$products = get_posts($args);
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // true - удаление без отправки в корзину
}
}2. Создание функции удаления старых заказов
Заказы, которые завершены или отменены и старше 90 дней можно удалить так:
function wpmanual_delete_old_orders() {
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-completed', 'wc-cancelled'],
'date_query' => [
[
'column' => 'post_date_gmt',
'before' => '90 days ago',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$orders = get_posts($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}3. Удаление неактивных купонов
Купоны с истекшим сроком действия удаляются по дате date_expires в метаполях:
function wpmanual_delete_expired_coupons() {
$args = [
'post_type' => 'shop_coupon',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => 'date_expires',
'value' => current_time('timestamp'),
'compare' => '<',
'type' => 'NUMERIC',
],
],
'fields' => 'ids',
];
$coupons = get_posts($args);
foreach ($coupons as $coupon_id) {
wp_delete_post($coupon_id, true);
}
}4. Регистрация WP-Cron задачи
Добавьте в functions.php регистрацию периодического задания:
add_action('wpmanual_daily_cleanup', 'wpmanual_delete_old_products');
add_action('wpmanual_daily_cleanup', 'wpmanual_delete_old_orders');
add_action('wpmanual_daily_cleanup', 'wpmanual_delete_expired_coupons');
if (!wp_next_scheduled('wpmanual_daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpmanual_daily_cleanup');
}5. Очистка Cron при деактивации плагина или темы
function wpmanual_clear_scheduled_hook() {
$timestamp = wp_next_scheduled('wpmanual_daily_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpmanual_daily_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpmanual_clear_scheduled_hook');Проверка результата после внедрения
- Перейдите в админку WordPress > Инструменты > Запланированные задачи (например, с помощью плагина WP Crontrol) и убедитесь, что задача
wpmanual_daily_cleanupзапланирована. - Запустите задачу вручную через WP Crontrol, если нужно проверить немедленно.
- Проверьте таблицу
wp_postsв базе данных: старые товары, заказы и купоны должны быть удалены. - Проверьте, что на сайте и в админке отсутствует удалённый контент.
Частые ошибки и как их исправить
- Ошибка: Задача WP-Cron не запускается.
Причина: WP-Cron зависит от трафика сайта. При низкой активности задачи могут не запускаться.
Решение: Настройте системный cron на сервере для вызоваwp-cron.phpкаждые 15 минут. - Ошибка: Удаление не происходит, контент остаётся.
Причина: Неверные параметры запроса, например, неправильные даты или статусы.
Решение: Проверьте параметрыdate_queryи статусы постов, убедитесь, что товары и заказы действительно подходят под фильтр. - Ошибка: Удаление вызывает ошибки памяти или таймаута.
Причина: Слишком большое количество записей удаляется за один запуск.
Решение: Ограничьте количество обрабатываемых записей, добавьте пагинацию и запуск по частям.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед настройкой автоматического удаления.
- Используйте
wp_delete_post($id, true)для полного удаления без корзины, чтобы не накапливать мусор. - Для больших магазинов лучше разбивать удаление на небольшие партии, чтобы избегать превышения лимитов памяти.
- Для контроля можно логировать удалённые ID в файл или использовать плагин для аудита.
- Проверяйте работу WP-Cron с помощью плагинов вроде WP Crontrol, чтобы убедиться в регулярности запуска.
- Если на сервере настроен системный cron, отключите штатный WP-Cron, чтобы избежать конфликтов.
Сравнение вариантов автоматического удаления в WooCommerce
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| WP-Cron с кастомным кодом | Гибкость, полное управление, без сторонних плагинов | Зависит от активности сайта, требует навыков программирования | Магазины с разработчиками, где важна кастомизация |
| Плагины очистки (например, WP-Sweep, Advanced Database Cleaner) | Простота настройки, готовые интерфейсы | Могут удалять не только WooCommerce контент, риск потери данных | Малые магазины без разработчиков |
| Внешние скрипты и CRON сервера | Независимость от WP-Cron, высокая стабильность | Требует доступа к серверу и навыков системного администрирования | Крупные проекты с высокими требованиями к стабильности |