Диагностика проблемы массового обновления товаров в 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-запросы | Очень быстро, прямое изменение базы | Риск повреждения данных, сложность в поддержке | Эксперты, когда нужно срочно и с осторожностью |