wpcodes.ru wordpress WP Codеs

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

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

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

Чтобы определить, есть ли на вашем сайте такие вариации, можно выполнить SQL-запрос напрямую в базе данных через phpMyAdmin или wp-cli:

SELECT p.ID, p.post_title, pm.meta_value AS stock_status
FROM wp_posts p
LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id AND pm.meta_key = '_stock_status'
WHERE p.post_type = 'product_variation'
AND (pm.meta_value = 'outofstock' OR pm.meta_value IS NULL);

Этот запрос покажет вариации с отсутствующим или отсутствующим на складе статусом. Такие вариации часто бесполезны и могут быть удалены.

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

1. Определение критериев для удаления

Для удаления следует выбрать вариации, которые соответствуют следующим параметрам:

  • Статус склада — outofstock или отсутствует
  • Дата последнего заказа или изменения — более 6 месяцев назад
  • Нет активных заказов в статусах «обработка», «выполнен»

2. Создание WP-Cron задачи для регулярной очистки

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

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

add_action('wc_delete_inactive_variations_daily', function() {
    global $wpdb;
    $six_months_ago = date('Y-m-d H:i:s', strtotime('-6 months'));

    // Получаем ID вариаций, которые outofstock и старше 6 месяцев
    $variations = $wpdb->get_col($wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->prefix}posts p
        LEFT JOIN {$wpdb->prefix}postmeta pm ON p.ID = pm.post_id AND pm.meta_key = '_stock_status'
        WHERE p.post_type = 'product_variation'
        AND (pm.meta_value = 'outofstock' OR pm.meta_value IS NULL)
        AND p.post_modified < %s",
        $six_months_ago
    ));

    if (!$variations) {
        return;
    }

    foreach ($variations as $variation_id) {
        // Проверяем, нет ли активных заказов с этим вариацией
        $orders = wc_get_orders(array(
            'limit' => 1,
            'status' => array('processing', 'completed'),
            'meta_query' => array(
                array(
                    'key' => '_product_id',
                    'value' => $variation_id,
                    'compare' => '='
                )
            )
        ));

        if (empty($orders)) {
            wp_delete_post($variation_id, true); // Полное удаление вариации
        }
    }
});

3. Вручную запуск задачи для проверки

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

do_action('wc_delete_inactive_variations_daily');

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

Для проверки удалены ли неактивные вариации:

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

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

  • Удаляются нужные вариации: Проверьте правильность условий в запросах, особенно даты и статусы заказов. Добавьте логи для контроля.
  • Задача не запускается: Удостоверьтесь, что WP-Cron работает на вашем сервере. Проверьте, не отключена ли функция wp-cron.php.
  • Заказы с вариациями не учитываются: В запросах к заказам используйте правильный мета-ключ, возможно, нужно искать по _variation_id или через товары в заказе.

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

  • Используйте wp_delete_post с параметром true для полного удаления вариаций, чтобы не оставлять мусор в базе.
  • Добавьте ограничение на количество удаляемых вариаций за один запуск, чтобы избежать перегрузки сервера.
  • Перед удалением создавайте резервную копию базы или используйте плагин для бэкапов.
  • Для крупных магазинов рассмотрите выполнение задачи вне WP-Cron, например через системный cron, чтобы избежать задержек.

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

МетодПлюсыМинусы
WP-Cron с кастомным кодомГибкость, легкая настройка, без сторонних плагиновЗависит от посещаемости сайта, возможны пропуски задач
Плагины очистки базы (например, WP Sweep)Простота использования, дополнительные опции оптимизацииМожет удалить лишнее, не всегда учитывает бизнес-логику
Системный cron + WP-CLI скриптыМаксимальная стабильность и контроль, подходит для больших сайтовТребует доступа к серверу и навыков администрирования
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее