Почему важно автоматически удалять заказы с персональными данными
В соответствии с законами о защите персональных данных (например, 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 | Гибкость, контроль, бесплатный | Требует навыков разработки | Любой размер, при наличии навыков |