Почему важно удалять личные данные после удаления заказа в WooCommerce
Во многих интернет-магазинах по соображениям безопасности и соответствия требованиям GDPR и других законов о защите данных возникает задача не только удалить заказ, но и полностью очистить все личные данные клиента, связанные с этим заказом. По умолчанию WooCommerce при удалении заказа не удаляет метаданные пользователя, адреса и другую персональную информацию.
Диагностика проблемы: где WooCommerce хранит личные данные заказчика
Личные данные клиента в WooCommerce могут храниться в нескольких местах:
- В метаданных самого объекта заказа (postmeta для типа заказа 'shop_order')
- В профиле пользователя (если заказ был сделан зарегистрированным пользователем)
- В таблице
woocommerce_order_itemsиwoocommerce_order_itemmeta(адреса доставки и оплаты) - В пользовательских метаданных (
usermeta) — если клиент зарегистрирован
Удаление заказа через админку удаляет только запись заказа и связанные с ним метаданные, но не очищает профиль пользователя и не удаляет адреса из woocommerce_order_itemmeta.
Шаги для полного удаления личных данных клиента при удалении заказа
1. Создаем функцию для полного удаления данных при удалении заказа
Используем хук before_delete_post для отслеживания удаления заказа. В функции удаляем все связанные метаданные заказа, адреса и пользовательские данные, если нужно.
add_action('before_delete_post', 'wporders_remove_customer_data_on_order_delete');
function wporders_remove_customer_data_on_order_delete($post_id) {
if (get_post_type($post_id) !== 'shop_order') {
return;
}
$order = wc_get_order($post_id);
if (!$order) {
return;
}
$user_id = $order->get_user_id();
// Удаляем метаданные заказанных позиций
global $wpdb;
$wpdb->query($wpdb->prepare(
"DELETE FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id = %d",
$post_id
));
$wpdb->query($wpdb->prepare(
"DELETE meta FROM {$wpdb->prefix}woocommerce_order_itemmeta AS meta
LEFT JOIN {$wpdb->prefix}woocommerce_order_items AS items ON meta.order_item_id = items.order_item_id
WHERE items.order_id = %d",
$post_id
));
// Если пользователь зарегистрирован, удаляем пользовательские метаданные, связанные с этим заказом
if ($user_id) {
// Пример: удаляем billing и shipping метаданные из usermeta
$fields_to_delete = [
'billing_first_name', 'billing_last_name', 'billing_address_1', 'billing_address_2',
'billing_city', 'billing_postcode', 'billing_country', 'billing_email', 'billing_phone',
'shipping_first_name', 'shipping_last_name', 'shipping_address_1', 'shipping_address_2',
'shipping_city', 'shipping_postcode', 'shipping_country'
];
foreach ($fields_to_delete as $field) {
delete_user_meta($user_id, $field);
}
}
}
2. Ограничение удаления данных только для определенных статусов заказов
Чтобы не удалять данные преждевременно, можно ограничить удаление только заказами в статусах, например, 'cancelled' или 'refunded'.
add_action('before_delete_post', 'wporders_remove_customer_data_on_order_delete');
function wporders_remove_customer_data_on_order_delete($post_id) {
if (get_post_type($post_id) !== 'shop_order') {
return;
}
$order = wc_get_order($post_id);
if (!$order) {
return;
}
$allowed_statuses = ['cancelled', 'refunded'];
if (!in_array($order->get_status(), $allowed_statuses)) {
return;
}
// Далее код удаления данных как в предыдущем примере
}
Как проверить, что данные удалены
- Удалите заказ с нужным статусом через админку WooCommerce.
- Проверьте наличие записи заказа в базе данных (
wp_postsс типомshop_order). - Проверьте таблицы
woocommerce_order_itemsиwoocommerce_order_itemmeta: записи с order_id удалены. - Если заказ был от зарегистрированного пользователя, проверьте через phpMyAdmin или функцию
get_user_meta(), что метаданные billing и shipping удалены.
Частые ошибки и их исправление
- Данные не удаляются полностью — часто из-за отсутствия удаления записей из таблиц
woocommerce_order_itemsиwoocommerce_order_itemmeta. Проверьте SQL-запросы и права пользователя базы данных. - Удаление данных пользователя приводит к потере информации для других заказов — удаляйте только метаданные, относящиеся к конкретному заказу, либо ограничьте удаление данных в профиле пользователя, если это приемлемо.
- Функция не срабатывает при массовом удалении заказов — проверьте, что хук
before_delete_postвызывается корректно, и нет конфликтов с другими плагинами.
Практические советы по безопасности и производительности
- Всегда делайте бэкап базы данных перед массовым удалением данных.
- Выносите сложные запросы удаления в отдельные транзакции для предотвращения частичной очистки.
- Используйте проверку статуса заказа, чтобы не удалять данные преждевременно.
- Если магазин большой, реализуйте пакетное удаление данных с ограничением количества удаляемых заказов за запрос.
Таблица сравнения способов удаления личных данных при удалении заказа
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Удаление вручную через админку | Удаление заказа через админку WooCommerce | Просто, нет кода | Не удаляются связанные пользовательские данные |
Код на хуке before_delete_post | Автоматическое удаление всех связанных данных в момент удаления заказа | Полное удаление, автоматизация | Требует тестирования, возможны ошибки в SQL-запросах |
| Использование плагинов GDPR | Специализированные плагины для удаления и анонимизации данных | Удобно, поддержка законодательства | Могут быть избыточны, нагрузка на сайт |