Проблема: как автоматически удалить варианты товаров в WooCommerce по условию
В WooCommerce часто возникает задача автоматически очистить каталог от ненужных вариаций товаров — например, тех, которые давно не продаются или имеют статус «нет в наличии» более определённого времени. В стандартном интерфейсе WooCommerce такой массовой операции нет, а ручное удаление занимает много времени и неэффективно. Для решения этой задачи нужно написать собственный скрипт, который проверяет условия и удаляет вариации программно.
Диагностика задачи: что нужно проверить перед удалением
- Определить условие удаления: дата последней продажи, наличие на складе, мета-данные вариаций и т.п.
- Проверить, что вариации действительно существуют и связаны с товарами-родителями.
- Убедиться, что удаление не нарушит логику заказов и отчётов.
- Провести резервное копирование базы данных перед массовыми изменениями.
Пошаговое решение: пример кода для удаления вариаций по условию отсутствия на складе
Рассмотрим пример автоматического удаления вариаций, у которых статус склада – «outofstock» более 30 дней (сохраняется дата последнего обновления meta _stock_status_changed — в реальных магазинах может потребоваться добавить этот мета-ключ самостоятельно):
function wpb_delete_old_outofstock_variations() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '=',
],
],
'date_query' => [
[
'column' => 'post_modified_gmt',
'before' => '30 days ago',
],
],
'fields' => 'ids',
];
$variations = get_posts($args);
if(empty($variations)) {
error_log('Нет вариаций для удаления.');
return;
}
foreach($variations as $variation_id) {
wp_delete_post($variation_id, true);
error_log("Удалена вариация ID: $variation_id");
}
}
// Запуск по крону или вручную
// add_action('wp_loaded', 'wpb_delete_old_outofstock_variations');
Код собирает ID вариаций с нужным статусом и датой изменения более 30 дней назад, затем удаляет их навсегда.
Проверка результата после внедрения
- В админке WooCommerce зайдите в список продуктов, выберите нужный товар и убедитесь, что вариации с условием отсутствуют.
- Проверьте записи в журнале ошибок (error_log) для подтверждения удаления.
- Запустите скрипт несколько раз, чтобы убедиться, что повторно удалять нечего — значит, условие сработало корректно.
- Проверьте отчёты WooCommerce на предмет корректного отображения остатков и продаж.
Частые ошибки и как их исправить
- Ошибка: Вариации не удаляются.
Причина: Неправильный meta_key или условие в запросе.
Решение: Проверьте, что вариации действительно имеют мета с ключом_stock_statusи нужное значение. Для диагностики используйте WP CLI или var_dump результатовget_posts(). - Ошибка: Удаляются не те вариации.
Причина: Слишком общий запрос.
Решение: Добавьте дополнительные условия вmeta_queryили фильтры, например, проверку родительского товара, категорий и т.д. - Ошибка: Скрипт вызывает таймаут или превышает лимит памяти.
Решение: Разбейте удаление на батчи, например, обрабатывайте по 50 вариаций за запуск с помощью параметра'posts_per_page' => 50и запускайте по Cron.
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте полный бэкап базы — восстановление из резервной копии быстро решит ошибки.
- Используйте
wp_delete_post($id, true)с вторым параметромtrueдля полного удаления из базы, а не только в корзину. - Для регулярного запуска используйте WP-Cron с ограничением времени выполнения, чтобы не перегружать сервер.
- Если нужно часто проверять статус вариаций, рассмотрите кэширование результатов запроса через Transients API.
Сравнение подходов удаления вариантов товаров в WooCommerce
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Удаление вручную в админке | Просто, без кода | Трудозатратно при большом количестве вариаций | Редактирование вариаций в консоли WooCommerce |
| Использование SQL-запросов | Быстро и напрямую | Риск повредить данные, сложность в поддержке | DELETE FROM wp_posts WHERE post_type = 'product_variation' AND ... |
| Код на PHP с использованием WP API | Контролируемо, масштабируемо, безопасно | Требует знаний PHP и WP | Пример из статьи с wp_delete_post() |
| Плагины для очистки каталога | Удобно, интерфейс | Может не подходить под специфичные условия | Плагины из репозитория |