Диагностика проблемы с неактивными вариациями в WooCommerce
В крупных интернет-магазинах на WooCommerce часто накапливаются неактивные вариации товаров, которые не продаются и не отображаются покупателям, но продолжают занимать место в базе данных. Это снижает производительность запросов, затрудняет управление товарами и замедляет админку.
Как понять, что у вас есть такая проблема:
- Много вариаций с атрибутом
_stock_status=outofstockили статусомprivate; - В админке WooCommerce в списке вариаций много скрытых или неактивных товаров;
- Заметно замедлена работа сайта при загрузке страниц с товарами или в админке;
- Базы данных WooCommerce заметно выросли без видимых причин.
Пошаговое решение: как автоматически удалять неактивные вариации
Для автоматического удаления неактивных вариаций создадим PHP-скрипт, который можно запускать вручную или через WP-Cron.
1. Критерии для удаления вариаций
- Вариация имеет статус
privateилиtrash; - Вариация отсутствует на складе более 30 дней;
- Вариация не имеет заказов за последние 90 дней (опционально).
2. Код для удаления неактивных вариаций
function wproot_delete_inactive_variations() {
global $wpdb;
// Определяем дату для фильтрации
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
// Получаем ID вариаций, которые не в наличии и без активности
$variations = $wpdb->get_results($wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm1 ON p.ID = pm1.post_id AND pm1.meta_key = '_stock_status' AND pm1.meta_value = 'outofstock'
WHERE p.post_type = 'product_variation'
AND p.post_status IN ('private', 'trash')
AND p.post_modified < %s",
$date_threshold
));
if(empty($variations)) {
return 'Нет неактивных вариаций для удаления';
}
foreach($variations as $variation) {
wp_delete_post($variation->ID, true); // Жесткое удаление
}
return count($variations) . ' неактивных вариаций удалено';
}3. Запуск процедуры через WP-Cron
Добавим задачу в планировщик, чтобы удалять неактивные вариации раз в неделю:
add_action('wproot_weekly_delete_variations', 'wproot_delete_inactive_variations');
if (!wp_next_scheduled('wproot_weekly_delete_variations')) {
wp_schedule_event(time(), 'weekly', 'wproot_weekly_delete_variations');
}Проверка результата после внедрения
Чтобы убедиться, что скрипт работает корректно:
- Выполните функцию вручную через
echo wproot_delete_inactive_variations();в отладчике или временно вfunctions.php; - Проверьте количество удалённых вариаций в ответе функции;
- Проверьте в админке WooCommerce список вариаций: неактивных станет меньше;
- Проверьте размер базы данных через phpMyAdmin или плагин оптимизации.
Частые ошибки и как их исправить
- Удаление рабочих вариаций: Неправильно заданные условия могут удалить активные товары. Всегда тестируйте на копии сайта и используйте фильтрацию по датам и статусам.
- Нет разрешений на wp_delete_post: Убедитесь, что используемый пользователь или скрипт имеет права на удаление.
- WP-Cron не срабатывает: Проверьте, что на сайте включён cron, или настройте системный cron для вызова
wp-cron.php. - Удалённые вариации возвращаются: Возможно, плагины или интеграции восстанавливают данные – проверьте сторонние процессы.
Практические советы по безопасности и производительности
- Перед удалением всегда делайте резервную копию базы данных.
- Для больших магазинов ограничивайте количество удаляемых вариаций за один запуск, чтобы избежать тайм-аутов:
function wproot_delete_inactive_variations_chunked($limit = 50) {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
$variations = $wpdb->get_results($wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm1 ON p.ID = pm1.post_id AND pm1.meta_key = '_stock_status' AND pm1.meta_value = 'outofstock'
WHERE p.post_type = 'product_variation'
AND p.post_status IN ('private', 'trash')
AND p.post_modified < %s
LIMIT %d",
$date_threshold, $limit
));
if(empty($variations)) {
return 'Нет неактивных вариаций для удаления';
}
foreach($variations as $variation) {
wp_delete_post($variation->ID, true);
}
return count($variations) . ' неактивных вариаций удалено';
}- Запускайте очистку в ночное время для минимального влияния на пользователей.
- Используйте плагин Clearfy Pro для дополнительной оптимизации WooCommerce и автоматической чистки базы (https://wpshop.ru/plugins/clearfy?utm_source=wproot.ru&utm_medium=article&utm_campaign=woocommerce-avto-udaleniye-neaktivnyh-varijacij-tovarov).
Сравнение вариантов удаления неактивных вариаций
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Ручное удаление в админке | Простота, визуальный контроль | Занимает много времени, неэффективно для больших магазинов | Для мелких магазинов, разовая чистка |
| Кастомный PHP-скрипт (как в статье) | Автоматизация, точные условия, гибкость | Требует базовых навыков разработки, возможны ошибки при некорректных условиях | Рекомендуется для разработчиков и опытных администраторов |
| Плагины оптимизации (например, Clearfy Pro) | Удобство, дополнительные функции, поддержка | Платные решения, возможные конфликты с другими плагинами | Для тех, кто хочет «под ключ» и минимум кода |