Диагностика задачи: зачем удалять товар после продажи
В WooCommerce иногда возникает необходимость автоматически удалять товар из каталога сразу после первой продажи. Это актуально для одноразовых или лимитированных предложений, где остаток товара ограничен одной единицей, или при продаже эксклюзивных товаров. В стандартном WooCommerce нет встроенной функции для автоматического удаления товара после продажи, поэтому требуется кастомное решение.
Как правильно реализовать автоматическое удаление товара после продажи
Выбор подхода: удалять или скрывать
Удаление товара полностью с сайта — радикальный вариант, который приведёт к потере данных о товаре. Более щадящий способ — переводить товар в черновики или скрывать из каталога. Тем не менее, если задача именно удалить, ниже представлен пример решения с подтверждением удаления.
Пошаговое решение с примером кода
Мы реализуем удаление товара после успешного оформления заказа, но сначала проверим, что товар продан впервые, и запросим подтверждение перед окончательным удалением.
- Добавим кастомное поле для товара с флагом удаления.
- После оформления заказа проверим, если это первая продажа, отправим письмо администратору с запросом подтверждения.
- По подтверждению удалим товар программно.
Пример кода для файла functions.php вашей темы или отдельного плагина:
add_action('woocommerce_order_status_completed', 'wps_delete_product_after_first_sale');
function wps_delete_product_after_first_sale($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
$product = wc_get_product($product_id);
// Проверяем, продан ли товар впервые
$total_sales = $product->get_total_sales();
if ($total_sales === 1) {
// Сохраняем ID товара для удаления после подтверждения
update_post_meta($product_id, '_wps_pending_deletion', 'yes');
// Отправляем письмо с подтверждением
wps_send_deletion_confirmation_email($product_id);
}
}
}
function wps_send_deletion_confirmation_email($product_id) {
$product = wc_get_product($product_id);
$to = get_option('admin_email');
$subject = 'Подтверждение удаления товара после продажи';
$link = admin_url('admin-post.php?action=wps_confirm_delete_product&product_id=' . $product_id);
$message = "Товар: {$product->get_name()} (ID: {$product_id}) был продан впервые. <br>
Для подтверждения удаления перейдите по ссылке:<br>
<a href='{$link}'>Удалить товар</a>";
wp_mail($to, $subject, $message, ['Content-Type: text/html; charset=UTF-8']);
}
add_action('admin_post_wps_confirm_delete_product', 'wps_confirm_delete_product_handler');
function wps_confirm_delete_product_handler() {
if (!current_user_can('manage_woocommerce')) {
wp_die('Доступ запрещён');
}
$product_id = intval($_GET['product_id']);
$pending = get_post_meta($product_id, '_wps_pending_deletion', true);
if ($pending === 'yes') {
wp_delete_post($product_id, true); // Удаляем товар без возможности восстановления
wp_redirect(admin_url('edit.php?post_type=product&wps_delete=success'));
exit;
}
wp_redirect(admin_url('edit.php?post_type=product&wps_delete=fail'));
exit;
}Проверка результата после внедрения
1. Создайте тестовый товар с количеством 1.
2. Оформите заказ с этим товаром и завершите его (статус completed).
3. Проверьте почту администратора — должно прийти письмо с ссылкой на удаление.
4. Перейдите по ссылке под пользователем с правами администратора — товар должен исчезнуть из каталога и базы.
Частые ошибки и как их исправить
- Письмо не приходит: проверьте работу
wp_mail(), настройки SMTP, папку спама, и правильность email администратора. - Ссылка удаления не работает: убедитесь, что пользователь авторизован и имеет права
manage_woocommerce. - Товар не удаляется: проверьте, что метаполе
_wps_pending_deletionдействительно установлено и совпадает с проверкой в обработчике. - Удаление происходит сразу без подтверждения: проверьте, что код удаления вызывается только внутри функции обработчика
admin_post, а не сразу после изменения статуса.
Практические советы по безопасности и производительности
- Для безопасности добавьте nonce-проверку при подтверждении удаления.
- Удаление товаров — необратимая операция, убедитесь, что администратор действительно хочет удалить.
- Если товаров много, используйте очередь задач или WP-Cron для обработки массовых удалений.
- Для простых сценариев лучше скрывать товар переводом в статус
draft, чтобы сохранить историю и данные.
Сравнение вариантов: удаление товара после продажи
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Удаление товара (код) | Полное удаление, освобождение базы | Потеря данных, риск ошибки | Код из статьи с подтверждением |
| Скрытие товара (перевод в draft) | Сохраняет данные, легко отменить | Товар остаётся в базе | wp_update_post(['ID' => $product_id, 'post_status' => 'draft']); |
| Ограничение продажи (stock management) | Автоматически снимает с продажи при отсутствии запаса | Товар виден, но не доступен для покупки | Стандартные настройки WooCommerce |