wphow.ru wordpress WPHow

WooCommerce: автоматическое удаление неиспользуемых вариаций продуктов через код

Что такое неиспользуемые вариации в WooCommerce и почему их нужно удалять

Вариации товаров в WooCommerce — это отдельные варианты продукта, например, разные цвета или размеры. Иногда в базе остаются неиспользуемые вариации, которые уже не нужны: они не связаны с активными товарами, не отображаются в каталоге, но занимают место в базе и могут замедлять сайт. Автоматическое удаление таких вариаций поможет очистить базу и улучшить производительность магазина.

Диагностика проблемы: как определить неиспользуемые вариации

Для начала нужно понять, какие вариации считаются «неиспользуемыми». Основные критерии:

  • Вариация не связана с существующим родительским продуктом (post_parent отсутствует или продукт удалён).
  • Вариация создана, но не опубликована или скрыта от каталога.
  • Вариация не имеет заказов или просмотров (опционально для более тонкой очистки).

Чтобы проверить наличие таких вариаций, выполните следующий SQL-запрос в базе данных (через phpMyAdmin или WP CLI):

SELECT p.ID, p.post_parent FROM wp_posts p WHERE p.post_type = 'product_variation' AND (p.post_parent NOT IN (SELECT ID FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish') OR p.post_status != 'publish');

Этот запрос выведет ID вариаций, которые либо принадлежат несуществующим товарам, либо неактивны.

Пошаговое решение: автоматизация удаления через WP-Cron и код

Реализуем функцию, которая будет запускаться периодически и удалять неиспользуемые вариации.

1. Создаём функцию удаления вариаций

function delete_unused_product_variations() {
    global $wpdb;
    // Получаем ID вариаций, не принадлежащих опубликованным товарам или неактивных
    $query = "
        SELECT p.ID FROM {$wpdb->posts} p
        LEFT JOIN {$wpdb->posts} parent ON p.post_parent = parent.ID
        WHERE p.post_type = 'product_variation'
        AND (parent.post_status != 'publish' OR parent.ID IS NULL OR p.post_status != 'publish')
    ";
    $variation_ids = $wpdb->get_col($query);

    if (empty($variation_ids)) {
        return;
    }

    foreach ($variation_ids as $variation_id) {
        wp_delete_post($variation_id, true); // Полное удаление вариации
    }
}

2. Регистрируем WP-Cron задачу для регулярного запуска

add_action('wp_delete_unused_variations_event', 'delete_unused_product_variations');

function schedule_variations_cleanup() {
    if (!wp_next_scheduled('wp_delete_unused_variations_event')) {
        wp_schedule_event(time(), 'daily', 'wp_delete_unused_variations_event');
    }
}
add_action('wp', 'schedule_variations_cleanup');

3. Очистка при деактивации темы или плагина

function clear_variations_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wp_delete_unused_variations_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wp_delete_unused_variations_event');
    }
}
add_action('switch_theme', 'clear_variations_cleanup_schedule');

Проверка результата после внедрения

Чтобы проверить, что функция работает корректно:

  1. Выполните SQL-запрос из раздела диагностики до запуска функции — запишите количество неиспользуемых вариаций.
  2. Вручную вызовите функцию delete_unused_product_variations() через консоль WP CLI или временно добавьте вызов в шаблон (например, на wp_footer для теста).
  3. Повторите SQL-запрос и убедитесь, что количество неиспользуемых вариаций уменьшилось или равно нулю.
  4. Проверьте, что активные вариации и товары остались без изменений.

Частые ошибки и как их исправить

  • Удаление активных вариаций: При неверной логике фильтрации можно удалить вариации, которые на самом деле используются. Проверьте корректность SQL-запроса, убедитесь, что родительский продукт имеет статус publish.
  • Функция не запускается по расписанию: WP-Cron зависит от посещений сайта. Для гарантированного запуска настройте системный cron на сервере с командой wget -q -O - https://ваш_сайт/wp-cron.php?doing_wp_cron >/dev/null 2>&1.
  • Большая нагрузка на базу при удалении: Если вариаций много, разбейте удаление на части. Добавьте пагинацию в запрос и удаляйте по 50-100 записей за раз.

Практические советы по безопасности и производительности

  • Резервное копирование: Перед автоматическим удалением сделайте резервную копию базы, чтобы избежать потери данных.
  • Логирование: Добавьте логирование удалённых вариаций для аудита, например, записывайте ID и дату удаления в файл или таблицу.
  • Оптимизация запросов: Используйте индексы в таблице wp_posts для post_parent и post_type, чтобы ускорить выборку.
  • Тестирование на staging-сайте: Запускайте код сначала на тестовом сервере, чтобы исключить ошибки в боевой базе.

Сравнение вариантов удаления неиспользуемых вариаций

СпособПлюсыМинусыКогда использовать
Ручное удаление через SQL-запросБыстро, без кодаРиск ошибок, требует знаний SQLОдноразовая очистка
Автоматизация через WP-Cron и PHPРегулярная очистка, меньше ошибок, интеграция с сайтомНагрузка при большом объёме, требует написания кодаПоддержка чистоты базы на постоянной основе
Плагины для оптимизации WooCommerceУдобство интерфейса, дополнительные функцииМогут влиять на производительность, платныеЕсли нужны комплексные инструменты
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙