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

Диагностика проблемы с нерабочими вариациями товаров в WooCommerce

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

Для диагностики используйте SQL-запросы к базе данных и проверку статусов вариаций. Например, запрос для выявления вариаций без доступного запаса:

SELECT p.ID, p.post_title, pm.meta_value AS stock_quantity
FROM wp_posts p
INNER JOIN wp_postmeta pm ON p.ID = pm.post_id AND pm.meta_key = '_stock'
WHERE p.post_type = 'product_variation' AND pm.meta_value <= 0;

Также проверьте метаданные вариаций на предмет статуса управления запасами и доступности:

  • _stock_status — должен быть "instock" для доступных вариаций;
  • _manage_stock — должен быть "yes" для управления запасами;
  • _stock — количество на складе.

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

1. Создаем функцию для удаления вариаций с нулевым или отрицательным запасом

function wpsocial_delete_inactive_variations() {
    $args = array(
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_stock',
                'value'   => 0,
                'compare' => '<=',
                'type'    => 'NUMERIC',
            ),
            array(
                'key'     => '_stock_status',
                'value'   => 'outofstock',
            ),
        ),
        'fields'         => 'ids',
    );

    $variations = get_posts($args);

    if (!empty($variations)) {
        foreach ($variations as $variation_id) {
            wp_delete_post($variation_id, true); // Полное удаление
        }
    }
}

2. Планируем регулярное выполнение с помощью WP-Cron

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

add_action('wpsocial_cron_delete_variations', 'wpsocial_delete_inactive_variations');

3. Добавляем возможность ручного запуска из админки

add_action('admin_post_wpsocial_delete_variations', 'wpsocial_delete_inactive_variations');

function wpsocial_add_admin_page() {
    add_menu_page('Удалить нерабочие вариации', 'Очистка вариаций', 'manage_options', 'wpsocial-delete-variations', 'wpsocial_delete_variations_page');
}
add_action('admin_menu', 'wpsocial_add_admin_page');

function wpsocial_delete_variations_page() {
    if (!current_user_can('manage_options')) {
        return;
    }
    if (isset($_POST['wpsocial_delete_variations_nonce']) && wp_verify_nonce($_POST['wpsocial_delete_variations_nonce'], 'wpsocial_delete_variations')) {
        wpsocial_delete_inactive_variations();
        echo '<div class="updated">Нерабочие вариации удалены.</div>';
    }
    echo '<form method="post">';
    wp_nonce_field('wpsocial_delete_variations', 'wpsocial_delete_variations_nonce');
    echo '<input type="submit" value="Удалить нерабочие вариации" class="button button-primary" />';
    echo '</form>';
}

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

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

  • В админке WooCommerce проверьте список вариаций товаров — отсутствуют вариации с запасом ≤ 0 и статусом «нет в наличии».
  • Через phpMyAdmin выполните SQL-запрос, приведенный в разделе диагностики, — он должен возвращать пустой результат.
  • Проверьте, что WP-Cron запланировал задачу (например, с помощью плагина WP Crontrol).

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

  • Функция не удаляет вариации: проверьте, что в meta_query используются правильные ключи метаданных и значения. Статус _stock_status может быть отличным от «outofstock» — проверьте фактические значения в базе.
  • WP-Cron не срабатывает: на некоторых хостингах WP-Cron требует внешнего трафика для запуска. Решение — настроить системный cron или использовать плагин WP Crontrol для ручного запуска.
  • Удаление вариаций приводит к ошибкам на сайте: перед удалением сделайте резервную копию базы. Убедитесь, что удаление вариаций не ломает связи с основными товарами и не влияет на заказы.

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

  • Всегда выполняйте удаление только вариаций с подтвержденным статусом «нет в наличии» и нулевым запасом, чтобы не потерять активные варианты.
  • Добавьте логирование удалений в отдельный файл или таблицу для аудита.
  • Для сайтов с большим количеством товаров и вариаций используйте пакетное удаление по частям, чтобы избежать превышения лимита времени выполнения PHP.
  • Для повышения производительности используйте индексы по метаданным _stock и _stock_status в базе данных.

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

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПростота, контрольМного времени при большом объемеМалые каталоги, редкие удаления
Автоматизация с WP-CronРегулярность, экономия времениЗависит от корректности WP-CronСредние и большие магазины
Плагины очистки базы (например, Clearfy Pro)Доп. функционал, удобствоЗависимость от стороннего кодаЕсли нужна комплексная оптимизация
Как закрыть от индексации страницы авторов и архивов в WordPress
25.08.2026