Диагностика задачи: зачем нужно удалять заказы по ссылке
В некоторых случаях администраторам WooCommerce нужно быстро удалять заказы, например, отменённые или ошибочные, без захода в админку и поиска через интерфейс. Автоматизация этого процесса через уникальную ссылку с подтверждением ускорит работу и позволит интегрировать удаление с внешними сервисами или скриптами.
Однако удаление заказов напрямую через URL требует безопасности и проверки, чтобы избежать случайного или злонамеренного удаления.
Как реализовать автоматическое удаление заказов по ссылке в WooCommerce
1. Создание пользовательского эндпоинта для удаления заказа
Добавим обработчик на основе init, который будет проверять GET параметры и выполнять удаление при совпадении токена и ID заказа.
add_action('init', function() {
if (!is_admin() && isset($_GET['delete_order']) && isset($_GET['token'])) {
$order_id = intval($_GET['delete_order']);
$token = sanitize_text_field($_GET['token']);
// Проверяем валидность токена
$secret_key = 'vashe-sekretnoe-slovo'; // замените на свой секрет
$valid_token = hash('sha256', $order_id . $secret_key);
if ($token !== $valid_token) {
wp_die('Неверный токен безопасности.');
}
$order = wc_get_order($order_id);
if (!$order) {
wp_die('Заказ не найден.');
}
// Проверяем статус заказа (например, удаляем только отменённые)
if ($order->get_status() !== 'cancelled') {
wp_die('Удалять можно только отменённые заказы.');
}
// Удаляем заказ
wp_delete_post($order_id, true); // true — безвозвратное удаление
wp_redirect(home_url('/?order_deleted=1'));
exit;
}
});2. Генерация безопасных ссылок для удаления заказов
Чтобы получить ссылку для удаления конкретного заказа, можно использовать такую функцию:
function get_delete_order_link($order_id) {
$secret_key = 'vashe-sekretnoe-slovo';
$token = hash('sha256', $order_id . $secret_key);
return add_query_arg([
'delete_order' => $order_id,
'token' => $token
], home_url());
}Пример использования:
$link = get_delete_order_link(1234);
echo '<a href="' . esc_url($link) . '">Удалить заказ #1234</a>';Проверка результата после внедрения
- Перейдите по сгенерированной ссылке удаления.
- Если заказ существует, статус отменён, и токен верный, заказ удалится безвозвратно.
- Вы будете перенаправлены на главную с параметром
?order_deleted=1. - При попытке удалить заказ с неверным токеном или неподходящим статусом появится страница с ошибкой.
Частые ошибки и способы их исправления
- Заказ не удаляется, хотя ссылка правильная: проверьте статус заказа, он должен быть
cancelled(или измените условие в коде). - Ошибка «Неверный токен безопасности»: убедитесь, что секретный ключ совпадает в функции генерации и в обработчике.
- Заказ не найден при удалении: проверьте, что ID заказа корректный и заказ существует в базе.
- Ссылки доступны публично: добавьте дополнительную защиту, например, проверку текущего пользователя или IP-адреса.
Практические советы по безопасности и производительности
- Используйте сложный секретный ключ, не храните его в публичном доступе.
- Ограничьте доступ к ссылке удалению по IP или авторизации пользователя, чтобы избежать злоупотреблений.
- Добавьте логирование удалений в отдельный файл или таблицу базы данных для аудита.
- При большом числе заказов проверяйте производительность удаления, удаление заказов — ресурсозатратная операция.
Сравнение вариантов реализации автоматического удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Удаление через ссылку с токеном | Простота использования, возможность интеграции с внешними системами | Риск безопасности без надлежащей защиты, требует ручного управления токенами |
| Удаление через REST API WooCommerce | Стандартный метод, поддержка авторизации, гибкость | Сложнее в настройке, требует OAuth или API ключей |
| Удаление через админ-панель вручную | Безопасность, контроль | Медленно при большом количестве заказов |