Диагностика проблемы: зачем удалять старые вариативные товары
В интернет-магазинах на WooCommerce часто появляются вариативные товары, которые со временем становятся неактуальными — устаревшие коллекции, сезонные позиции или пробные варианты. Их накопление негативно влияет на производительность сайта, увеличивает размер базы данных и затрудняет управление каталогом.
Если не удалять такие товары вручную, база данных «раздувается», поисковые запросы медленнее обрабатываются, а клиенты могут столкнуться с устаревшими вариантами в каталоге.
Как определить старые вариативные товары в WooCommerce
В WooCommerce вариативные товары — это дочерние товары с типом product_variation, у которых есть дата создания (post_date). Для автоматизации удаления необходимо задать критерий «старости», например, товары, не обновлявшиеся и не продававшиеся более 180 дней.
Основной параметр для фильтрации:
post_type = 'product_variation'- Дата создания или последнего изменения (
post_modified) старше 180 дней
Пошаговое решение: настройка WP-Cron для удаления старых вариаций
Шаг 1. Создаём функцию удаления старых вариативных товаров
function wpcommunity_delete_old_variations() {
global $wpdb;
$days = 180; // Порог в днях
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID вариативных товаров старше threshold
$old_variations = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_modified < %s",
$date_threshold
));
if (!empty($old_variations)) {
foreach ($old_variations as $variation_id) {
wp_delete_post($variation_id, true); // Полное удаление
}
}
}Шаг 2. Регистрируем событие WP-Cron
function wpcommunity_schedule_variation_cleanup() {
if (!wp_next_scheduled('wpcommunity_variation_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wpcommunity_variation_cleanup_hook');
}
}
add_action('wp', 'wpcommunity_schedule_variation_cleanup');
add_action('wpcommunity_variation_cleanup_hook', 'wpcommunity_delete_old_variations');Шаг 3. Очистка при деактивации плагина/темы
function wpcommunity_clear_scheduled_variation_cleanup() {
$timestamp = wp_next_scheduled('wpcommunity_variation_cleanup_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpcommunity_variation_cleanup_hook');
}
}
register_deactivation_hook(__FILE__, 'wpcommunity_clear_scheduled_variation_cleanup');Проверка результата после внедрения
- Выполните вручную функцию
wpcommunity_delete_old_variations()из консоли WP-CLI или временно вызвав её в шаблоне, чтобы убедиться, что старые вариации удаляются. - Проверьте таблицу
wp_postsна наличие записей сpost_type = 'product_variation'и датой < 180 дней: они должны исчезать после запуска cron. - Для отладки используйте логирование — добавьте
error_log('Deleted variation ID: '.$variation_id);внутри цикла удаления. - Проверьте фронтенд магазина, чтобы убедиться, что удалённые вариации не отображаются в списках товаров и на страницах вариаций.
Частые ошибки и как исправить
- Планировщик не запускается: WP-Cron зависит от посещений сайта. Для теста выполните
wget -q -O - https://example.com/wp-cron.php?doing_wp_cronили настройте системный cron. - Удаление не происходит из-за прав: убедитесь, что функция вызывается с правами администратора или через WP-Cron, а не напрямую без авторизации.
- Удаляются не все старые вариации: проверьте правильность даты в
post_modifiedи используйтеpost_dateв запросе, если требуется. - Потеря данных: используйте
wp_delete_post($id, true)для полного удаления, иначе записи попадут в корзину.
Практические советы по безопасности и производительности
- Запускайте удаление один раз в день, чтобы снизить нагрузку.
- Перед удалением создавайте резервную копию базы данных (например, с помощью плагина Clearfy Pro: https://wpshop.ru/plugins/clearfy).
- Добавьте логирование для мониторинга и отладки процесса.
- Если магазин большой, разбивайте удаление на пачки по 50-100 товаров, чтобы избежать таймаутов.
Сравнение подходов удаления старых вариативных товаров
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Ручное удаление | Удаление через админку WooCommerce | Простота, контроль | Непрактично для большого объёма, трудозатратно |
| WP-Cron с кастомной функцией | Автоматическое удаление по расписанию | Автоматизация, снижение нагрузки | Зависит от WP-Cron, требует тестирования |
| Плагин для очистки базы | Сторонние решения с графическим интерфейсом | Удобство, дополнительные функции | Может влиять на производительность, требует доверия к разработчику |