wpdownload.ru wordpress WPDownload.ru

WooCommerce: как автоматически удалять нерабочие варианты товаров

Что значит «нерабочие» варианты товаров в WooCommerce и зачем их удалять

Варианты товаров (вариации) в WooCommerce могут стать неактуальными по разным причинам: устаревшие размеры, цвета, отсутствия на складе без перспективы пополнения. Такие вариации нагружают базу данных и интерфейс сайта, усложняют администрирование и снижают производительность. Автоматическое удаление нерабочих вариантов поможет поддерживать каталог в актуальном состоянии.

Диагностика: как определить нерабочие варианты товаров

Для начала нужно определить критерии, по которым вариация считается нерабочей. Чаще всего это:

  • Количество на складе равно нулю (stock_quantity = 0)
  • Вариация отключена (post_status = 'private' или 'draft')
  • Вариация неактивна и отсутствует на сайте (visibility = 'hidden' или пользовательские поля)

Проверить наличие таких вариаций можно SQL-запросом напрямую:

SELECT ID, post_title, meta_value AS stock FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE post_type = 'product_variation'
AND pm.meta_key = '_stock'
AND CAST(pm.meta_value AS SIGNED) = 0;

Или через WP-CLI:

wp post list --post_type=product_variation --meta_key=_stock --meta_value=0 --fields=ID,post_title

Пошаговое решение: автоматическое удаление нерабочих вариантов через код

Реализуем функцию, которая при запуске будет удалять все вариации с нулевым количеством на складе. Добавьте этот код в файл functions.php вашей темы или в отдельный плагин:

function wpdownload_delete_out_of_stock_variations() {
    $args = array(
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_stock',
                'value'   => '0',
                'compare' => '='
            )
        ),
        'fields' => 'ids',
    );

    $variations = get_posts($args);
    if (empty($variations)) {
        return;
    }

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true); // true - без перемещения в корзину
    }
}

// Запускаем по крону или вручную
add_action('init', function() {
    if (isset($_GET['delete_out_of_stock_variations']) && current_user_can('manage_woocommerce')) {
        wpdownload_delete_out_of_stock_variations();
        echo 'Удаление завершено.';
        exit;
    }
});

Для ручного запуска откройте в браузере https://ваш_сайт/?delete_out_of_stock_variations=1 (с правами администратора WooCommerce).

Автоматизация через Cron

Чтобы запускать удаление регулярно, создайте крон-задачу:

if (!wp_next_scheduled('wpdownload_cron_delete_out_of_stock_variations')) {
    wp_schedule_event(time(), 'daily', 'wpdownload_cron_delete_out_of_stock_variations');
}

add_action('wpdownload_cron_delete_out_of_stock_variations', 'wpdownload_delete_out_of_stock_variations');

Проверка результата после внедрения

После выполнения кода проверьте:

  • В административной панели WooCommerce – список вариаций должен не содержать товаров с нулевым остатком.
  • В базе данных – запрос SQL выше должен возвращать пустой результат.
  • На фронтенде – недоступные вариации не показываются в карточках товаров.

Частые ошибки и как их исправить

  • Не удаляются вариации с нулевым остатком: проверьте, что мета-ключ _stock правильно установлен и хранит именно числовое значение. Иногда используется _stock_status со значением outofstock – для этого нужно добавить дополнительную проверку.
  • Удаляются рабочие варианты: убедитесь, что фильтр по количеству точен и не удаляет вариации с временным нулём, если они скоро появятся на складе.
  • Крон-задача не запускается: проверьте, что WP-Cron не отключен, и что на сайте есть трафик, вызывающий выполнение задач.
  • Права доступа: вызов через URL требует права администратора WooCommerce (как правило, роль shop_manager или administrator).

Практические советы по безопасности и производительности

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Добавьте логирование удалений в отдельный файл или в системный журнал (error_log()), чтобы отслеживать действия.
  • Для больших магазинов с тысячами вариаций запускайте удаление пакетами, чтобы избежать таймаутов PHP.
  • Можно добавить дополнительный параметр проверки, например, дату последнего обновления вариации, чтобы не удалять недавно обновлённые.

Сравнение способов удаления нерабочих вариаций

МетодПлюсыМинусы
SQL-запрос напрямуюОчень быстроРиск повредить целостность данных, требует осторожности
PHP-код с WP-функциямиБезопасно, учитывает хуки WooCommerceМедленнее, требует запуска
Плагины очисткиУдобно, интерфейсЗависимость от сторонних решений, возможные конфликты
×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙