Диагностика проблемы: почему товары исчезают из каталога 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);Это позволит отследить, когда и какой статус получает товар. Если после этого в логи появляется запись об удалении или товар исчезает сразу после смены статуса, значит срабатывает какой-то обработчик на этот хук.
Пошаговое решение: отключение автоматического удаления товаров при смене статуса
Самый надёжный способ — перехватить событие смены статуса и предотвратить удаление товара. Для этого выполните следующие шаги:
- Отключите подозрительные плагины один за другим, проверяя поведение товаров после каждой деактивации.
- Если причина в кастомном коде, найдите и закомментируйте функции, использующие хуки
before_delete_post,transition_post_statusили похожие. - Добавьте в
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 вместо удаления | Изменение логики вместо удаления | Сохраняет данные, безопасно для восстановления | Требует доп. обработки статусов |