Диагностика проблемы: зачем удалять старые вариации продуктов в WooCommerce
При ведении интернет-магазина на WooCommerce со временем накапливаются устаревшие вариации товаров, например, неактуальные размеры, цвета или модели. Они увеличивают нагрузку на базу данных, замедляют работу сайта и усложняют администрирование. Автоматическое удаление таких вариаций позволит поддерживать каталог в актуальном состоянии и повысить производительность.
Как определить, какие вариации считать старыми
Для автоматизации нам нужно понять, как отличить старые вариации от актуальных. Обычно критерии следующие:
- Вариации, не продававшиеся и не обновлявшиеся более 3 месяцев;
- Вариации, помеченные меткой или пользовательским полем (custom field) «устаревшая»;
- Вариации, не имеющие запасов на складе и не заказанные за последний год.
В зависимости от бизнес-логики выберите подходящий критерий.
Пошаговое решение: скрипт для удаления старых вариаций
Рассмотрим пример, как автоматически удалять вариации, не обновлявшиеся более 90 дней. Для этого создадим кастомную функцию и запустим её через WP-Cron.
1. Функция удаления вариаций
function wpb_delete_old_variations() {
global $wpdb;
$days = 90;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID вариаций, дата изменения которых меньше пороговой
$variation_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'product_variation'
AND post_modified < %s",
$date_threshold
));
if (!empty($variation_ids)) {
foreach ($variation_ids as $vid) {
wp_delete_post($vid, true); // Насильственное удаление без перемещения в корзину
}
}
}2. Планирование задачи с WP-Cron
if (!wp_next_scheduled('wpb_daily_variation_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpb_daily_variation_cleanup');
}
add_action('wpb_daily_variation_cleanup', 'wpb_delete_old_variations');Этот код запускает функцию очистки каждый день, удаляя вариации старше 90 дней.
Проверка результата после внедрения
Чтобы убедиться, что скрипт работает корректно:
- В админке WooCommerce проверьте список вариаций — старые должны исчезнуть.
- В таблице
wp_postsв базе данных SQL-запросомSELECT ID, post_title, post_type, post_modified FROM wp_posts WHERE post_type = 'product_variation' ORDER BY post_modified DESC LIMIT 10;проверьте даты последних вариаций. - Включите логирование в WordPress и добавьте
error_log()в функцию удаления для отслеживания удаляемых ID.
Частые ошибки и как их исправить
- Удаляются не те вариации: Проверьте правильность даты и критериев выборки. Используйте
post_modified, а неpost_date. - Скрипт не запускается автоматически: Убедитесь, что WP-Cron работает. Для этого вызовите
wp-cron.phpвручную или настройте системный cron. - Потеря данных: Всегда тестируйте на копии сайта и делайте резервные копии базы перед массовыми удалениями.
- Высокая нагрузка при удалении: Разбейте удаление на пакеты по 50-100 вариаций, чтобы избежать таймаутов.
Практические советы по безопасности и производительности
- Добавьте проверку прав пользователя, если планируете запускать функцию вручную через админку.
- Ограничьте количество удаляемых вариаций за один запуск, например, добавьте
LIMIT 100к запросу и используйте повторный запуск для полного удаления. - Для больших магазинов используйте WP-CLI для пакетного удаления, чтобы избежать ограничений PHP и HTTP.
- Логируйте удалённые ID в отдельный лог-файл для аудита.
Сравнение методов удаления старых вариаций
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке | Просто, не требует кода | Трудоемко при большом количестве вариаций |
| Скрипт с WP-Cron (код) | Автоматизация, гибкость, нет плагинов | Требуется написание и тестирование кода |
| Плагины очистки WooCommerce | Удобный интерфейс, поддержка | Нагрузка, возможные конфликты, лицензии |