Диагностика проблемы: зачем очищать корзину и историю заказов по устройствам
В WooCommerce корзина пользователя хранится в сессии и cookie, а история заказов - в базе данных, привязана к аккаунту. Иногда нужно очистить корзину или историю заказов не глобально, а для определённых устройств или браузеров, например, при тестировании, устранении багов или при жалобах пользователей на некорректное отображение товара в корзине.
Типичные симптомы, указывающие на необходимость очистки корзины или истории заказов по устройствам:
- Пользователь жалуется, что в корзине остаются старые товары после оформления заказа.
- Тестировщик нуждается в очистке сессии без удаления данных других пользователей.
- Необходимость сбросить историю заказов по определённому клиенту, чтобы проверить работу новых статусов.
Как очистить корзину WooCommerce по устройствам
Важное о сессиях и cookie WooCommerce
Корзина хранится в сессии пользователя, доступ к которой осуществляется через cookie woocommerce_cart_hash и woocommerce_items_in_cart. Очистка корзины для конкретного устройства означает удаление этих cookie и сессии.
Пошаговое решение через PHP и JavaScript
Если вы хотите программно очистить корзину текущего пользователя (например, для кнопки «Очистить корзину»), используйте следующий код в functions.php или в вашем плагине:
add_action('wp_ajax_clear_cart', 'custom_clear_cart_function');
add_action('wp_ajax_nopriv_clear_cart', 'custom_clear_cart_function');
function custom_clear_cart_function() {
WC()->cart->empty_cart(true);
wp_send_json_success('Корзина очищена');
}Для вызова этого AJAX-запроса с фронтенда можете использовать JS:
jQuery.post(
wc_cart_params.ajax_url,
{ action: 'clear_cart' },
function(response) {
if(response.success) {
location.reload(); // Перезагрузка страницы для обновления UI
}
}
);Если же вы хотите полностью удалить cookie корзины на клиенте, используйте JavaScript:
document.cookie = 'woocommerce_cart_hash=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
document.cookie = 'woocommerce_items_in_cart=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';Как очистить историю заказов WooCommerce для конкретного пользователя
Удаление истории заказов из базы данных
История заказов хранится в таблице wp_posts с типом записи shop_order, а мета-данные - в wp_postmeta. Для удаления заказов конкретного пользователя (ID пользователя) можно использовать SQL или WP_Query.
Пример удаления заказов пользователя по ID:
$user_id = 123; // ID пользователя
$args = [
'post_type' => 'shop_order',
'numberposts' => -1,
'author' => $user_id,
'post_status' => 'any',
];
$orders = get_posts($args);
foreach ($orders as $order) {
wp_delete_post($order->ID, true);
}Обратите внимание, что заказ может быть не всегда автором пользователя, если гость оформляет заказ. Тогда фильтрация по мета-данным с email клиента:
$customer_email = 'user@example.com';
$args = [
'post_type' => 'shop_order',
'numberposts' => -1,
'post_status' => 'any',
'meta_query' => [
[
'key' => '_billing_email',
'value' => $customer_email,
'compare' => '=',
],
],
];
$orders = get_posts($args);
foreach ($orders as $order) {
wp_delete_post($order->ID, true);
}Проверка результата после внедрения
- Для очистки корзины: откройте сайт в браузере, добавьте товар в корзину, вызовите AJAX-запрос очистки и проверьте, что корзина пустая, а cookie
woocommerce_cart_hashудалены или обновлены. - Для очистки истории заказов: зайдите в админку WooCommerce – Заказы, убедитесь, что заказы пользователя отсутствуют, а в базе данных (через phpMyAdmin) записи удалены.
Частые ошибки и как их исправить
- Корзина не очищается после AJAX-запроса: Проверьте, что сессия WooCommerce и объект
WC()->cartинициализированы. Добавьтеwc_load_cart()перед очисткой. - Удаление заказов не работает для гостевых покупок: Не используйте фильтр
author, а ищите через мета-ключ_billing_email. - Заказы не удаляются полностью: Убедитесь, что используете
wp_delete_post($id, true)с параметромtrueдля полного удаления.
Практические советы по безопасности и производительности
- Удаление заказов – необратимая операция, делайте резервные копии базы перед выполнением.
- Ограничьте доступ к очистке корзины и заказов только администраторам или доверенным ролям, проверяя
current_user_can(). - Для массового удаления заказов используйте WP CLI для производительности и безопасности:
wp post delete $(wp post list --post_type=shop_order --meta_key=_billing_email --meta_value=user@example.com --format=ids) --forceСравнение способов очистки корзины и заказов
| Задача | Способ | Плюсы | Минусы |
|---|---|---|---|
| Очистка корзины | AJAX + PHP (WC()->cart->empty_cart()) | Точная очистка для сессии | Требует сессии и загрузки WC |
| Очистка корзины | Удаление cookie JS | Простота, работает на клиенте | Не сбрасывает серверную сессию |
| Удаление заказов | PHP + WP_Query + wp_delete_post() | Гибкость, работа с условиями | Может быть медленнее при большом объеме |
| Удаление заказов | WP CLI команда | Быстро и безопасно при большом объеме | Требует SSH-доступа |