Диагностика проблемы зависших вариантов товаров с нулевым запасом
В WooCommerce часто возникают ситуации, когда в базе остаются варианты товаров (вариации), у которых запас равен нулю, но они продолжают отображаться в админке и иногда на сайте. Это замедляет работу магазина и усложняет управление товарами. Как понять, что у вас именно эта проблема?
- Проверьте список товаров в админке WooCommerce, выбрав тип «Вариации» в фильтре товаров.
- Воспользуйтесь SQL-запросом, чтобы найти все вариации с нулевым или отрицательным запасом:
SELECT p.ID, pm.meta_value as stock_quantity FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation'
AND pm.meta_key = '_stock'
AND CAST(pm.meta_value AS SIGNED) <= 0;Если запрос возвращает много записей, значит у вас накопились «зависшие» варианты.
Пошаговое решение: автоматическое удаление зависших вариантов товаров
1. Создание функции для удаления вариантов с нулевым запасом
Добавьте в файл functions.php вашей темы или в отдельный плагин следующий код:
function wpexpert_delete_zero_stock_variations() {
$args = array(
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_stock',
'value' => '0',
'compare' => '=',
'type' => 'NUMERIC'
),
),
'fields' => 'ids',
);
$variations = get_posts($args);
if (!empty($variations)) {
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true); // true - удалить без возможности восстановления
}
}
}2. Планирование автоматического запуска с помощью WP-Cron
Чтобы автоматизировать процесс, добавим событие, которое будет запускать функцию, например, раз в сутки.
if (!wp_next_scheduled('wpexpert_daily_delete_zero_stock_variations')) {
wp_schedule_event(time(), 'daily', 'wpexpert_daily_delete_zero_stock_variations');
}
add_action('wpexpert_daily_delete_zero_stock_variations', 'wpexpert_delete_zero_stock_variations');3. Ручной запуск для проверки
Перед автоматизацией рекомендуем запустить функцию вручную, чтобы проверить корректность работы:
add_action('admin_init', function() {
if (current_user_can('manage_options') && isset($_GET['wpexpert_delete_variations'])) {
wpexpert_delete_zero_stock_variations();
echo '<div class="notice notice-success is-dismissible">Удаление зависших вариантов с нулевым запасом выполнено.</div>';
}
});После добавления этого кода в админке по адресу https://ваш-сайт/wp-admin/?wpexpert_delete_variations=1 выполнится удаление. Убедитесь, что вы обновили страницу после запуска и получили уведомление.
Проверка результата после внедрения
- Повторите SQL-запрос из раздела диагностики — количество вариантов с нулевым запасом должно быть равно нулю.
- Проверьте список вариаций в админке — удалённые варианты должны исчезнуть.
- Убедитесь, что автоматический запуск сработает на следующий день (можно проверить плагином WP Crontrol).
Частые ошибки и как их исправить
- Функция не удаляет варианты: Проверьте права пользователя, под которым выполняется код. WP-Cron запускается от имени системы, убедитесь, что нет ошибок в логах. Возможно, стоит добавить
error_logвнутри цикла для отладки. - Варианты удаляются, но остаются в базе: Используйте
wp_delete_post($variation_id, true);с параметромtrueдля принудительного удаления. - Функция запускается слишком часто: Проверьте, что событие WP-Cron регистрируется один раз — используйте условие
!wp_next_scheduled().
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Для больших магазинов с тысячами вариаций разделите удаление на части, чтобы избежать превышения времени выполнения. Например, добавьте параметр
posts_per_pageс лимитом и используйте пагинацию. - Используйте плагин Clearfy Pro для дополнительной оптимизации базы и удаления мусора, включая метаданные и устаревшие записи. Подробнее: https://wpshop.ru/plugins/clearfy
Сравнение способов удаления зависших вариантов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота; не требует кода | Не подходит для большого количества вариантов |
| SQL-запрос на удаление | Быстрое массовое удаление | Риск ошибок; требует доступа к базе |
| Автоматизация через WP-Cron и PHP | Автоматический контроль; безопаснее SQL | Требует навыков программирования |