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

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

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

Основные причины:

  • Конфликт с плагинами, которые управляют видимостью товаров в зависимости от статуса.
  • Кастомный код, работающий с хуками save_post_product или transition_post_status, который удаляет товары при смене статуса.
  • Ошибочная логика в фильтрах вывода товаров (например, в pre_get_posts), исключающая товары с определённым статусом.

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

1. Проверка плагинов

Отключите поочередно плагины, которые связаны с управлением товарами, кэшированием, оптимизацией.

Для отключения используйте WP-CLI или админку:

wp plugin deactivate plugin-slug

2. Анализ кастомного кода

Проверьте в теме и в файлах mu-plugins, есть ли обработчики на:

add_action('save_post_product', 'your_function_name');
add_action('transition_post_status', 'your_function_name', 10, 3);

Если есть функции, которые вызывают wp_delete_post() или изменяют статус товара с удалением — временно закомментируйте их.

3. Отключение удаления через хук

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

add_action('transition_post_status', function($new_status, $old_status, $post) {
    if ($post->post_type !== 'product') {
        return;
    }
    // Отмена удаления товара
    if ($new_status === 'trash' && $old_status !== 'trash') {
        // Переводим обратно в предыдущий статус
        wp_update_post([
            'ID' => $post->ID,
            'post_status' => $old_status
        ]);
    }
}, 5, 3);

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

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

  • Измените статус товара в админке и проверьте, исчезает ли он.
  • Обновите страницу каталога и убедитесь, что товар отображается.
  • Проверьте логи сервера и debug.log на наличие ошибок.

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

  • Ошибка: Товар не меняет статус после внесения кода.
    Причина: Низкий приоритет хука или конфликт с другими обработчиками.
    Решение: Увеличьте приоритет, например, на 1 или 100.
  • Ошибка: Товар появляется, но не отображается на фронтенде.
    Причина: Фильтры pre_get_posts исключают нужный статус.
    Решение: Проверьте кастомные фильтры и уберите лишние условия.
  • Ошибка: После отключения плагина товары пропали.
    Причина: Плагин управлял видимостью, отключение изменило логику.
    Решение: Настройте плагин или замените его альтернативой.

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

  • Используйте child-тему для внесения изменений в functions.php, чтобы избежать потери кода при обновлениях.
  • Добавляйте логи в обработчики, чтобы отслеживать изменения статуса товаров:
error_log('Product ID ' . $post->ID . ' changed from ' . $old_status . ' to ' . $new_status);
  • Избегайте удаления товаров на основе автоматических условий без подтверждения, чтобы не потерять данные.
  • Регулярно делайте резервные копии базы данных перед изменениями, связанными со статусами и удалением.
Как отключить авторизацию через email в WordPress
26.03.2026
Как создать собственный виджет в WordPress
17.11.2025
WooCommerce: решение проблем с расчетом доставки по зонам
12.05.2026
Отправка формы в WordPress без перезагрузки страницы с помощью AJAX
21.12.2025
Оптимизация изображений в WordPress: автоматические решения для ускорения сайта
19.03.2026