Диагностика проблемы: почему нужно удалять старые вариации товаров WooCommerce
В WooCommerce при обновлении каталога или изменениях в ассортименте часто остаются устаревшие вариации товаров. Они не только загромождают базу данных, но и могут мешать корректному отображению товара на сайте, вызывать ошибки в API и замедлять работу магазина. Особенно ощутимо это на больших сайтах с сотнями и тысячами вариаций.
Проверить наличие таких вариаций можно через SQL-запрос или вручную в админке, но это долго и неудобно. Автоматизация очистки позволит поддерживать базу в порядке без постоянного ручного вмешательства.
Как настроить автоматическое удаление старых вариаций с помощью WP-Cron
1. Определяем критерии для удаления вариаций
Для начала нужно понять, какие вариации считать устаревшими. Например, варианты, которые:
- не были обновлены более 30 дней;
- не привязаны к активным товарам;
- имеют статус "trash" (удалены, но не очищены).
2. Реализация функции удаления
Добавим в functions.php вашей темы или в пользовательский плагин следующий код:
function wpmy_delete_old_product_variations() {
global $wpdb;
// Определяем дату 30 дней назад
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
// Получаем ID вариаций, которые не обновлялись более 30 дней и не в статусе publish
$variations = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'product_variation'
AND post_modified < %s
AND post_status != 'publish'",
$date_threshold
));
if (!empty($variations)) {
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true); // Полное удаление
}
}
}
3. Регистрация задачи WP-Cron
Добавляем расписание, чтобы функция запускалась, например, раз в сутки:
function wpmy_schedule_old_variations_cleanup() {
if (!wp_next_scheduled('wpmy_daily_variations_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpmy_daily_variations_cleanup');
}
}
add_action('wp', 'wpmy_schedule_old_variations_cleanup');
add_action('wpmy_daily_variations_cleanup', 'wpmy_delete_old_product_variations');
Проверка результата после внедрения
Чтобы убедиться, что скрипт работает:
- Запустите функцию вручную, вызвав
wpmy_delete_old_product_variations()из консоли WP-CLI или временно через вызов в коде. - Проверьте базу данных: вариации с устаревшей датой модификации и статусом, отличным от publish, должны быть удалены.
- Наблюдайте за логами сервера и debug.log на предмет ошибок.
- Через 24 часа проверьте, что WP-Cron сработал, например, с помощью плагина WP Crontrol.
Частые ошибки и как их исправить
- Функция не запускается по расписанию. Проверьте, активен ли WP-Cron (иногда он отключается в wp-config.php через
DISABLE_WP_CRON), и что на сайт заходят посетители — WP-Cron запускается по запросам. - Удаляются нужные вариации. Проверьте логику выбора вариаций, убедитесь, что дата сравнивается правильно и статус вариации соответствует условиям удаления.
- Скрипт тормозит сайт. При большом количестве вариаций разбейте удаление на партии, например, по 50 штук за один запуск, чтобы не создавать нагрузку.
Практические советы по безопасности и производительности
- Для защиты от случайного удаления добавьте дополнительную проверку: например, удаляйте только вариации с определённым мета-полем
_auto_delete, которое вы ставите вручную или через обновление. - Используйте транзакции базы данных, если планируете сложные операции.
- Логируйте удалённые ID вариаций в отдельный файл или опцию, чтобы можно было восстановить данные при необходимости.
- Если WP-Cron ненадёжен из-за низкой посещаемости сайта, настройте системный cron на сервере для вызова
wp-cron.php.
Сравнение способов автоматической очистки вариаций
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron с кастомной функцией | Гибкость, можно адаптировать под любые условия | Зависит от посещаемости сайта | Код из статьи |
| Плагины очистки WooCommerce | Простота установки, не требует кода | Меньшая гибкость, могут быть платными | WP Sweep, Advanced Database Cleaner |
| Ручное удаление через SQL или админку | Полный контроль | Риск ошибок, требует навыков | Запросы в phpMyAdmin |