Диагностика проблемы с множеством старых вариантов товаров
В интернет-магазинах на WooCommerce со временем накапливаются варианты товаров (вариации), которые могут уже не использоваться или устарели. Это ведёт к увеличению объёма базы данных, замедлению работы админки и фронтенда, а также затрудняет управление товарами. Прежде чем приступать к удалению, важно проверить, действительно ли варианты не используются и не имеют заказов или связей.
Как проверить количество вариантов и их состояние в базе
Вариации товаров в WooCommerce хранятся как записи типа product_variation в таблице wp_posts. Основной товар — это родительская запись, а вариации — дочерние.
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation';Чтобы найти варианты, которые не связаны с активными товарами или не имеют заказов, можно использовать более сложные запросы, но сначала рекомендуем выгрузить список по ID товаров.
Пошаговое решение: удаление старых вариантов товаров через PHP
Для безопасного удаления вариантов без плагинов можно использовать PHP-скрипт, который:
- Ищет варианты старше заданного срока
- Проверяет, что варианты не связаны с активными заказами
- Удаляет варианты через функцию WooCommerce, чтобы очистить все метаданные
Пример кода для удаления вариантов старше 180 дней, не участвующих в заказах
function delete_old_unused_variations() {
global $wpdb;
// Получаем варианты старше 180 дней
$date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
$variations = $wpdb->get_results($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_date < %s",
$date_threshold
));
foreach ($variations as $variation) {
$variation_id = $variation->ID;
// Проверяем, есть ли заказы с этим вариантом
$order_items = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->prefix}woocommerce_order_itemmeta iom
JOIN {$wpdb->prefix}woocommerce_order_items oi ON iom.order_item_id = oi.order_item_id
WHERE iom.meta_key = '_variation_id' AND iom.meta_value = %d",
$variation_id
));
if (!$order_items) {
// Безопасное удаление варианта
wp_delete_post($variation_id, true);
}
}
}
// Запускаем один раз или через cron
add_action('init', 'delete_old_unused_variations');Запускать этот код рекомендуется один раз, например, временно добавив в файл functions.php темы или в отдельный плагин, затем удалить, чтобы не нагружать сайт.
Проверка результата после удаления вариантов
- Выполните повторный запрос в базу:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation';, чтобы убедиться, что количество вариантов уменьшилось. - Проверьте в админке WooCommerce: откройте товары с вариантами - старые варианты должны исчезнуть.
- Убедитесь, что на сайте нет ошибок при отображении товаров с вариациями.
Частые ошибки и как их исправить
- Удаление вариантов, связанных с заказами. Это может привести к ошибкам в истории заказов. Проверяйте связанные заказы по мета-ключу
_variation_id. - Потеря данных из-за неправильного удаления. Используйте
wp_delete_post()с параметромtrue, чтобы удалить все связанные метаданные. - Скрипт не запускается. Убедитесь, что код добавлен в правильное место и выполняется. Для теста можно добавить
error_log()внутри цикла.
Практические советы по безопасности и производительности
- Перед запуском скрипта обязательно сделайте бэкап базы данных.
- Для больших магазинов запускайте удаление пакетами по 50-100 вариантов, чтобы избежать таймаутов PHP.
- Можно использовать WP-Cron для автоматизации очистки, но лучше запускать вручную или через системный cron для надежности.
- Оптимизируйте таблицы базы данных после удаления:
OPTIMIZE TABLE wp_posts;
Сравнение вариантов удаления старых вариантов товаров
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Удаление через PHP скрипт (как в статье) | Полный контроль, без плагинов, можно автоматизировать | Требует навыков, риски при ошибках | Использовать с бэкапом, тестировать на стейджинге |
| Удаление через плагины (например, WP Bulk Delete) | Упрощает процесс, интерфейс | Дополнительная нагрузка, возможны конфликты | Подходит для новичков, проверять плагины на совместимость |
| Удаление вручную через админку WooCommerce | Полный контроль на уровне интерфейса | Очень долго для большого количества, риск пропуска | Подходит для единичных вариантов |