Проблема: накопление неактивных вариаций в WooCommerce
В WooCommerce при большом количестве товаров с вариациями часто остаются неиспользуемые или отключённые вариации, которые не удаляются автоматически. Это приводит к росту размера базы данных, замедлению загрузки страниц и усложнению управления товарами.
Диагностика проблемы
- Проверить количество вариаций товаров через админку WooCommerce — в разделе «Товары» фильтровать по типу «Вариация».
- Оценить размер таблиц
wp_postsиwp_postmetaв базе данных, связанных с вариациями. - Использовать SQL-запрос для выявления неактивных вариаций:
SELECT ID, post_title, post_status FROM wp_posts WHERE post_type = 'product_variation' AND post_status = 'trash';или для вариаций со статусом draft и pending.
Пошаговое решение: автоматизация удаления неактивных вариаций
Реализуем WP-Cron задачу, которая еженедельно автоматически удаляет вариации с определёнными статусами (trash, draft, pending).
1. Добавляем функцию удаления неактивных вариаций
function wproot_delete_inactive_variations() {
global $wpdb;
$statuses = ['trash', 'draft', 'pending'];
foreach ($statuses as $status) {
$variations = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_status = %s",
'product_variation', $status
));
if (!empty($variations)) {
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true); // Без возможности восстановления
}
}
}
}2. Регистрируем WP-Cron задачу
add_action('wproot_delete_inactive_variations_hook', 'wproot_delete_inactive_variations');
function wproot_schedule_inactive_variations_deletion() {
if (!wp_next_scheduled('wproot_delete_inactive_variations_hook')) {
wp_schedule_event(time(), 'weekly', 'wproot_delete_inactive_variations_hook');
}
}
add_action('wp', 'wproot_schedule_inactive_variations_deletion');3. Как запустить вручную для проверки
add_action('admin_init', function() {
if (current_user_can('manage_woocommerce') && isset($_GET['run_inactive_variations_deletion'])) {
wproot_delete_inactive_variations();
wp_redirect(remove_query_arg('run_inactive_variations_deletion'));
exit;
}
});Для запуска вручную достаточно перейти по адресу https://example.com/wp-admin/?run_inactive_variations_deletion=1 (замените example.com на ваш домен).
Проверка результата после внедрения
- Перейдите в раздел «Товары» — убедитесь, что неактивные вариации исчезли.
- Выполните SQL-запрос из раздела диагностики — записи с указанными статусами должны отсутствовать.
- Проверьте размер базы данных и время загрузки страниц с товарами — они должны улучшиться.
Частые ошибки и их исправление
- Задача WP-Cron не срабатывает: убедитесь, что на сайте есть посещения, или настройте системный cron для wp-cron.php.
- Удаляются нужные вариации: проверьте, что в функции фильтруются только статусы
trash,draftиpending, а неpublish. - Неправильные права доступа: функция запускается только для пользователей с правами
manage_woocommerce.
Практические советы по безопасности и производительности
- Всегда используйте
wp_delete_post($id, true)с параметромtrueдля полного удаления, чтобы не оставлять мусор в базе. - Резервное копирование базы перед внедрением автоматических удалений — критично для предотвращения потери данных.
- Для больших баз данных оптимизируйте запросы с помощью индексов и планируйте удаление в ночное время, чтобы не нагружать сервер.
- Используйте плагины вроде Clearfy Pro для дополнительно автоматизации и очистки базы без лишнего кода.
Сравнение методов очистки неактивных вариаций
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Много времени, риск пропуска | Небольшое количество вариаций |
| Автоматизация через WP-Cron и код | Быстро, без участия человека | Требует базовых знаний разработки | Средние и большие магазины |
| Использование плагина Clearfy Pro | Доп. функции, безопасность | Платный плагин | Оптимизация и комплексная очистка |