Диагностика задачи: зачем удалять товары по статусу заказов
В магазинах на WooCommerce часто возникает необходимость автоматически убирать из каталога товары, которые не продаются, либо, наоборот, те, которые связаны с определённым статусом заказа (например, отменённые или возвращённые товары). Ручная очистка каталога — трудоёмкий процесс, особенно при большом ассортименте. В этой статье разберём, как настроить автоматическое удаление товаров по статусу заказов с помощью WP-Cron и стандартных функций WooCommerce.
Как получить товары, связанные с заказами определённого статуса
Для начала нужно получить ID товаров из заказов с нужным статусом. Например, если статус заказа cancelled, то мы найдем все товары из таких заказов.
function get_products_from_orders_by_status($status = 'cancelled') {
$product_ids = [];
$args = [
'status' => $status,
'limit' => -1 // все заказы
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
if ($product_id && !in_array($product_id, $product_ids)) {
$product_ids[] = $product_id;
}
}
}
return $product_ids;
}Пошаговое решение: автоматическое удаление товаров по статусу заказов
1. Создаём функцию, которая удаляет товары из каталога по их ID.
function delete_products_by_ids(array $product_ids) {
foreach ($product_ids as $product_id) {
wp_delete_post($product_id, true); // true — без перемещения в корзину
}
}2. Создаём основную функцию-обработчик, которая объединит получение товаров и их удаление.
function auto_delete_products_by_order_status() {
$status = 'cancelled'; // статус заказов для фильтрации
$products_to_delete = get_products_from_orders_by_status($status);
if (!empty($products_to_delete)) {
delete_products_by_ids($products_to_delete);
}
}3. Регистрируем WP-Cron, чтобы запускать эту функцию, например, раз в сутки.
add_action('auto_delete_products_event', 'auto_delete_products_by_order_status');
// Создаем событие при активации темы или плагина
function schedule_auto_delete_products_cron() {
if (!wp_next_scheduled('auto_delete_products_event')) {
wp_schedule_event(time(), 'daily', 'auto_delete_products_event');
}
}
add_action('wp', 'schedule_auto_delete_products_cron');4. При необходимости добавьте функцию деактивации, чтобы очистить расписание.
function unschedule_auto_delete_products_cron() {
$timestamp = wp_next_scheduled('auto_delete_products_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'auto_delete_products_event');
}
}Проверка результата после внедрения
- Создайте заказ со статусом
cancelledи добавьте в него товар. - Запустите вручную функцию
auto_delete_products_by_order_status()через консоль WP-CLI или временно привяжите её к хукinitдля теста. - Проверьте, что товар удалён из каталога (в админке WooCommerce и на сайте).
- Убедитесь, что WP-Cron запускается (можно проверить через плагин WP Crontrol или логи сервера).
Частые ошибки и как их исправить
- Проблема: WP-Cron не срабатывает из-за отсутствия посетителей.
Решение: Настройте системный Cron на сервере для вызоваwp-cron.phpили запускайте скрипт вручную через WP-CLI. - Проблема: Товары не удаляются, хотя функция вызывается.
Решение: Проверьте права пользователя и настройки безопасности сервера. Функцияwp_delete_post()должна иметь права удаления постов типа product. - Проблема: Удаляются не все товары из заказов.
Решение: Убедитесь, что в заказах правильно установлены статусы и что функция получает все заказы (параметрlimit => -1).
Практические советы по безопасности и производительности
- Перед удалением товаров сделайте резервную копию базы данных.
- Если товаров много, разбивайте удаление на партии по 20-50 штук, чтобы не перегружать сервер.
- Используйте транзакции базы данных или логи, чтобы отслеживать удалённые товары.
- Проверяйте, что удаление не затрагивает товары, которые всё ещё нужны (например, с активными заказами другого статуса).
Сравнение вариантов автоматизации удаления товаров
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| WP-Cron с пользовательским кодом | Гибкость, полный контроль, бесплатный | Нужны навыки разработки, зависит от трафика сайта | Для уникальных условий удаления, при небольшом/среднем трафике |
| Плагин для массового удаления товаров | Простота, готовое решение | Может не поддерживать автоматизацию по статусам заказов | Разовые действия, без программирования |
| Системный Cron + WP-CLI | Надёжность, не зависит от посетителей | Требует доступа к серверу, знания командной строки | Для крупных магазинов с большим трафиком |