wp-lessons.ru wordpress WP-Lessons

Как автоматически удалять неактивные вариации товаров WooCommerce без плагинов

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

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

Как определить неактивные вариации WooCommerce

Неактивными считаются вариации с мета-ключом _stock_status со значением outofstock или вариации с post_status отличным от publish. Можно также считать неактивными вариации без заказов или просмотров.

Пример запроса для проверки количества неактивных вариаций в базе:

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

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

Реализуем простой PHP-скрипт, который можно запускать вручную или через WP-Cron для удаления вариаций, которые неактивны более 30 дней.

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

function wp_remove_inactive_variations() {
    global $wpdb;

    $days = 30; // Порог по времени в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID вариаций, которые неактивны и обновлялись до порога
    $variations = $wpdb->get_col($wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
         LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = '_stock_status'
         WHERE p.post_type = 'product_variation'
         AND (p.post_status != 'publish' OR pm.meta_value = 'outofstock')
         AND p.post_modified < %s",
         $date_threshold
    ));

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

    foreach ($variations as $var_id) {
        wp_delete_post($var_id, true); // жесткое удаление
    }

    return count($variations);
}

2. Запускаем функцию вручную или добавляем в крон-задачу

// Вызов функции и вывод результата
add_action('admin_init', function() {
    if (isset($_GET['remove_inactive_variations'])) {
        $count = wp_remove_inactive_variations();
        echo "Удалено вариаций: " . intval($count);
        exit;
    }
});

Для автозапуска через WP-Cron добавьте:

add_action('wp_hourly_event', 'wp_remove_inactive_variations');

if (!wp_next_scheduled('wp_hourly_event')) {
    wp_schedule_event(time(), 'hourly', 'wp_hourly_event');
}

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

  • Зайдите в базу данных и выполните запрос из раздела диагностики, чтобы проверить уменьшение количества неактивных вариаций.
  • Проверьте в админке WooCommerce – вариации с пометкой "нет в наличии" и статусом не "publish" должны исчезнуть.
  • Запустите скрипт вручную через адрес https://ваш-сайт/wp-admin/?remove_inactive_variations=1 и убедитесь, что выводит количество удалённых вариаций.

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

  • Ошибка: Вариации не удаляются, хотя они явно неактивны.
    Причина: неверные условия запроса или отсутствует мета-ключ _stock_status у вариаций.
    Решение: Проверьте наличие мета-ключей через phpMyAdmin, возможно, нужно расширить запрос или проверять другой статус.
  • Ошибка: Скрипт удаляет активные вариации.
    Причина: Неправильное условие выборки в запросе.
    Решение: Убедитесь, что условие p.post_status != 'publish' и _stock_status = 'outofstock' корректно разделены логическими операторами AND/OR.
  • Ошибка: WP-Cron не запускается.
    Причина: Отсутствие посетителей сайта или конфликт с другими плагинами.
    Решение: Используйте системный cron для вызова wp-cron.php или вручную запускайте скрипт.

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

  • Перед запуском автоматического удаления делайте полную резервную копию базы данных.
  • Добавляйте логирование удалённых ID для возможности восстановления и аудита.
  • Ограничивайте выполнение скрипта по времени и объёму, чтобы избежать превышения лимитов сервера.
  • Для больших магазинов запускайте удаление поэтапно, например, по 100 вариаций за раз.
  • Проверяйте права пользователя при запуске скрипта, чтобы избежать несанкционированного удаления.

Сравнение подходов: плагин vs кодовое решение

КритерийПлагинКодовое решениеКомпромисс
Установка и настройкаПросто, но может быть переизбыток функцийТребует навыков PHP и понимания WP APIКод можно внедрить в кастомный плагин или functions.php
ПроизводительностьЗависит от плагина, иногда избыточный кодОптимизированное и легковесное удалениеКод можно адаптировать под конкретную задачу
ГибкостьОграничена настройками плагинаМаксимальная гибкость, можно модифицироватьГибрид — базовый плагин + пользовательский код
БезопасностьЗависит от качества плагинаЗависит от квалификации разработчикаКод ревью и тестирование перед применением
×
Сайт, который вау!
-15%

на премиум-тему
JournalX для WordPress

Хватай промо и действуй ⋙