Диагностика проблемы: как понять, что база 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 | Удобный интерфейс | Плагин для базовых задач |
| Безопасность | Зависит от качества кода | Тестируется разработчиками | Проверять код самостоятельно |
| Поддержка и обновления | Своя ответственность | Обновления и поддержка | Лучше плагин для долгосрочных проектов |