WooCommerce: автоматическое удаление старого контента и вариаций товаров

Почему важно удалять старый контент и вариации в WooCommerce

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

Диагностика: как определить, что пора чистить магазин

  • Медленная загрузка страниц каталога и админки
  • Большой размер базы данных, особенно таблиц wp_posts и wp_postmeta
  • Наличие большого количества вариаций товаров, которые не продаются и не используются
  • Старые товары со статусом «черновик» или «удалён» остаются в базе
  • Пользовательские запросы или плагины, работающие с продуктами, тормозят из-за большого количества «мусора»

Шаги по реализации автоматического удаления старого контента и вариаций

1. Удаление старых товаров по дате последнего изменения или публикации

В WooCommerce товары — это записи типа product. Можно настроить cron-задачу, которая будет удалять товары, которые не обновлялись и не продавались более определённого срока.

function wc_delete_old_products() {
    global $wpdb;
    $days = 180; // удалять товары старше 180 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    // Получаем ID товаров, которые не обновлялись с указанной даты
    $product_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_modified < %s",
        $date_threshold
    ));

    if (!empty($product_ids)) {
        foreach ($product_ids as $product_id) {
            wp_trash_post($product_id); // перемещаем в корзину
            // или wp_delete_post($product_id, true); для полного удаления
        }
    }
}

// Регистрируем cron задачу
add_action('wc_delete_old_products_hook', 'wc_delete_old_products');

if (!wp_next_scheduled('wc_delete_old_products_hook')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_old_products_hook');
}

2. Автоматическое удаление вариаций без активных товаров

Вариации — дочерние записи с типом product_variation. Иногда они остаются в базе, если родительский товар был удалён некорректно.

function wc_delete_orphan_variations() {
    global $wpdb;

    // Получаем вариации без существующего родителя
    $variation_ids = $wpdb->get_col(
        "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.ID IS NULL OR parent.post_status = 'trash')"
    );

    if (!empty($variation_ids)) {
        foreach ($variation_ids as $variation_id) {
            wp_delete_post($variation_id, true);
        }
    }
}

add_action('wc_delete_orphan_variations_hook', 'wc_delete_orphan_variations');

if (!wp_next_scheduled('wc_delete_orphan_variations_hook')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_orphan_variations_hook');
}

3. Очистка метаданных и транзиентов после удаления

Удаление товаров и вариаций часто оставляет «мусор» в таблице wp_postmeta и транзиенты WooCommerce. Это нужно очистить отдельно.

function wc_cleanup_postmeta_and_transients() {
    global $wpdb;

    // Удаляем метаданные для несуществующих постов
    $wpdb->query(
        "DELETE pm FROM {$wpdb->postmeta} pm LEFT JOIN {$wpdb->posts} p ON pm.post_id = p.ID WHERE p.ID IS NULL"
    );

    // Удаляем транзиенты WooCommerce, которые обычно начинаются с '_wc_'
    $wpdb->query(
        "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient__wc_%' OR option_name LIKE '_transient_timeout__wc_%'"
    );
}

add_action('wc_cleanup_hook', 'wc_cleanup_postmeta_and_transients');

if (!wp_next_scheduled('wc_cleanup_hook')) {
    wp_schedule_event(time(), 'daily', 'wc_cleanup_hook');
}

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

  • Проверьте количество товаров и вариаций в админке WooCommerce до и после запуска скриптов. Количество устаревших записей должно уменьшиться.
  • Используйте SQL-запросы для контроля:
    SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product' AND post_modified < DATE_SUB(NOW(), INTERVAL 180 DAY); — должно возвращать 0 после удаления.
  • Выполните проверку на наличие вариаций без родителя:
    SELECT COUNT(*) FROM wp_posts p LEFT JOIN wp_posts parent ON p.post_parent = parent.ID WHERE p.post_type = 'product_variation' AND (parent.ID IS NULL OR parent.post_status = 'trash');
  • Проверьте размер таблиц базы данных до и после очистки — он должен уменьшиться.

Частые ошибки при автоматическом удалении товаров и вариаций

  • Удаление активных товаров: Неправильное условие даты или статуса приводит к удалению актуальных товаров. Всегда тестируйте на копии базы данных.
  • Потеря вариаций: Вариации могут быть удалены, если родитель временно в статусе «корзина» — лучше использовать полное удаление родителя.
  • Отсутствие резервных копий: Автоматизация удаления без бэкапа может привести к потере данных. Настройте регулярное резервное копирование.
  • Конфликты cron-задач: Несколько запланированных задач могут конфликтовать. Используйте уникальные хуки и проверяйте расписание.

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

  • Перед внедрением на рабочий сайт обязательно протестируйте скрипты на локальной копии или тестовом сервере.
  • Используйте транзакции или пакеты при удалении большого количества записей, чтобы не перегружать базу данных.
  • Отключайте WP-Cron и настраивайте системный cron для более стабильного выполнения задач.
  • Регулярно очищайте транзиенты WooCommerce, так как они могут занимать большое место и влиять на производительность.
  • Рассмотрите использование плагинов, например Clearfy Pro, для автоматизации оптимизации и чистки базы данных.

Сравнение подходов к удалению старого контента в WooCommerce

ПодходПреимуществаНедостатки
Ручное удаление через админкуПростота, контрольТрудоёмко, риск пропуска
Автоматизация через WP-Cron с кодомАвтоматизация, гибкостьТребует навыков, возможны ошибки
Использование плагинов (например Clearfy)Простота, дополнительные функцииПотенциальные конфликты, нагрузка
Как создать меню в WordPress с помощью хука wp_nav_menu_items
27.11.2025
Оптимизация базы данных WordPress: удаляем старые ревизии и ускоряем сайт
13.11.2025
Как удалить изменяемые поля в WordPress при удалении записи
06.01.2026
Как отключить автоматическое удаление старых изображений в медиабиблиотеке WordPress
26.03.2026
WooCommerce: автоматическое отключение способов оплаты при проблемах с интернет-соединением
24.06.2026