Диагностика проблемы: почему товары исчезают при смене статуса
В WooCommerce иногда возникает ситуация, когда после изменения статуса товара (например, из "черновика" в "опубликовано" или наоборот) товар внезапно исчезает из каталога или админки. Это проявляется как будто товар был удалён, хотя на самом деле он не удаляется вручную.
Основные причины:
- Конфликт с плагинами, которые управляют видимостью товаров в зависимости от статуса.
- Кастомный код, работающий с хуками
save_post_productилиtransition_post_status, который удаляет товары при смене статуса. - Ошибочная логика в фильтрах вывода товаров (например, в
pre_get_posts), исключающая товары с определённым статусом.
Пошаговое решение: как отключить автоматическое удаление
1. Проверка плагинов
Отключите поочередно плагины, которые связаны с управлением товарами, кэшированием, оптимизацией.
Для отключения используйте WP-CLI или админку:
wp plugin deactivate plugin-slug2. Анализ кастомного кода
Проверьте в теме и в файлах 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);- Избегайте удаления товаров на основе автоматических условий без подтверждения, чтобы не потерять данные.
- Регулярно делайте резервные копии базы данных перед изменениями, связанными со статусами и удалением.