Диагностика проблемы отсутствующих товаров в WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товары заканчиваются на складе и становятся отсутствующими. Если таких товаров много, они захламляют каталог, ухудшают пользовательский опыт и снижают конверсию. Автоматическое удаление таких товаров поможет держать каталог в актуальном состоянии без ручного контроля.
Для диагностики проблемы проверьте, как WooCommerce обрабатывает статус «нет в наличии» и как долго отсутствующие товары остаются в базе. По умолчанию WooCommerce не удаляет отсутствующие товары — они просто помечаются статусом outofstock.
Проверьте наличие отсутствующих товаров через SQL-запрос к базе данных:
SELECT ID, post_title FROM wp_posts WHERE ID IN (SELECT post_id FROM wp_postmeta WHERE meta_key='_stock_status' AND meta_value='outofstock') AND post_type='product';Если таких товаров много и они не управляются вручную, стоит автоматизировать удаление.
Пошаговое решение: автоматическое удаление отсутствующих товаров
1. Создаем функцию для удаления товаров со статусом «нет в наличии» более заданного срока
В примере ниже товары, которые находятся в статусе outofstock более 30 дней, будут удалены из базы данных.
function wpmy_delete_old_outofstock_products() {
$days_threshold = 30; // количество дней отсутствия товара
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));
$args = array(
'post_type' => 'product',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => '_stock_status',
'value' => 'outofstock',
),
array(
'key' => '_stock_last_changed', // кастомное поле с датой изменения наличия
'value' => $date_threshold,
'compare' => '<=',
'type' => 'DATETIME',
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$products = get_posts($args);
foreach ($products as $product_id) {
wp_delete_post($product_id, true); // принудительное удаление без перемещения в корзину
}
}
// Добавляем запись в cron на ежедневное выполнение
if (!wp_next_scheduled('wpmy_daily_delete_outofstock_products')) {
wp_schedule_event(time(), 'daily', 'wpmy_daily_delete_outofstock_products');
}
add_action('wpmy_daily_delete_outofstock_products', 'wpmy_delete_old_outofstock_products');2. Обновляем дату последнего изменения статуса наличия товара
Для работы функции нужно отслеживать дату, когда товар стал отсутствовать. Добавим хук, который обновляет мета поле _stock_last_changed при смене статуса:
add_action('woocommerce_product_set_stock_status', function($product_id, $stock_status) {
if ($stock_status === 'outofstock') {
update_post_meta($product_id, '_stock_last_changed', current_time('mysql'));
} else {
delete_post_meta($product_id, '_stock_last_changed');
}
}, 10, 2);Проверка результата после внедрения
Чтобы проверить, что автоматическое удаление работает:
- Создайте тестовый товар и установите ему статус
outofstock. - Убедитесь, что мета поле
_stock_last_changedустановлено и содержит текущую дату. - Измените дату в базе данных на дату более 30 дней назад для теста.
- Запустите событие cron вручную, например, через плагин WP Crontrol или вызовите функцию напрямую.
- Проверьте, что товар удалился из каталога и базы данных.
Частые ошибки и способы их исправления
- Отсутствует мета поле
_stock_last_changed: функция удаления не сработает, если это поле не установлено. Обязательно добавьте хук для его обновления. - Запланированное событие cron не срабатывает: проверьте, работает ли системный cron WordPress, или используйте плагин WP Crontrol для диагностики и запуска событий вручную.
- Удаление не происходит из-за прав доступа: убедитесь, что у пользователя, под которым выполняется скрипт, есть права на удаление постов.
- Неправильный формат даты: убедитесь, что даты сравниваются в формате
Y-m-d H:i:sи с правильной временной зоной WordPress.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед внедрением автоматического удаления.
- Для больших магазинов с тысячами товаров используйте пагинацию при выборке товаров для удаления, чтобы избежать превышения лимитов памяти и времени выполнения.
- Используйте
wp_delete_post($id, true)для полного удаления, а не перемещения в корзину, чтобы не захламлять базу. - Ограничивайте права доступа к коду, добавляющему автоматизацию, чтобы предотвратить злоупотребления.
Сравнение вариантов автоматического удаления отсутствующих товаров
| Способ | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Простота, нет дополнительного кода | Затратно по времени, риск забыть |
| Плагин автоматизации | Удобство, готовое решение | Может нагружать сайт, не всегда бесплатно |
| Кодовое решение с wp-cron (как в статье) | Точный контроль, оптимизация под сайт | Требует навыков разработки, настройка cron |