Диагностика проблемы с неактивными вариациями в WooCommerce
В магазинах на WooCommerce часто накапливаются вариации товаров, которые по разным причинам становятся неактивными (disabled, out of stock, скрытыми). Это приводит к раздуванию базы данных, снижению производительности и путанице в админке. Как понять, что вариации неактивны?
- В админке товара вариации не отображаются в каталоге, но остаются в базе.
- В отчетах и статистике есть лишние записи с вариациями, которые вы давно не продаёте.
- База данных растёт без видимой причины, особенно в таблицах
wp_postsиwp_postmeta.
Для проверки можно выполнить SQL-запрос, который покажет количество вариаций с meta_key _stock_status и значением outofstock или hidden:
SELECT COUNT(*) FROM wp_postmeta pm
JOIN wp_posts p ON p.ID = pm.post_id
WHERE pm.meta_key = '_stock_status' AND pm.meta_value IN ('outofstock', 'hidden')
AND p.post_type = 'product_variation';Пошаговое решение: автоматическое удаление неактивных вариаций
Реализуем функцию, которая будет запускаться по расписанию (cron) и удалять вариации товаров, которые:
- Имеют статус «product_variation».
- У которых в
_stock_statusуказаноoutofstockилиhidden. - Отсутствует активный заказ с этими вариациями.
Такой подход минимизирует риск удалить нужные варианты.
Код для удаления неактивных вариаций
function wpset_delete_inactive_variations() {
global $wpdb;
// Получаем ID вариаций с outofstock или hidden
$variations = $wpdb->get_col(
"SELECT p.ID FROM {$wpdb->posts} p
JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation'
AND pm.meta_key = '_stock_status'
AND pm.meta_value IN ('outofstock', 'hidden')"
);
if (empty($variations)) {
return;
}
foreach ($variations as $var_id) {
// Проверяем, есть ли активные заказы с этой вариацией
$orders = wc_get_orders(array(
'limit' => 1,
'status' => array('processing', 'completed', 'on-hold'),
'meta_key' => '_product_id',
'meta_value' => $var_id,
'meta_compare' => '='
));
if (empty($orders)) {
// Удаляем вариацию
wp_delete_post($var_id, true);
}
}
}
// Добавляем Cron событие при активации темы/плагина
function wpset_schedule_variation_cleanup() {
if (!wp_next_scheduled('wpset_variation_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wpset_variation_cleanup_hook');
}
}
add_action('wp', 'wpset_schedule_variation_cleanup');
// Хук для запуска функции
add_action('wpset_variation_cleanup_hook', 'wpset_delete_inactive_variations');Как запустить вручную для проверки
Для тестирования можно вызвать функцию напрямую в консоли WP-CLI или в файле functions.php:
wpset_delete_inactive_variations();После успешного теста удалите вызов, чтобы не запускать дублирующее действие.
Проверка результата
После запуска:
- В админке уберите фильтр по статусам вариаций и убедитесь, что неактивные записи исчезли.
- Повторите SQL-запрос из раздела диагностики — количество должно уменьшиться.
- Проверьте логи ошибок и убедитесь, что удаление прошло без сбоев.
Частые ошибки и как их исправить
- Удаляются нужные вариации: Проверьте фильтрацию заказов — функция ищет заказы с мета
_product_id, что не всегда корректно. Лучше искать по_variation_idв метаполях заказов. - Функция не запускается по расписанию: Проверьте, активен ли WP-Cron, нет ли конфликтов с другими плагинами, используйте плагин WP Crontrol для диагностики.
- Высокая нагрузка при удалении большого количества вариаций: Делайте удаление партиями, например по 20 штук за раз, с последующим отложенным вызовом через wp_schedule_single_event.
Практические советы для безопасности и производительности
- Перед автоматическим удалением обязательно создавайте резервные копии базы данных.
- Ограничьте удаление вариаций по дате их последнего обновления — например, не удаляйте вариации, которые были обновлены в последние 30 дней.
- Используйте WP-CLI для массового удаления, если база очень большая.
- Внедрите логирование удалений в отдельный файл для контроля действий.
Сравнение подходов удаления неактивных вариаций
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Удаление вручную через админку | Удалять вариации по одной через интерфейс WooCommerce | Безопасно, контроль на каждом шаге | Очень долго, неудобно при большом количестве |
| Автоматический скрипт с WP-Cron | Регулярное удаление неактивных вариаций с проверками | Автоматизация, экономия времени | Риск ошибок при недостаточной проверке, нагрузка на сервер |
| Плагины очистки базы | Использование готовых решений типа Clearfy Pro | Простота, дополнительные функции оптимизации | Могут быть платными, риск конфликтов |