WooCommerce: как массово обновить количество товаров без таймаута сервера

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

При обновлении большого количества товаров в WooCommerce, например, изменения остатков (stock quantity), часто возникает ошибка 504 Gateway Timeout или 429 Too Many Requests. Это связано с ограничениями сервера и временем выполнения PHP-скриптов. Особенно актуально для магазинов с тысячами товаров.

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

  • Ошибка 504 или 429 в ответе сервера;
  • Долгая загрузка или зависание страницы;
  • В админке WooCommerce операция не завершается или обрывается.

Пошаговое решение: разбиваем обновление на пакеты с WP-CLI и Ajax

1. Использование WP-CLI для пакетного обновления товаров

WP-CLI позволяет запускать команды обновления из командной строки, что исключает таймауты браузера и HTTP. Ниже пример скрипта на PHP для обновления остатков товаров пакетами по 100 штук:

function update_stock_batch( $offset = 0, $batch_size = 100 ) {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => $batch_size,
        'offset'         => $offset,
        'fields'         => 'ids',
        'post_status'    => 'publish',
    ];

    $product_ids = get_posts( $args );
    if ( empty( $product_ids ) ) {
        return false; // Нет больше товаров
    }

    foreach ( $product_ids as $product_id ) {
        $product = wc_get_product( $product_id );
        if ( $product ) {
            // Пример: увеличиваем остаток на 10
            $new_stock = $product->get_stock_quantity() + 10;
            $product->set_stock_quantity( $new_stock );
            $product->save();
        }
    }

    return true;
}

// Используйте WP-CLI для вызова этой функции с нужным offset, пока она не вернет false

Запускайте через команду:

wp eval-file path/to/your-script.php --url=example.com

2. Пошаговое обновление через AJAX для админки

Если хотите обновлять из админки без таймаутов, разбейте обновление на AJAX-запросы по партиям:

  • На стороне PHP: обработчик получает параметр offset и batch_size, обновляет партию товаров и возвращает статус.
  • На стороне JS: запускаем цикл AJAX-вызовов, пока сервер возвращает успешное обновление.

Пример PHP-обработчика в плагине или functions.php:

add_action( 'wp_ajax_update_stock_batch', function() {
    $offset = isset( $_POST['offset'] ) ? intval( $_POST['offset'] ) : 0;
    $batch_size = 100;

    $args = [
        'post_type' => 'product',
        'posts_per_page' => $batch_size,
        'offset' => $offset,
        'fields' => 'ids',
        'post_status' => 'publish',
    ];

    $product_ids = get_posts( $args );
    if ( empty($product_ids) ) {
        wp_send_json_success(['finished' => true]);
    }

    foreach ( $product_ids as $product_id ) {
        $product = wc_get_product( $product_id );
        if ( $product ) {
            $new_stock = $product->get_stock_quantity() + 10;
            $product->set_stock_quantity( $new_stock );
            $product->save();
        }
    }

    wp_send_json_success(['finished' => false, 'next_offset' => $offset + $batch_size]);
});

Пример JS с jQuery для запуска обновления:

function updateStock(offset = 0) {
    jQuery.post(ajaxurl, {
        action: 'update_stock_batch',
        offset: offset
    }, function(response) {
        if (response.success) {
            if (!response.data.finished) {
                updateStock(response.data.next_offset);
            } else {
                alert('Обновление остатков завершено');
            }
        } else {
            alert('Ошибка обновления');
        }
    });
}

// Запуск
updateStock();

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

  • Проверьте в WooCommerce -> Товары, что количество остатков увеличилось на 10 у первых 100 и последующих товаров;
  • Отсутствие ошибок 504 или 429 при обновлении;
  • В логах сервера или браузера нет ошибок по таймауту;
  • Если используете AJAX, в консоли браузера видны последовательные успешные запросы.

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

  • Ошибка 504 или 429 продолжается: Увеличьте время выполнения PHP (max_execution_time) и лимиты памяти (memory_limit) в php.ini или используйте WP-CLI;
  • Потеря данных при обновлении: Проверьте, что используете $product->save(); после изменения свойств;
  • Неверные ID товаров при offset: При удалении товаров offset может смещаться — лучше использовать пагинацию через paged параметр в WP_Query;
  • AJAX-запросы не работают в админке: Убедитесь, что ajaxurl определен и скрипт подключен корректно;
  • Зависание при большом количестве товаров: Уменьшите размер пакета до 50 или 20, если сервер слабый.

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

  • Обязательно проверяйте права пользователя в AJAX-хендлере, например current_user_can('manage_woocommerce');
  • Для крупных магазинов используйте WP-CLI вместо веб-интерфейса;
  • Кэшируйте результаты запросов, если обновления запускаются часто;
  • Отключите ненужные плагины и темы, чтобы уменьшить нагрузку на сервер во время обновления;
  • Регулярно делайте резервные копии базы перед массовыми изменениями;
  • Для контроля используйте логирование действий в отдельный файл или базу.

Сравнение вариантов массового обновления остатков в WooCommerce

МетодПлюсыМинусыКогда использовать
WP-CLI пакетное обновлениеНет таймаутов, высокая скорость, подходит для тысяч товаровТребует доступ к серверу и базовых навыков CLIБольшие магазины, сервер с SSH доступом
AJAX пакетное обновление в админкеУдобно без SSH, гибко, можно запускать из интерфейсаЗависит от лимитов сервера, дольше по времениМагазины среднего размера, быстрые обновления
Обновление через SQL-запросыОчень быстро, прямое изменение базыРиск повреждения данных, сложность в поддержкеЭксперты, когда нужно срочно и с осторожностью

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как использовать nonce в WordPress для защиты форм и запросов
18.12.2025
Как создать адаптивную загрузку изображений в WordPress с примерами кода
07.02.2026
Как создать подробный лог авторизации в WordPress с примерами кода
20.02.2026
Как создать главную страницу магазина на WordPress с помощью WooCommerce и кастомных блоков
13.02.2026
Как использовать WP-Cron для автоматизации задач в WordPress
09.06.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше