Диагностика проблемы: зачем удалять товары без склада
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товары, у которых закончился склад, остаются в каталоге и видны покупателям. Это приводит к негативному опыту, так как клиент может добавить товар в корзину, а затем узнать, что его нет в наличии. Кроме того, большое количество товаров без остатка влияет на SEO и производительность сайта.
Подходы к решению задачи
Существует несколько способов автоматически удалять товары без склада из каталога WooCommerce:
- Ручное удаление — неудобно и неэффективно при большом количестве товаров.
- Использование готовых плагинов — может добавить избыточный функционал и нагрузку.
- Реализация кастомного кода, который на основе хука запускает проверку и удаляет товары без остатков.
В этой статье рассмотрим именно последний метод с примером рабочего кода.
Пошаговое решение: реализация автоматического удаления товаров без склада
1. Создание функции для удаления товаров с нулевым остатком
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wc_remove_out_of_stock_products() {
// Параметры запроса для получения товаров без остатка
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'fields' => 'ids',
'meta_query' => array(
array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '='
)
),
'post_status' => 'publish'
);
$products = get_posts($args);
if (!empty($products)) {
foreach ($products as $product_id) {
wp_trash_post($product_id); // Отправляем товар в корзину
}
}
}2. Запуск функции по расписанию через WP-Cron
Чтобы удалять товары регулярно (например, ежедневно), зарегистрируем событие и повесим на него функцию:
// Регистрируем событие при активации темы/плагина
function wc_schedule_product_cleanup() {
if (!wp_next_scheduled('wc_daily_product_cleanup')) {
wp_schedule_event(time(), 'daily', 'wc_daily_product_cleanup');
}
}
add_action('wp', 'wc_schedule_product_cleanup');
// Обработчик события
add_action('wc_daily_product_cleanup', 'wc_remove_out_of_stock_products');
// Очистка расписания при деактивации
function wc_clear_product_cleanup_schedule() {
$timestamp = wp_next_scheduled('wc_daily_product_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_daily_product_cleanup');
}
}3. Дополнительная проверка: удалять только простые товары или все типы
По умолчанию код удалит все товары с мета _stock_status = outofstock. Если нужно исключить вариации или определённые типы товаров, добавьте параметр post_type с нужными значениями. Например, чтобы исключить вариации:
'post_type' => 'product', // без 'product_variation'Проверка результата после внедрения
- После добавления кода и активации WP-Cron, проверьте через админку WooCommerce - раздел «Товары», что товары без склада перемещаются в корзину (Статус «Корзина»).
- Для теста можно запустить функцию вручную через консоль WP-CLI:
wp eval 'wc_remove_out_of_stock_products();' - Также проверьте в базе данных таблицу
wp_posts, что статус записей у удалённых товаров изменён наtrash.
Частые ошибки и как их исправить
- Функция не запускается автоматически: проверьте, работает ли WP-Cron на вашем хостинге (например, запустите
wp cron event listчерез WP-CLI). Если нет — настройте системный cron для вызоваwp-cron.php. - Некорректное удаление вариаций: убедитесь, что в запросе
post_typeуказан правильно, чтобы не удалить нужные элементы. - Товары не удаляются, хотя статус
outofstock: проверьте, что все товары обновлены и мета_stock_statusсоответствует текущему состоянию. Иногда WooCommerce кеширует эту информацию.
Практические советы по безопасности и производительности
- Перед массовым удалением товаров всегда делайте резервную копию базы данных.
- Для больших магазинов с тысячами товаров используйте постраничный запрос с
posts_per_pageи batch-обработку, чтобы избежать таймаута. - Чтобы избежать негативного влияния на SEO, вместо удаления можно рассмотреть перевод товаров в статус
черновикили использование плагина Clearfy Pro для управления видимостью. - Для контроля процесса добавьте логирование удалённых товаров в файл или таблицу.
Сравнение вариантов реализации удаления товаров без склада
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление | Простота, контроль | Трудозатратно, неэффективно при большом каталоге |
| Готовый плагин | Быстрое решение, дополнительные функции | Может замедлить сайт, избыточные возможности |
| Кастомный код (описанный) | Лёгкий, точечный, без лишнего кода | Нужны базовые навыки разработки, требует тестирования |