Проблема: накопление неактивных вариаций в WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда в базе накапливается множество неактивных вариаций товаров — например, снятых с производства размеров или цветов. Они не отображаются на сайте, но занимают место в базе и могут замедлять работу админки и импорт/экспорт. Автоматизация удаления таких вариаций поможет поддерживать базу в чистоте без ручного вмешательства.
Как диагностировать наличие неактивных вариаций
Для начала проверим, сколько вариаций товаров с мета-данными статуса "неактивно" или с признаком скрытия от каталога. В WooCommerce вариации — это дочерние записи типа product_variation. Статус публикации вариации может быть private или draft, чтобы скрыть их из каталога.
Для диагностики используем следующий запрос в базе данных (через phpMyAdmin или WP CLI):
SELECT COUNT(ID) AS inactive_variations_count FROM wp_posts WHERE post_type = 'product_variation' AND post_status != 'publish';Если число неактивных вариаций велико (сотни и более), стоит подумать об автоматизации удаления.
Пошаговое решение: скрипт для автоматического удаления неактивных вариаций
Создадим функцию, которая будет запускаться по крону или вручную, и удалять все вариации с post_status отличным от publish. Это безопаснее, чем удалять вариации со статусом publish, так как активные варианты останутся.
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wpdesk_delete_inactive_variations() {
$args = array(
'post_type' => 'product_variation',
'post_status' => array('draft', 'pending', 'private', 'trash'),
'posts_per_page' => -1,
'fields' => 'ids',
);
$variations = get_posts($args);
if (empty($variations)) {
error_log('No inactive variations found for deletion.');
return;
}
foreach ($variations as $variation_id) {
wp_delete_post($variation_id, true); // true — без перемещения в корзину
error_log("Deleted variation ID: {$variation_id}");
}
}Для запуска вручную вызовите в консоли WP CLI:
wp eval 'wpdesk_delete_inactive_variations();'Или добавьте крон-задачу:
add_action('wp_loaded', function() {
if (!wp_next_scheduled('wpdesk_delete_inactive_variations_cron')) {
wp_schedule_event(time(), 'daily', 'wpdesk_delete_inactive_variations_cron');
}
});
add_action('wpdesk_delete_inactive_variations_cron', 'wpdesk_delete_inactive_variations');Проверка результата после внедрения
- Выполните SQL-запрос из раздела диагностики и убедитесь, что количество вариаций с неактивным статусом уменьшилось.
- Проверьте раздел «Товары» → «Вариации» в админ-панели: неактивные вариации должны быть удалены.
- В логах PHP (error_log) будут записи об удалённых ID вариаций.
Частые ошибки и как их исправить
- Удаление активных вариаций: Используйте только статусы, отличные от
publish. Проверьте, что в вашем магазине вариации с нужным статусом действительно не активны. - Отсутствие прав доступа: Функция должна запускаться с правами администратора, иначе
wp_delete_post()может не сработать. - Крон не запускается: Проверьте, работает ли WP Cron на вашем хостинге. Для отладки можно использовать плагин WP Crontrol.
- Перемещение в корзину вместо удаления: Если нужно удалять безвозвратно, используйте второй параметр
trueвwp_delete_post().
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Запускайте удаление партиями по 50-100 вариаций, если у вас очень большой магазин, чтобы избежать таймаутов.
- Используйте WP CLI для выполнения задачи, это быстрее и надежнее, чем веб-запросы.
- Добавьте логирование действий для контроля и диагностики.
- Проверяйте, что удалённые вариации не используются в заказах или отчетах, чтобы не нарушить целостность данных.
Сравнение подходов: плагин vs кастомный код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин очистки WooCommerce (например, WP Sweep, Advanced Database Cleaner) | Простота установки, интерфейс, универсальность очистки | Может удалять лишние данные, не всегда гибко настроить фильтры вариаций |
| Кастомный код (описанный выше) | Точная настройка удаления, автоматизация, контроль процесса, логирование | Требует навыков разработки, нужно тестировать и поддерживать |