Диагностика проблемы с вариациями товаров в WooCommerce
При работе с WooCommerce магазинами часто накапливаются неиспользуемые вариации товаров — например, после изменений атрибутов или удаления родительских товаров. Это приводит к разрастанию базы данных и замедлению работы сайта. Чтобы обнаружить такие вариации, нужно проверить, есть ли в базе вариации, которые не связаны с активными товарами или имеют статус "черновик".
SELECT p.ID, p.post_status FROM wp_posts p
WHERE p.post_type = 'product_variation'
AND (p.post_parent NOT IN (SELECT ID FROM wp_posts WHERE post_type='product' AND post_status='publish')
OR p.post_status != 'publish');
Этот запрос покажет вариации, которые либо принадлежат неактивным товарам, либо сами не опубликованы. Если таких много — они реально мешают.
Пошаговое решение: автоматическое удаление неиспользуемых вариаций
Реализуем удаление через WP-CLI или хук, чтобы запускать задачу регулярно без плагинов.
Шаг 1. Подключение функции удаления
function wc_remove_unused_variations() {
global $wpdb;
// Получаем ID вариаций без активных родителей
$variations = $wpdb->get_col(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->posts} parent ON p.post_parent = parent.ID
WHERE p.post_type = 'product_variation'
AND (parent.post_status != 'publish' OR parent.ID IS NULL)"
);
if (empty($variations)) {
return 0; // Нет вариаций для удаления
}
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true);
}
return count($variations);
}
Шаг 2. Запуск функции по крону
Добавим задачу в WP-Cron, чтобы очистка происходила раз в сутки.
add_action('wc_daily_variation_cleanup', 'wc_remove_unused_variations');
if (!wp_next_scheduled('wc_daily_variation_cleanup')) {
wp_schedule_event(time(), 'daily', 'wc_daily_variation_cleanup');
}
Шаг 3. Ручной запуск для проверки
Чтобы проверить работу, вызовите функцию вручную в консоли WP-CLI:
wp eval 'echo wc_remove_unused_variations();'
Выводит количество удаленных вариаций.
Проверка результата после внедрения
- Повторите SQL-запрос из раздела диагностики — неиспользуемые вариации должны отсутствовать.
- Проверьте раздел «Все товары» в админке WooCommerce — вариации неактивных или удаленных товаров не должны отображаться.
- Запустите WP-CLI команду повторно — если возвращает 0, значит очистка отработала корректно.
Частые ошибки и как их исправить
- Удаляются нужные вариации: чаще всего из-за неправильного статуса родительского товара. Проверьте, что статусы товаров корректные и не переключайте статус товара на "черновик" без необходимости.
- Функция ничего не удаляет: возможно, вариации не относятся к неактивным товарам, или база не обновлена. Запустите повторный SQL-запрос для проверки.
- Проблемы с WP-Cron: WP-Cron срабатывает только при посещении сайта. Для надежности можно настроить системный cron на вызов wp-cron.php.
Практические советы по безопасности и производительности
- Удаление производится через
wp_delete_post($id, true)— это гарантирует полное удаление из базы и очистку связанных метаданных. - Не запускайте удаление на больших базах в пиковое время, чтобы избежать нагрузки.
- Резервируйте базу данных перед внедрением — особенно если используете код впервые.
- Для ускорения запросов убедитесь, что в таблице
wp_postsесть индексы поpost_parentиpost_status. - Для мониторинга добавьте логирование удаления в файл или в системный лог.
Сравнение подходов: плагин vs собственный код
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, WP Sweep, или специализированный WooCommerce Cleaner) | Простота использования, интерфейс, регулярные обновления | Может добавлять лишнюю нагрузку, не всегда гибок под задачи, сторонний код |
| Собственный код (как в статье) | Максимальный контроль, минимальная нагрузка, легко интегрируется в задачи сайта | Требует навыков, ответственность за поддержку и тестирование на стороне разработчика |