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

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

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

Чтобы понять источник проблемы, проверьте следующие моменты:

  • Используются ли плагины для автоматической очистки базы данных или управления товарами?
  • Нет ли в functions.php или в кастомных плагинах кода, который удаляет товары при смене статуса?
  • Какие хуки WooCommerce задействованы при изменении статуса товара?

Как проверить, что именно вызывает удаление?

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

add_action('transition_post_status', function($new_status, $old_status, $post) {
    if ($post->post_type === 'product') {
        error_log("Статус товара ID {$post->ID} изменён с {$old_status} на {$new_status}");
    }
}, 10, 3);

Это позволит отследить, когда и какой статус получает товар. Если после этого в логи появляется запись об удалении или товар исчезает сразу после смены статуса, значит срабатывает какой-то обработчик на этот хук.

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

Самый надёжный способ — перехватить событие смены статуса и предотвратить удаление товара. Для этого выполните следующие шаги:

  1. Отключите подозрительные плагины один за другим, проверяя поведение товаров после каждой деактивации.
  2. Если причина в кастомном коде, найдите и закомментируйте функции, использующие хуки before_delete_post, transition_post_status или похожие.
  3. Добавьте в functions.php следующий фильтр, который блокирует удаление товаров программно:
add_filter('before_delete_post', function($postid) {
    $post = get_post($postid);
    if ($post && $post->post_type === 'product') {
        // Отмена удаления
        return false; 
    }
    return $postid;
});

Этот код отменит удаление любого поста типа "product".

Альтернативный способ: изменить статус, а не удалять товар

Если автоматические процессы нацелены на удаление "просроченных" или "неактивных" товаров, лучше изменить логику — переводить их в статус "черновик" или "в ожидании", а не удалять. Пример кода для этого:

add_action('transition_post_status', function($new_status, $old_status, $post) {
    if ($post->post_type === 'product' && $new_status === 'trash') {
        // Вместо удаления переводим товар в черновик
        wp_update_post([
            'ID' => $post->ID,
            'post_status' => 'draft'
        ]);
        // Отменяем удаление
        remove_action('transition_post_status', __FUNCTION__, 10);
    }
}, 10, 3);

Проверка результата

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

  • Смените статус любого товара в админке WooCommerce, например, с "опубликован" на "черновик" и обратно.
  • Убедитесь, что товар не удаляется и отображается в каталоге или в списке товаров.
  • Проверьте логи ошибок или debug.log (если включён WP_DEBUG) на предмет сообщений об удалении.

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

  • Неправильный приоритет хуков: если ваш код не срабатывает, попробуйте поставить более высокий приоритет, например 20 или 99.
  • Конфликт с другими плагинами: иногда плагины используют свои собственные методы удаления. Проверьте, можно ли настроить их в админке или отключить удаление товаров.
  • Кеширование: если вы используете плагин кэширования, очистите кэш после изменений.

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

  • Всегда делайте бэкап базы данных перед изменениями, особенно если меняете логику удаления товаров.
  • Используйте детальный лог действий с товарами для отладки.
  • Не храните в базе удалённые товары — лучше переводить их в статус "черновик" для возможности восстановления.
  • По возможности используйте специализированные плагины для управления массовым изменением статусов, например Bulk Edit, чтобы избежать ошибок.

Сравнение вариантов решения

МетодОписаниеПлюсыМинусы
Отключение плагинов удаляющих товарыДеактивация конфликтующих плагиновПростое решение, без кодаМожет повлиять на функционал сайта
Код с фильтром before_delete_postПерехват удаления через хукГибко, можно доработать под свои нуждыТребует навыков программирования
Перевод в статус draft вместо удаленияИзменение логики вместо удаленияСохраняет данные, безопасно для восстановленияТребует доп. обработки статусов
Как разрешить и запретить регистрацию по доменным именам в WordPress
23.03.2026
Как использовать REST API для создания кастомных эндпоинтов в WordPress
09.12.2025
Как установить и настроить push-уведомления в WordPress
09.02.2026
Отправка формы в WordPress без перезагрузки страницы с помощью AJAX
21.12.2025
Как автоматизировать создание и удаление временных файлов в WordPress
21.01.2026