Диагностика проблемы: почему товары удаляются при смене статуса
В 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 | Блокировка удаления товаров программно | Надёжно предотвращает удаление | Не решает причину, только симптом |
| Исправление кастомного кода | Корректировка логики обновления статусов | Правильное и долгосрочное решение | Требует навыков разработки |