wpdebug.ru wordpress WP Debug

WooCommerce: автоматическое удаление отключённых вариантов товаров для оптимизации базы данных

Почему важно удалять отключённые варианты товаров в WooCommerce

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

Удаление таких вариантов поможет снизить нагрузку на базу данных, улучшить время отклика и упростить администрирование.

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

В WooCommerce варианты товаров — это дочерние товары (тип product_variation) с метаполями, где _stock_status или _visibility указывают на неактивность.

Для диагностики можно выполнить SQL-запрос, который покажет количество отключённых вариантов:

SELECT COUNT(*) FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation'
AND (pm.meta_key = '_stock_status' AND pm.meta_value = 'outofstock');

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

wp post list --post_type=product_variation --meta_key=_stock_status --meta_value=outofstock --field=ID | wc -l
<

Это позволит понять масштаб проблемы.

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

1. Создаём функцию для удаления вариантов

Добавьте следующий код в functions.php вашей темы или в отдельный плагин:

function wc_delete_disabled_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '=',
            ],
        ],
        'fields'         => 'ids',
    ];
    $variations = get_posts($args);

    if (empty($variations)) {
        return;
    }

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true); // принудительное удаление без корзины
    }
}

2. Добавляем запуск функции по расписанию (WP-Cron)

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

function wc_schedule_variation_cleanup() {
    if (!wp_next_scheduled('wc_daily_variation_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wc_daily_variation_cleanup');
    }
}
add_action('wp', 'wc_schedule_variation_cleanup');

add_action('wc_daily_variation_cleanup', 'wc_delete_disabled_variations');

3. Немедленный запуск очистки (для теста)

Для проверки можно вызвать функцию вручную через WP-CLI или временно добавить в код:

add_action('init', function() {
    if (current_user_can('administrator') && isset($_GET['run_variation_cleanup'])) {
        wc_delete_disabled_variations();
        echo 'Отключённые варианты удалены';
        exit;
    }
});

После проверки удалите этот код.

Проверка результата

  • Перед и после запуска очистки выполните SQL-запрос или WP-CLI команду для подсчёта вариантов с _stock_status = outofstock. Количество должно уменьшиться.
  • Проверьте, что на страницах товаров не отображаются отключённые варианты.
  • Убедитесь, что в админке WooCommerce в разделе «Варианты» исчезли удалённые элементы.

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

  • Удаляются нужные варианты: Проверьте, что критерии поиска вариантов точные. Иногда варианты могут иметь статус outofstock, но быть важными. Можно добавить дополнительную проверку, например, на метаполе _variation_is_active или другое.
  • Функция не запускается по расписанию: Убедитесь, что WP-Cron работает (проверьте /wp-cron.php), и на сайте есть посетители, которые запускают cron. Для теста можно использовать запрос wp cron event run wc_daily_variation_cleanup.
  • Ошибка удаления из-за прав: убедитесь, что пользователь или процесс, запускающий функцию, имеет права на удаление постов.

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

  • Удаляйте варианты партиями, если их слишком много. Для этого используйте 'posts_per_page' => 100 и запускайте функцию несколько раз.
  • Резервируйте базу данных перед массовыми удалениями.
  • Ограничьте вызов функции вручную только администраторам.
  • Используйте транзакции, если работаете напрямую с базой, чтобы избежать повреждений.

Сравнение способов удаления отключённых вариантов

СпособПлюсыМинусыКомпромиссы
Ручное удаление в админкеПростота, контрольТрудоёмко, неэффективно при большом количествеПодходит для малых магазинов
SQL-запросыБыстро, сразуРиск ошибок, требует бэкапаНужно опытное сопровождение
Автоматизация через WP-Cron и кодРегулярное удаление, минимальное вмешательствоНужна настройка, возможны ошибки при неправильной логикеЛучший баланс для средних и больших магазинов
×
WPShop
партнерка без «но»!

До 3225₽ за каждую продажу

Подключиться к игре