Диагностика проблемы с вариациями в WooCommerce
С ростом ассортимента в WooCommerce база данных может существенно разрастаться за счет вариаций товаров. Особенно часто встречается ситуация, когда вариации устарели, неактивны или не продаются, но не удаляются автоматически. Это приводит к замедлению загрузки страниц, увеличению размера базы и усложнению управления товарным каталогом.
Типичные признаки проблемы:
- Долгая генерация страниц товаров с вариациями.
- Высокая нагрузка на базу данных и медленные запросы к таблице
wp_postsс типомproduct_variation. - Наличие большого количества вариаций без активности продаж или с пометкой «неактивно».
Как автоматически удалять вариации по условиям через PHP
Задача
Удалить из WooCommerce вариации товаров, которые не продавались более 6 месяцев и имеют статус «черновик» или «неактивный».
Пошаговое решение с кодом
Реализуем функцию, которая будет искать вариации по заданным критериям и удалять их программно. Для запуска используем WP-CLI или хук cron.
function wpmarket_delete_old_variations() {
global $wpdb;
// Получаем ID вариаций, которые не продавались более 180 дней и в статусе draft или pending
$threshold_date = date('Y-m-d H:i:s', strtotime('-180 days'));
$variations = $wpdb->get_col($wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.ID
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id AND oim.meta_key = '_product_id'
WHERE p.post_type = 'product_variation'
AND p.post_status IN ('draft', 'pending')
AND (p.post_date < %s)
GROUP BY p.ID
HAVING MAX(oim.meta_value) IS NULL",
$threshold_date
));
if (empty($variations)) {
return 0;
}
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true); // Удаление без корзины
}
return count($variations);
}
// Пример запуска вручную
add_action('admin_init', function() {
if (isset($_GET['delete_old_variations'])) {
$deleted = wpmarket_delete_old_variations();
echo 'Удалено вариаций: ' . $deleted;
exit;
}
});
Объяснение
- Функция ищет вариации с типом
product_variationи статусомdraftилиpending. - Отбираются вариации, у которых дата создания старше 180 дней.
- Проверяется отсутствие продаж (через связь с заказами и мета-данными). Если продаж нет, вариация удаляется.
- Удаление происходит без помещения в корзину (безвозвратно) для очистки базы.
Проверка результата после внедрения
- Перейдите в админку WooCommerce > Товары > Вариации и убедитесь, что по условию удалены старые вариации.
- Выполните запрос к базе, например, через phpMyAdmin или WP-CLI:
Число должно уменьшиться после запуска скрипта.SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND post_date < NOW() - INTERVAL 180 DAY AND post_status IN ('draft', 'pending'); - Запустите скрипт с параметром
?delete_old_variations=1в URL админки для однократного удаления.
Частые ошибки и как их исправить
- Неправильный SQL-запрос: отсутствие корректного соединения таблиц заказов и мета-данных может привести к неверному определению вариаций без продаж. Проверьте таблицы
woocommerce_order_itemsиwoocommerce_order_itemmeta. - Удаление нужных вариаций: если условия заданы некорректно, можно удалить активные вариации. Рекомендуется сначала вывести список ID, а не удалять, и проверить вручную.
- Отсутствие прав: функция должна запускаться с правами администратора, иначе
wp_delete_postвернет ошибку. - Кеширование: если используется объектный кеш или плагины кеширования, после удаления вариаций может отображаться устаревшая информация. Очистите кеш после выполнения.
Практические советы по безопасности и производительности
- Запускайте удаление в ночное время или через WP-CLI для снижения нагрузки на сайт.
- Перед массовым удалением сделайте полный бэкап базы данных.
- Используйте транзакции базы данных, если планируете расширять логику, чтобы избежать частичных удалений.
- Оптимизируйте таблицы после удаления:
OPTIMIZE TABLE wp_posts; - Для удобства автоматизации интегрируйте функцию в WP-Cron с ограничением по времени и количеству удалений за раз.
Сравнение способов удаления вариаций: плагин vs код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, Bulk Delete) | Удобный интерфейс, не требует кода, можно настроить фильтры | Менее гибкий, может не учитывать все условия, дополнительная нагрузка |
| Собственный PHP-скрипт | Полный контроль, можно настроить точные условия, автоматизация через cron | Требует навыков программирования, риск ошибок без тестирования |
Чек-лист для внедрения автоматического удаления вариаций
- Определить критерии удаления (статус, дата, продажи)
- Написать и протестировать функцию удаления на тестовом сайте
- Проверить права пользователя для выполнения удаления
- Запустить функцию через WP-CLI или cron-задание
- Очистить кеш сайта и проверить результат
- Сделать бэкапы перед запуском на живом сайте