Диагностика проблемы: зачем удалять товары с нулевым остатком
В интернет-магазинах на WooCommerce часто накапливаются товары с нулевым остатком на складе. Эти товары не продаются, но продолжают отображаться в каталоге, что ухудшает пользовательский опыт и может замедлять сайт. Ручное удаление большого количества таких товаров неудобно и занимает много времени.
Автоматизация удаления таких товаров с помощью кода позволяет поддерживать базу магазина в актуальном состоянии и улучшить производительность.
Как проверить наличие товаров с нулевым остатком
Для начала убедитесь, что у вас есть товары с нулевым остатком. Для этого можно выполнить SQL-запрос к базе данных или использовать WP-CLI:
wp post list --post_type=product --meta_key=_stock --meta_value=0 --fields=ID,post_titleЭтот запрос выведет ID и названия товаров, у которых запас равен нулю. Если список пуст, удалять нечего.
Пошаговое решение: код для удаления товаров с нулевым остатком
Реализуем удаление товаров с помощью WP_Query и функции wp_delete_post(). Код можно добавить в файл functions.php вашей темы или создать отдельный плагин для безопасного выполнения.
function delete_zero_stock_products() {
// Параметры запроса: товары с мета-ключом '_stock' равным 0
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock',
'value' => '0',
'compare' => '=',
'type' => 'NUMERIC',
],
],
'fields' => 'ids', // Получаем только ID для оптимизации
];
$query = new WP_Query( $args );
if ( ! empty( $query->posts ) ) {
foreach ( $query->posts as $product_id ) {
// Удаляем товар без возможности восстановления (force delete)
wp_delete_post( $product_id, true );
}
}
}
// Запускаем функцию при инициализации (удалять вручную для безопасности)
// add_action( 'init', 'delete_zero_stock_products' );Важно: не запускайте функцию автоматически без проверки, чтобы не удалить нужные товары. Лучше вызвать её вручную через консоль WP-CLI или временно активировать хук.
Как запустить удаление вручную через WP-CLI
Создайте файл delete-zero-stock.php в корне сайта с кодом функции и добавьте в конец:
delete_zero_stock_products();Затем запустите:
wp eval-file delete-zero-stock.phpПосле выполнения удалите или переименуйте файл.
Проверка результата после внедрения
Чтобы убедиться, что товары удалены:
- Повторите команду WP-CLI для списка товаров с нулевым остатком — список должен быть пуст.
- Проверьте в админке WooCommerce раздел «Товары» — товары с нулевым остатком должны отсутствовать.
- Просмотрите фронтенд магазина, чтобы убедиться, что отсутствуют товары с нулевым запасом.
Частые ошибки и как их исправить
- Удаление не происходит: проверьте, что у пользователя, под которым запускается скрипт, есть права на удаление постов.
- Функция вызывается автоматически и удаляет товары без проверки: уберите хук или закомментируйте вызов функции, используйте ручной запуск.
- Нулевой запас указан в другом мета-ключе: в WooCommerce может использоваться мета-ключ
_stock_statusс значениемoutofstock. В этом случае измените запрос:
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
],
],Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед массовым удалением товаров.
- Для сайтов с большим количеством товаров разбивайте удаление на порции с помощью параметра
posts_per_pageи пагинации, чтобы избежать превышения лимита памяти или времени выполнения. - Отключайте функцию после её использования, чтобы случайно не удалить товары повторно.
- Если хотите автоматизировать процесс, задавайте расписание через WP-Cron с уведомлением администратора о количестве удалённых товаров.
Сравнение способов удаления товаров с нулевым остатком
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Ручное удаление через админку | Удаление товаров вручную в WooCommerce | Простота, не требует кода | Длительно, неудобно при большом количестве |
| WP-CLI | Использование командной строки для удаления | Быстро, подходит для большого объема | Требуется доступ к серверу и знания CLI |
| Код на PHP (WP_Query + wp_delete_post) | Автоматизация удаления через код | Гибко, можно запускать по расписанию | Риск ошибочного удаления, требует тестирования |