Диагностика проблемы: почему нужно удалять товары по атрибутам после продажи
В интернет-магазинах на WooCommerce часто возникает задача автоматического удаления товаров с определёнными атрибутами (например, цвет, размер) после того, как они были успешно проданы. Это актуально для ограниченных коллекций, сезонных товаров или уникальных товаров, которые не должны оставаться в каталоге после заказа. Без автоматизации этот процесс требует ручного контроля, что повышает риск ошибок и снижает скорость обновления ассортимента.
Основные сложности:
- Определить, что товар с нужным атрибутом был продан (заказ завершён).
- Безопасно удалить или скрыть товар из каталога.
- Избежать удаления товаров, которые ещё доступны или нужны для других заказов.
Пошаговое решение: автоматическое удаление товаров по атрибутам после завершения заказа
1. Отслеживаем статус заказа для запуска удаления
Для этого используем хук woocommerce_order_status_completed, который срабатывает, когда заказ переведён в статус «завершён».
add_action('woocommerce_order_status_completed', 'delete_products_by_attributes_after_sale', 10, 1);2. Функция удаления товаров по атрибутам
В функции получаем все товары заказа, проверяем их атрибуты и удаляем, если они соответствуют заданным условиям.
function delete_products_by_attributes_after_sale($order_id) {
// Задайте атрибуты для удаления
$target_attributes = [
'pa_color' => ['red', 'blue'], // пример: атрибут цвет, значения
'pa_size' => ['xl']
];
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if (!$product) continue;
$product_id = $product->get_id();
$attributes = $product->get_attributes();
// Проверяем атрибуты
$should_delete = false;
foreach ($target_attributes as $attr_name => $attr_values) {
if (isset($attributes[$attr_name])) {
$attr = $attributes[$attr_name];
if ($attr->is_taxonomy()) {
$terms = wp_get_post_terms($product_id, $attr_name, ['fields' => 'slugs']);
foreach ($attr_values as $value) {
if (in_array($value, $terms)) {
$should_delete = true;
break 2;
}
}
} else {
$value = $attr->get_options();
foreach ($attr_values as $target_value) {
if (in_array($target_value, $value)) {
$should_delete = true;
break 2;
}
}
}
}
}
if ($should_delete) {
// Удаляем продукт, учитывая связанные данные
wp_delete_post($product_id, true);
}
}
}Проверка результата после внедрения
- Создайте тестовый заказ с товаром, у которого есть нужные атрибуты (например, цвет «red»).
- Переведите заказ в статус «завершён» через админку WooCommerce или программно.
- Проверьте в каталоге, что товар удалён (его больше нет в списке продуктов и на фронтенде).
- Для отладки можно добавить логирование внутри функции удаления, например, через
error_log()или плагин Query Monitor.
Частые ошибки и как их исправлять
- Товар не удаляется после завершения заказа: Проверьте правильность хука и наличие функции в активной теме или плагине. Убедитесь, что статус заказа действительно меняется на «completed».
- Атрибуты не распознаются: Убедитесь, что имена атрибутов указаны корректно, с префиксом
pa_для таксономий. Проверьте, что значения атрибутов совпадают по слагам. - Удаляется не тот товар или удаляются лишние: Проверьте логику проверки атрибутов и фильтрации. Добавьте дополнительное логирование для отладки.
- Проблемы с правами на удаление: Убедитесь, что код выполняется с правами администратора (обычно при обработке заказа это так).
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед внедрением автоматического удаления продуктов.
- Подумайте о замене
wp_delete_post($product_id, true)на изменение статуса товара на «черновик» или «скрытый», если хотите иметь возможность восстановить товар. - Для больших магазинов с частыми заказами можно добавить задержку или поставить задачу в WP-Cron, чтобы не нагружать сервер.
- Используйте транзакции или проверяйте, что товар не используется в других заказах, прежде чем удалять.
Сравнение вариантов реализации удаления товаров по атрибутам
| Метод | Преимущества | Недостатки |
|---|---|---|
Удаление через хук woocommerce_order_status_completed | Автоматизация сразу после продажи, простой код, без плагинов | Риск удаления нужных товаров, нагрузка на сервер при большом количестве заказов |
| Изменение статуса товара (скрытие вместо удаления) | Безопасно, можно восстановить товары | Требуется дополнительная логика для фильтрации скрытых товаров |
| Использование плагинов автоматизации (например, WP-Cron + кастомный код) | Контроль нагрузки, гибкость | Сложнее в настройке, требует мониторинга задач |