WooCommerce: как автоматически удалять заказы с почтовыми данными клиента после 30 дней

Почему важно автоматически удалять заказы с персональными данными

В соответствии с законами о защите персональных данных (например, GDPR), хранение информации о клиентах дольше необходимого срока может привести к рискам безопасности и штрафам. Автоматическое удаление заказов старше 30 дней, включая почтовые данные, помогает соблюдать эти требования и снижает нагрузку на базу данных.

Диагностика проблемы: как понять, что заказы не удаляются

Если вы заметили, что заказы WooCommerce накапливаются в базе, а старые с личными данными клиентов не удаляются, возможно, не настроена автоматизация удаления. Проверьте следующие моменты:

  • В админке WooCommerce > Заказы отображаются заказы с датой старше 30 дней.
  • В базе данных (таблица wp_posts с типом shop_order) содержатся записи старше 30 дней.
  • Проверка cron-задач (WP-Cron) на наличие задач, связанных с удалением заказов.

Как проверить наличие заказов старше 30 дней в базе

SELECT ID, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_date < NOW() - INTERVAL 30 DAY;

Пошаговое решение: автоматическое удаление заказов WooCommerce старше 30 дней с личными данными

1. Создаем функцию для удаления заказов

Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:

function wporders_delete_old_orders() {
    $args = array(
        'status' => array('completed', 'processing', 'on-hold'),
        'date_created' => '<' . ( new WC_DateTime() )->modify('-30 days')->format('Y-m-d H:i:s'),
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        if (!$order) continue;

        // Удаляем почтовые данные из метаданных
        $order->delete_meta_data('_billing_address_1');
        $order->delete_meta_data('_billing_address_2');
        $order->delete_meta_data('_billing_city');
        $order->delete_meta_data('_billing_postcode');
        $order->delete_meta_data('_billing_country');
        $order->delete_meta_data('_billing_state');
        $order->delete_meta_data('_billing_email');
        $order->delete_meta_data('_billing_phone');
        $order->save();

        // Удаление заказа из базы
        wp_delete_post($order_id, true);
    }
}

2. Запускаем функцию по расписанию через WP-Cron

Добавьте планировщик:

function wporders_schedule_delete_old_orders() {
    if (!wp_next_scheduled('wporders_daily_delete_old_orders')) {
        wp_schedule_event(time(), 'daily', 'wporders_daily_delete_old_orders');
    }
}
add_action('wp', 'wporders_schedule_delete_old_orders');

add_action('wporders_daily_delete_old_orders', 'wporders_delete_old_orders');

3. Очистка cron-задач при деактивации плагина или темы

function wporders_clear_scheduled_delete() {
    $timestamp = wp_next_scheduled('wporders_daily_delete_old_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wporders_daily_delete_old_orders');
    }
}
register_deactivation_hook(__FILE__, 'wporders_clear_scheduled_delete');

Как проверить, что удаление работает

  • Добавьте несколько тестовых заказов со статусом completed или processing старше 30 дней (можно через SQL изменить дату).
  • Выполните вручную функцию wporders_delete_old_orders() через WP CLI или временно запустите её в админке.
  • Проверьте, что заказы и их почтовые данные удалены из базы (таблицы wp_posts и wp_postmeta).
  • Убедитесь, что запланированное задание wporders_daily_delete_old_orders появилось в списке cron (плагины WP Crontrol помогут).

Частые ошибки и способы их исправления

  • Заказы не удаляются: проверьте, активен ли WP-Cron и работает ли на вашем хостинге. В некоторых случаях cron нужно запускать вручную из системы.
  • Функция не находит заказы: проверьте корректность даты в параметре date_created и статусы заказов.
  • Почтовые данные не удаляются: убедитесь, что вызываете $order->save() после удаления метаданных.
  • Ошибка при удалении заказа: проверьте права пользователя и возможность удаления записей в базе.

Практические советы по безопасности и производительности

  • Удаление большого количества заказов за раз может нагружать сервер. При большом объеме данных разбивайте удаление на порции.
  • Регулярно создавайте резервные копии базы перед применением массовых операций.
  • Для контроля используйте логирование действий удаления (например, через error_log или специальный файл).
  • Если не хотите полностью удалять заказы, можно сначала анонимизировать почтовые данные, оставляя запись для аналитики.

Сравнение вариантов удаления заказов с почтовыми данными

МетодПлюсыМинусыПрименимость
Ручное удаление через админкуПростота, не требует кодаТрудоемко, не автоматизированоМалое количество заказов
Плагин для удаления заказовАвтоматизация, настройкаМожет быть платным, нагрузка на сайтСредние и большие магазины
Кастомный код с WP-CronГибкость, контроль, бесплатныйТребует навыков разработкиЛюбой размер, при наличии навыков
Как автоматически отключать оплату при повторных неудачных попытках в WooCommerce
03.05.2026
Как сделать автоматическое сохранение заказов в WordPress без WooCommerce
23.01.2026
WooCommerce: как автоматически удалять личные данные клиента после удаления заказа
22.07.2026
Как создать автоматический скрипт для резервирования товаров в WooCommerce
16.02.2026
Как создать собственный тип записей в WordPress: практическое руководство
04.12.2025