Диагностика проблемы: почему товары удаляются при смене статуса
В WooCommerce иногда возникает ситуация, когда при изменении статуса товара (например, с "черновика" на "опубликовано" или наоборот) товар неожиданно удаляется или становится недоступным. Это происходит не из коробки и обычно связано с кастомными хуками, плагинами оптимизации или ошибками в пользовательских скриптах. Для диагностики проблемы выполните следующие шаги:
- Отключите все сторонние плагины, особенно те, которые работают с товарами, статусами или оптимизацией базы данных.
- Переключитесь на стандартную тему WordPress, например Twenty Twenty-Two, чтобы исключить влияние темы.
- Включите WP_DEBUG и логирование ошибок в
wp-config.php:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);После изменения статуса товара проверьте файл wp-content/debug.log на наличие ошибок.
Пошаговое решение проблемы удаления товаров при смене статуса
1. Проверка кастомных хуков и функций
В первую очередь проверьте, нет ли в файлах темы или подключенных плагинах подобных функций, которые вызывают удаление товара:
add_action('save_post_product', 'custom_delete_product_on_status_change', 10, 3);
function custom_delete_product_on_status_change($post_ID, $post, $update) {
if ($post->post_status == 'trash') {
// Возможное удаление товара
wp_delete_post($post_ID, true);
}
}Если такие функции есть, временно отключите их или добавьте проверку, чтобы они не срабатывали без нужды.
2. Отключение плагинов оптимизации и очистки базы
Плагины типа Clearfy, WP-Optimize и другие могут иметь функции автоочистки, которые по ошибке удаляют товары с определённым статусом. Проверьте настройки этих плагинов:
- Исключите кастомные типы постов WooCommerce из автоматической очистки.
- Отключите автозапуск задач очистки на время тестирования.
3. Использование безопасного переключения статуса программно
Если смена статуса выполняется через код, используйте следующий шаблон, чтобы избежать побочных эффектов:
$product_id = 123;
$product_post = array(
'ID' => $product_id,
'post_status' => 'publish'
);
remove_action('save_post_product', 'custom_delete_product_on_status_change'); // временно отключаем опасный хук
wp_update_post($product_post);
add_action('save_post_product', 'custom_delete_product_on_status_change'); // возвращаем хукПроверка результата после внедрения решения
Для проверки:
- Перейдите в админку WooCommerce → Товары.
- Попробуйте изменить статус товара с «черновика» на «опубликовано» и обратно.
- Убедитесь, что товар остается в списке и не удаляется.
- Проверьте лог ошибок
wp-content/debug.logна отсутствие новых записей.
Частые ошибки и как их исправить
- Ошибка: Хук
save_post_productудаляет товар при каждом сохранении.
Исправление: Добавьте проверку статуса и условий, при которых удаление нужно выполнять. - Ошибка: Плагины очистки базы удаляют товары как мусор.
Исправление: Исключите тип записиproductиз очистки в настройках плагина. - Ошибка: Изменение статуса через сторонние плагины вызывает конфликт.
Исправление: Проверьте совместимость и отключите проблемный плагин.
Практические рекомендации по безопасности и производительности
- Регулярно делайте резервные копии базы данных перед массовыми изменениями товаров.
- Используйте транзакции в базе, если делаете массовые обновления через кастомные скрипты.
- Ограничьте права пользователей, которые могут менять статусы товаров, чтобы избежать случайного удаления.
- Для мониторинга изменений используйте плагины аудита, например WP Activity Log.
Сравнение способов решения проблемы удаления товаров
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Отключение проблемных хуков | Быстро, точечно | Требует понимания кода | Если виноваты кастомные функции |
| Настройка плагинов оптимизации | Универсально для нескольких проблем | Может снизить эффективность очистки | При использовании плагинов очистки |
| Программное обновление статуса | Контроль и безопасность | Сложнее реализовать для новичков | Автоматизация и массовое обновление |