Диагностика проблемы: зачем удалять неиспользуемые вариации в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются вариации товаров, которые перестали использоваться — например, после смены ассортимента или ошибок при импорте. Такие вариации занимают место в базе данных, замедляют загрузку страниц товара и усложняют администрирование.
Проверить наличие неиспользуемых вариаций можно с помощью SQL-запроса к базе или через плагины, но лучше — автоматизировать процесс удаления.
Как определить неиспользуемую вариацию
- Вариация не отображается в каталоге и не может быть выбрана на странице товара.
- У вариации нет продаж или просмотренных записей за длительное время.
- Она не связана с активными атрибутами товара.
Пошаговое решение: скрипт для автоматического удаления неиспользуемых вариаций
Рассмотрим пример кода, который удаляет вариации без продаж и без последних просмотров за последние 6 месяцев. Скрипт можно запускать вручную или через WP-Cron.
function wpturbo_remove_unused_variations() {
global $wpdb;
// Получаем ID вариаций, у которых нет заказов и которые не обновлялись более 180 дней
$date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
$query = $wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_id IN (
SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_itemmeta
WHERE meta_key = '_variation_id' AND meta_value = p.ID
)
WHERE p.post_type = 'product_variation'
AND oi.order_item_id IS NULL
AND p.post_modified < %s",
$date_threshold
);
$variation_ids = $wpdb->get_col($query);
if (empty($variation_ids)) {
error_log('No unused variations found for removal.');
return;
}
foreach ($variation_ids as $variation_id) {
wp_delete_post($variation_id, true); // принудительное удаление
error_log("Deleted unused variation ID: $variation_id");
}
}
// Для запуска вручную раскомментируйте
// wpturbo_remove_unused_variations();
// Для автоматизации через WP-Cron (один раз в неделю)
add_action('wpturbo_weekly_cleanup', 'wpturbo_remove_unused_variations');
if (!wp_next_scheduled('wpturbo_weekly_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wpturbo_weekly_cleanup');
}Объяснение кода
- Запрос ищет вариации без связанных заказов (через meta_key '_variation_id').
- Отбираются вариации, не обновлявшиеся более 180 дней (параметр можно менять).
- Удаление происходит с принудительным удалением из базы (без перемещения в корзину).
- Скрипт можно запускать вручную или назначить регулярный запуск через WP-Cron.
Проверка результата после внедрения
Чтобы убедиться, что решение работает, выполните следующие шаги:
- Запустите функцию
wpturbo_remove_unused_variations();вручную, например, через подключенный сниппет или в консоли WP-CLI. - Проверьте логи ошибок (error_log) на предмет сообщений об удалении вариаций.
- В админке WooCommerce проверьте, что неиспользуемые вариации исчезли.
- Сделайте резервную копию базы перед запуском и после сравните количество вариаций в таблице
wp_postsс типомproduct_variation.
Частые ошибки и их исправление
- Удаляются нужные вариации: Проверьте правильность условия в SQL-запросе, особенно дату и отсутствие заказов. Можно усложнить логику, добавив проверку активности атрибутов.
- Скрипт не запускается через WP-Cron: Убедитесь, что WP-Cron активен и работает (например, посетители сайта вызывают cron-задания) или используйте системный cron для вызова
wp-cron.php. - Высокая нагрузка при выполнении: Если вариаций много, разбейте запрос на части, например, по 50 записей за раз, чтобы не было таймаутов.
Практические советы по безопасности и производительности
- Бэкап базы данных: Перед массовым удалением делайте резервную копию.
- Логирование: Ведите лог удалений, чтобы отслеживать изменения.
- Проверка условий: Тестируйте скрипт на тестовом стенде перед продакшеном.
- Используйте WP-CLI: Для больших магазинов запуск через WP-CLI сократит нагрузку и ускорит процесс.
- Оптимизируйте запросы: Индексы по метаданным WooCommerce помогут ускорить выборку.
Сравнение методов удаления неиспользуемых вариаций
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление вручную через админку WooCommerce | Просто, без навыков кода | Долго, неудобно при большом количестве вариаций |
| Плагины для очистки вариаций | Автоматизация, GUI | Могут быть платными, влияют на производительность |
| Код на PHP с WP-Cron (описанный в статье) | Гибкость, автоматизация, контроль | Требует навыков, возможны ошибки без тестирования |