WooCommerce: оптимальные настройки для очистки базы от старого кода и данных

Диагностика проблемы: как понять, что база WooCommerce нуждается в очистке

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

Основные признаки, что нужна оптимизация:

  • Длительная загрузка страниц товаров и заказов в админке;
  • Большой размер таблиц wp_posts и wp_postmeta, особенно с метками заказов;
  • Наличие заказов со статусами cancelled, failed, refunded за много месяцев назад;
  • Накопление множества вариаций товаров, которые не используются.

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

SELECT post_status, COUNT(ID) as count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Или проверить размер таблиц через PhpMyAdmin или WP-CLI.

Пошаговое решение: как автоматически удалять старые и неактивные данные WooCommerce

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

Добавим в functions.php вашей темы или в отдельный плагин следующий код для очистки заказов:

function wpcore_delete_old_orders() {
    global $wpdb;
    $statuses = array('cancelled', 'failed', 'refunded');
    $date_threshold = date('Y-m-d H:i:s', strtotime('-6 months'));

    foreach ($statuses as $status) {
        $orders = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
            'wc-' . $status,
            $date_threshold
        ));

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_trash_post($order_id); // Перемещаем в корзину
            }
        }
    }
}
add_action('wp_scheduled_delete', 'wpcore_delete_old_orders');

Этот хук запускается при автоматической очистке корзины WordPress, что позволяет не создавать отдельный cron.

2. Удаление неактивных вариаций товаров

Вариации, которые не привязаны к опубликованному товару или давно неактивны, можно удалить так:

function wpcore_delete_inactive_variations() {
    global $wpdb;

    // Получаем ID вариаций без родительского товара или с родителем в статусе 'trash'
    $variations = $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')");

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true); // Безвозвратно удаляем
    }
}
add_action('wp_scheduled_delete', 'wpcore_delete_inactive_variations');

3. Очистка метаданных и опций, связанных с удалёнными плагинами

Для удаления ненужных опций удобно использовать WP-CLI, например:

wp option delete plugin_option_name
wp transient delete --all
wp cache flush

Или вручную через SQL:

DELETE FROM wp_options WHERE option_name LIKE 'plugin_prefix_%';

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

Чтобы убедиться, что очистка сработала, выполните:

  • Проверьте количество заказов по статусам запросом из раздела диагностики;
  • Проверьте количество вариаций с помощью SQL:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation';
  • Сравните размер таблиц wp_posts и wp_postmeta до и после очистки;
  • Проверьте скорость загрузки страниц заказов в админке;
  • Просмотрите лог ошибок и убедитесь в отсутствии критичных ошибок.

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

  • Неправильные статусы заказов: иногда статусы могут отличаться, проверьте через wc_get_order_statuses() правильные ключи;
  • Удаление нужных заказов: убедитесь, что дата пороговая выставлена корректно, чтобы не удалить свежие заказы;
  • Проблемы с правами: код должен выполняться с правами администратора, иначе удаления не произойдет;
  • Потеря данных из-за необратимого удаления: используйте сначала wp_trash_post(), а не wp_delete_post(, true), чтобы иметь возможность восстановить;
  • Выполнение кода вне cron: добавьте вызов функций в стандартный хук wp_scheduled_delete или создайте собственный cron с помощью wp_schedule_event().

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

  • Не запускайте массовое удаление на живом сайте в пиковые часы — нагрузка на базу возрастёт;
  • Перед очисткой сделайте полную резервную копию базы данных;
  • Используйте пакетное удаление через wp_delete_post() с паузами или в циклах для снижения нагрузки;
  • Регулярно очищайте транзиенты и кэш, чтобы уменьшить размер базы;
  • Если не хотите писать код, рассмотрите Clearfy Pro — плагин для комплексной чистки и оптимизации WooCommerce и WordPress.

Сравнение подходов: плагин против кастомного кода

КритерийКастомный кодПлагин (Clearfy Pro)Компромисс
ГибкостьМаксимальная, под свои задачиОграничена функционаломДля сложных задач — код
Простота использованияТребует навыков PHPУдобный интерфейсПлагин для базовых задач
БезопасностьЗависит от качества кодаТестируется разработчикамиПроверять код самостоятельно
Поддержка и обновленияСвоя ответственностьОбновления и поддержкаЛучше плагин для долгосрочных проектов
WooCommerce: как автоматически удалять заказы по статусу и дате без плагинов
02.05.2026
Отзывы с автотрансляцией на сайт WordPress: практическое руководство
12.04.2026
Автоматическое удаление старых записей по метаданным в WordPress с помощью WPcore
28.12.2025
Как создать персонализированные типы записей в WordPress
10.11.2025
WooCommerce: как автоматически удалять неактивные вариации товаров
25.05.2026