Проблема отсутствующих товаров в WooCommerce
При ведении интернет-магазина на WooCommerce часто возникает ситуация, когда товары перестают быть доступными: они могут быть временно распроданы, сняты с производства или более не поддерживаются. Если таких товаров много, вручную их удалять неудобно, а наличие отсутствующих позиций в каталоге ухудшает UX и может привести к потерям продаж.
Автоматизация удаления таких товаров поможет поддерживать каталог в актуальном состоянии без ручного вмешательства.
Диагностика: как определить отсутствующие товары в WooCommerce
Отсутствующие товары обычно:
- имеют статус «черновик» или «в ожидании»;
- имеют нулевой или отрицательный остаток на складе (если включено управление запасами);
- отмечены определенной пользовательской меткой или категорией «out-of-stock».
Для простоты примера рассмотрим вариант, когда товары с запасом 0 и статусом «publish» считаются отсутствующими.
Пошаговое решение: скрипт для автоматического удаления отсутствующих товаров
1. Создаем функцию удаления товаров с нулевым запасом
function wporder_remove_out_of_stock_products() {
// Получаем ID товаров с запасом 0
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_stock',
'value' => 0,
'compare' => '=',
'type' => 'NUMERIC'
),
),
'post_status' => 'publish'
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
wp_delete_post(get_the_ID(), true); // жесткое удаление
}
}
wp_reset_postdata();
}
2. Добавляем запуск функции по расписанию (пример: раз в сутки)
if (!wp_next_scheduled('wporder_daily_remove_out_of_stock')) {
wp_schedule_event(time(), 'daily', 'wporder_daily_remove_out_of_stock');
}
add_action('wporder_daily_remove_out_of_stock', 'wporder_remove_out_of_stock_products');
3. Альтернативный вариант: добавление кнопки в админку для ручного запуска
add_action('admin_menu', function() {
add_submenu_page(
'woocommerce',
'Удалить отсутствующие товары',
'Удалить отсутствующие',
'manage_woocommerce',
'wporder-remove-out-of-stock',
function() {
if (isset($_POST['wporder_remove'])) {
wporder_remove_out_of_stock_products();
echo '<div class="updated notice">Отсутствующие товары удалены.</div>';
}
echo '<form method="post"><input type="submit" name="wporder_remove" class="button button-primary" value="Удалить отсутствующие товары" /></form>';
}
);
});
Проверка результата
- Перейдите в раздел «Товары» админки WooCommerce и примените фильтр по запасу (если есть).
- Убедитесь, что товары с запасом 0 удалены.
- Проверьте логи сайта на предмет ошибок при выполнении скрипта.
- Если используется cron-задача, убедитесь, что она срабатывает (используйте плагин WP Crontrol).
Частые ошибки и их исправление
- Товары не удаляются: проверьте, что функция запускается (например, через admin_menu). Возможно, cron-задача не активирована.
- Удаляются нужные товары: уточните условие выборки, возможно, нужно добавить проверку категории или статуса.
- Проблемы с производительностью: если товаров много, разбейте удаление на порции, используйте WP CLI.
- Ошибки доступа: убедитесь, что пользователь имеет права
manage_woocommerceдля запуска функции.
Практические советы по безопасности и производительности
- Используйте
wp_delete_postс параметромtrueдля полного удаления, не оставляя в корзине. - Добавьте проверку nonce и capability для ручного запуска из админки.
- Для крупных магазинов используйте WP CLI для пакетного удаления товаров.
- Регулярно создавайте резервные копии базы данных перед массовыми операциями.
- Если используется кастомное управление запасами, адаптируйте метаполя в запросе.
Сравнение способов удаления отсутствующих товаров
| Метод | Преимущества | Недостатки | Рекомендации |
|---|---|---|---|
| WP Cron автоматический | Автоматизация без участия пользователя | Зависит от посещаемости сайта, возможна задержка | Для средних и небольших магазинов |
| Ручной запуск из админки | Контроль запуска, мгновенный результат | Нужно время и внимание администратора | Для небольших магазинов или тестирования |
| WP CLI | Высокая производительность, подходит для больших магазинов | Требуется доступ к серверу через SSH | Для крупных проектов с большим количеством товаров |