Диагностика проблемы: почему важно удалять товары с нулевым остатком
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товары с нулевым остатком остаются в каталоге, что приводит к негативному опыту пользователей и может влиять на SEO. Автоматическое удаление таких товаров помогает поддерживать актуальность ассортимента и улучшать производительность сайта.
Пошаговое решение: автоматическое удаление товаров с нулевым остатком через WP-Cron
1. Создаем функцию для удаления товаров с нулевым остатком
Добавьте следующий код в functions.php вашей дочерней темы или в отдельный плагин:
function wpexperts_delete_out_of_stock_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock',
'value' => '0',
'compare' => '=',
'type' => 'NUMERIC'
]
],
'post_status' => 'publish',
'fields' => 'ids',
];
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $product_id) {
wp_trash_post($product_id); // Перемещаем товар в корзину
}
}
}2. Регистрируем событие WP-Cron для регулярного запуска
Добавьте в functions.php следующий код для создания еженедельного задания:
function wpexperts_schedule_delete_out_of_stock() {
if (!wp_next_scheduled('wpexperts_delete_out_of_stock_hook')) {
wp_schedule_event(time(), 'weekly', 'wpexperts_delete_out_of_stock_hook');
}
}
add_action('wp', 'wpexperts_schedule_delete_out_of_stock');
add_action('wpexperts_delete_out_of_stock_hook', 'wpexperts_delete_out_of_stock_products');3. Запуск задачи вручную для проверки
Для тестирования запустите функцию вручную, вызвав wpexperts_delete_out_of_stock_products(); в консоли отладки или временно добавив вызов в код и обновив сайт.
Проверка результата после внедрения
- Перейдите в WooCommerce → Товары и убедитесь, что товары с нулевым остатком перемещены в корзину.
- Проверьте логи сервера на предмет ошибок, связанных с WP-Cron (если есть).
- Для подтверждения выполнения WP-Cron можно использовать плагин Query Monitor или посмотреть событие в базе данных в таблице
wp_optionsв опцииcron.
Частые ошибки и как их исправить
- Товары не удаляются: Проверьте, что у товаров действительно есть мета-ключ
_stockи его значение равно '0'. Иногда WooCommerce может использовать другой способ хранения запасов. - WP-Cron не запускается: Убедитесь, что на сервере есть реальные HTTP-запросы к сайту, иначе WP-Cron не сработает. Для критичных задач лучше настроить системный cron.
- Удаляются не те товары: Проверьте параметры запроса
WP_Query, чтобы не затронуть товары с положительным остатком.
Практические советы по безопасности и производительности
- Удаление товаров лучше не делать слишком часто, чтобы не создавать нагрузку на базу данных. Оптимально — раз в неделю.
- Перед удалением товаров можно сделать резервную копию базы.
- Если хотите не удалять, а отключать товары с нулевым остатком, замените
wp_trash_postнаwp_update_post(['ID' => $product_id, 'post_status' => 'draft']). - Для больших магазинов рекомендуется выполнять удаление пачками, чтобы избежать таймаута PHP.
Сравнение вариантов удаления товаров с нулевым остатком
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + PHP код (описанный выше) | Не требует сторонних плагинов, гибкий, легко кастомизируется | Зависит от работы WP-Cron, требует базовых навыков PHP |
| Плагины автоматического управления запасами | Простой интерфейс, дополнительные функции | Может влиять на производительность, требует обновлений, потенциальные конфликты |
| Ручное удаление через админку | Просто и понятно | Трудозатратно и легко забыть |