Диагностика проблемы: почему товары удаляются при изменении статуса
В WooCommerce иногда возникает ситуация, когда при смене статуса товара (например, с «черновика» на «опубликовано» или наоборот) товары неожиданно удаляются или становятся недоступны. Это не стандартное поведение WooCommerce, а чаще всего результат конфликтов с плагинами, кастомными функциями или ошибками в теме.
Для диагностики нужно проверить:
- Какие хуки и фильтры подключены к изменению статуса товаров.
- Активные плагины, которые могут автоматически очищать или удалять товары.
- Кастомный код в functions.php или в плагинах, который реагирует на смену статуса.
- Логи ошибок PHP и WooCommerce для выявления критических сбоев.
Использование отладочного режима WooCommerce
Включите режим отладки WooCommerce в wp-config.php:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);Это позволит записывать ошибки в файл wp-content/debug.log без вывода на экран.
Пошаговое решение проблемы с удалением товаров
1. Проверка кастомных хуков и фильтров
В functions.php или в плагинах найдите обработчики, связанные с изменением статуса товара, например:
add_action('woocommerce_product_set_stock_status', 'your_custom_function');
add_action('save_post_product', 'your_save_post_callback');Если в этих функциях есть код удаления или изменения статуса товара с удалением, временно уберите или закомментируйте его.
2. Отключение подозрительных плагинов
Отключите по очереди плагины, связанные с управлением товарами, кэшированием, очисткой базы данных (например, Clearfy Pro), чтобы найти виновника.
3. Корректное обновление статуса товара без удаления
Для безопасного обновления статуса товара используйте стандартный WooCommerce метод:
$product = wc_get_product( $product_id );
$product->set_status( 'publish' );
$product->save();Избегайте прямого удаления или изменения поста без вызова этих методов, чтобы не вызвать побочные эффекты.
4. Защита от случайного удаления
Добавьте фильтр, который отменяет удаление товара при смене статуса:
add_filter('wp_trash_post', function($post_id) {
$post = get_post($post_id);
if ($post->post_type === 'product') {
// Отмена удаления товара
return false;
}
return $post_id;
});Проверка результата после внедрения
- Измените статус товара в админке, проверьте, что он не удаляется.
- Проверьте список товаров в каталоге и в базе данных — все товары на месте.
- Убедитесь, что нет ошибок в
debug.log. - Проверьте работу фронтенда — товар отображается корректно.
Частые ошибки и как их исправить
- Ошибка: Использование
wp_delete_post()илиwp_trash_post()в хуках изменения статуса без проверки типа поста.
Решение: Добавлять условие по типу поста. - Ошибка: Конфликт плагинов очистки базы или оптимизации.
Решение: Исключить товары из автоматической очистки или отключить плагин. - Ошибка: Кастомный код, который неправильно обрабатывает смену статуса, например, удаляет метаданные и вызывает удаление товара.
Решение: Ревизия функций и тестирование по шагам.
Практические советы по безопасности и производительности
- Всегда тестируйте изменение статусов товаров на staging-сервере.
- Используйте стандартные методы WooCommerce для изменения статусов и управления товарами.
- Регулярно делайте бэкапы базы данных перед массовыми операциями.
- Избегайте использования плагинов очистки базы, которые не поддерживают WooCommerce, или настраивайте их с исключениями для товаров.
Сравнение вариантов решения
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Отключение подозрительных плагинов | Быстро выявляет источник проблемы | Может повлиять на функциональность сайта | Проверять на тестовом сайте |
| Исправление кастомного кода | Контролируемое решение, сохраняет кастомные функции | Требует навыков PHP и тестирования | Использовать для долгосрочного решения |
| Фильтры отмены удаления товаров | Простое временное решение | Не решает корень проблемы | Использовать как временную защиту |