WooCommerce: как исправить автоматическое удаление товаров при изменении их статуса

Диагностика проблемы: почему товары удаляются при смене статуса

В WooCommerce иногда возникают ситуации, когда при смене статуса товара (например, из "черновика" в "опубликовано" или обратно) товар неожиданно исчезает из каталога или даже удаляется из базы данных. Это может быть вызвано некорректной работой кастомных плагинов, конфликтами хуков или ошибками в коде, который слушает события смены статуса.

Для диагностики выполните следующие шаги:

  • Отключите все кастомные плагины, связанные с товарами и статусами.
  • Проверьте логи ошибок PHP и WooCommerce на предмет критических ошибок.
  • Попробуйте сменить статус товара вручную в админке и отследить, когда происходит удаление.
  • Используйте плагин Query Monitor для отслеживания запросов к базе данных на момент смены статуса.

Пошаговое решение проблемы автоматического удаления товаров

1. Отключение проблемных хуков

Часто причиной служат пользовательские или сторонние хуки, например, на save_post_product или transition_post_status, которые вызывают удаление товара. Проверьте функции, использующие эти хуки, и временно отключите их.

2. Защита от удаления в хуках смены статуса

Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин, чтобы предотвратить удаление товара при смене статуса:

add_action('before_delete_post', 'prevent_product_deletion_on_status_change', 10, 1);
function prevent_product_deletion_on_status_change($post_id) {
    $post_type = get_post_type($post_id);
    if ($post_type !== 'product') {
        return;
    }
    // Проверяем, не происходит ли удаление при смене статуса
    if (wp_is_post_revision($post_id)) {
        return;
    }
    // Можно добавить дополнительные проверки, если нужно
    // Отменяем удаление
    wp_die('Удаление товаров при смене статуса запрещено.');
}

3. Исправление кастомных функций

Если у вас есть пользовательские функции, которые меняют статус товара и вызывают удаление, исправьте их логику, чтобы они обновляли статус без удаления. Например:

function safe_update_product_status($product_id, $new_status) {
    if (get_post_type($product_id) !== 'product') {
        return false;
    }
    $allowed_statuses = ['publish', 'draft', 'pending', 'private'];
    if (!in_array($new_status, $allowed_statuses)) {
        return false;
    }
    return wp_update_post([
        'ID' => $product_id,
        'post_status' => $new_status
    ]);
}

Проверка результата после внедрения

После внесения изменений:

  • Создайте тестовый товар и попробуйте сменить его статус на разные варианты через админку.
  • Убедитесь, что товар не исчезает и не удаляется.
  • При использовании кастомных скриптов, проверьте их работу с помощью отладчика или логов.
  • Проверьте, что логи ошибок пусты и нет предупреждений о попытках удаления.

Частые ошибки и как их исправить

  • Ошибка: Хук transition_post_status вызывает удаление товара.
    Решение: Измените логику в функциях на проверку типа поста и отмену удаления.
  • Ошибка: Кастомный плагин вызывает wp_delete_post при смене статуса.
    Решение: Найдите и измените вызовы wp_delete_post, заменив на wp_update_post с нужным статусом.
  • Ошибка: Некорректные значения статусов.
    Решение: Используйте только допустимые статусы WooCommerce и WordPress.

Практические советы по безопасности и производительности

  • Всегда делайте бэкап базы данных перед массовыми изменениями в товарах.
  • Используйте транзакции MySQL, если обновляете много записей через кастомный код.
  • Для отслеживания изменений статусов используйте woocommerce_product_set_stock_status или woocommerce_update_product для логирования и контроля.
  • Ограничьте права пользователей, чтобы случайно не удаляли товары.
  • Мониторьте логи сервера и запросов к базе для выявления аномалий.

Сравнение вариантов решения проблемы

МетодОписаниеПлюсыМинусы
Отключение хуковВременное отключение проблемных функций через remove_actionБыстро, позволяет локализовать проблемуТребуется анализ кода, может сломать функционал
Защита от удаления через хук before_delete_postБлокировка удаления товаров программноНадёжно предотвращает удалениеНе решает причину, только симптом
Исправление кастомного кодаКорректировка логики обновления статусовПравильное и долгосрочное решениеТребует навыков разработки
WooCommerce: как исправить проблемы с удалённым обновлением статуса заказа
11.06.2026
Отладка проблем с отправкой писем из WordPress и их попаданием в спам
14.06.2026
Как отключить авторизацию через email в WordPress
26.03.2026
WooCommerce: как настроить автообновление статуса заказа без перезагрузки страницы
05.08.2026
Как добавить своё кастомное поле в WordPress REST API
04.11.2025