Диагностика проблемы: почему нужно удалять старые вариации WooCommerce
В интернет-магазинах на WooCommerce часто появляются устаревшие вариации товаров, которые больше не используются или заменены новыми. Эти вариации занимают место в базе данных и на диске, особенно если к ним прикреплены изображения. Со временем это замедляет работу сайта и увеличивает затраты на хранение.
Признаки проблемы:
- Увеличение размера базы данных без видимых новых товаров.
- Наличие вариаций с пометкой «черновик», «удален» или неактивных в админке.
- Медиафайлы, связанные с неиспользуемыми вариациями, загромождают библиотеку.
Как проверить наличие старых вариаций и связанных медиа
Для проверки используйте SQL-запросы через phpMyAdmin или wp-cli:
-- Найти вариации товаров, которые неактивны или старше 180 дней (пример)<br>SELECT p.ID, p.post_date, p.post_status<br>FROM wp_posts p<br>WHERE p.post_type = 'product_variation'<br>AND (p.post_status = 'draft' OR p.post_status = 'trash' OR p.post_date < NOW() - INTERVAL 180 DAY);Для связанных медиафайлов можно проверить таблицу wp_postmeta с мета-ключом _thumbnail_id или другие связи:
SELECT pm.post_id, pm.meta_value AS attachment_id<br>FROM wp_postmeta pm<br>JOIN wp_posts p ON p.ID = pm.post_id<br>WHERE pm.meta_key = '_thumbnail_id'<br>AND p.post_type = 'product_variation'Пошаговое решение: автоматическое удаление вариаций и связанных медиа
1. Создаем функцию для удаления вариаций и их медиа
Этот код удалит вариации старше 180 дней вместе с прикрепленными картинками.
function delete_old_product_variations_with_media() {<br> $args = array(<br> 'post_type' => 'product_variation',<br> 'post_status' => array('publish', 'draft', 'private'),<br> 'date_query' => array(<br> array(<br> 'column' => 'post_date',<br> 'before' => '180 days ago',<br> ),<br> ),<br> 'posts_per_page' => -1,<br> 'fields' => 'ids',<br> );<br> $variations = get_posts($args);<br> if (empty($variations)) {<br> return;<br> }<br> foreach ($variations as $variation_id) {<br> // Получаем ID миниатюры вариации<br> $thumbnail_id = get_post_meta($variation_id, '_thumbnail_id', true);<br> // Удаляем миниатюру, если есть<br> if ($thumbnail_id) {<br> wp_delete_attachment($thumbnail_id, true);<br> }<br> // Удаляем все прикрепленные медиа к вариации<br> $attachments = get_children(array(<br> 'post_parent' => $variation_id,<br> 'post_type' => 'attachment',<br> 'posts_per_page' => -1,<br> 'fields' => 'ids',<br> ));<br> foreach ($attachments as $attachment_id) {<br> wp_delete_attachment($attachment_id, true);<br> }<br> // Удаляем вариацию<br> wp_delete_post($variation_id, true);<br> }<br>}2. Запускаем функцию по расписанию с помощью WP-Cron
Добавьте в functions.php или в свой плагин код для регистрации и запуска задачи:
if (!wp_next_scheduled('delete_old_variations_daily_event')) {<br> wp_schedule_event(time(), 'daily', 'delete_old_variations_daily_event');<br>}<br>add_action('delete_old_variations_daily_event', 'delete_old_product_variations_with_media');3. Ручной запуск для проверки
Для теста запустите функцию вручную из консоли WP-CLI или временно вызовите ее в админке:
delete_old_product_variations_with_media();Проверка результата после внедрения
- В админке WooCommerce проверьте, что в списке вариаций не осталось старых и неактивных.
- Проверьте размер папки uploads и базу данных на уменьшение.
- Убедитесь, что связанные изображения вариаций удалены из медиабиблиотеки.
- Если используете WP-CLI, выполните запросы из раздела диагностики повторно — они не должны возвращать старые вариации.
Частые ошибки и как их исправить
- Вариации не удаляются: Проверьте права пользователя, под которым запускается скрипт, и нет ли ограничений на удаление постов или вложений.
- Остались медиафайлы: Иногда вложения могут быть не связаны напрямую с вариацией. Дополнительно проверьте все прикрепленные файлы, используя
get_children(). - Проблемы с WP-Cron: Если cron-задача не запускается, установите реальный системный cron или вызовите
wp cron event run --due-nowвручную.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы и файлов.
- Для больших магазинов запускайте удаление частями, ограничивая количество вариаций за один проход (например,
'posts_per_page' => 50и пагинация). - Используйте
wp_delete_attachment($id, true)с параметромtrue, чтобы удалять файлы с диска, а не только записи в базе. - Добавьте логирование удалений в файл или базу для аудита.
- Для максимальной безопасности используйте capability проверки, если функция вызывается из интерфейса администратора.
Сравнение способов удаления старых вариаций
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин очистки WooCommerce | Простота использования, графический интерфейс | Может не удалять все связанные медиа, дополнительные плагины |
| Своя функция с WP-Cron (как в статье) | Гибкость, полное удаление, автоматизация | Требует навыков разработки, контроль cron |
| Ручное удаление через админку | Простота, не требует кода | Трудоемко, риск забыть удалить медиа |