Прямой импорт остатков из ERP-систем или 1С через стандартные вебхуки часто намертво блокирует таблицы базы данных wp_posts и wp_postmeta. Когда скрипт пытается обновить 5 000 товаров в один поток, сайт выдает ошибку 504 Gateway Timeout. Разберем архитектуру фоновой синхронизации пакетами.
Главная ошибка — вызов функции update_post_meta() внутри тяжелого неизолированного цикла. Каждое обновление генерирует отдельный запрос к MySQL. Намного быстрее использовать прямые SQL-запросы ядра через глобальный класс $wpdb, завернутые в единую транзакцию:
function it_gig_fast_update_stock($products_data) {
global $wpdb;
$wpdb->query('START TRANSACTION');
foreach ($products_data as $sku => $stock) {
$post_id = $wpdb->get_var($wpdb->prepare(
"SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_sku' AND meta_value = %s LIMIT 1",
$sku
));
if ($post_id) {
$wpdb->query($wpdb->prepare(
"UPDATE {$wpdb->postmeta} SET meta_value = %s WHERE post_id = %d AND meta_key = '_stock'",
$stock, $post_id
));
$wpdb->query($wpdb->prepare(
"UPDATE {$wpdb->postmeta} SET meta_value = %s WHERE post_id = %d AND meta_key = '_stock_status'",
$stock > 0 ? 'instock' : 'outofstock', $post_id
));
}
}
$wpdb->query('COMMIT');
}
При массовой работе с базой данных WordPress кэширует каждый измененный объект в оперативной памяти. При импорте больших массивов это вызывает переполнение выделенного лимита памяти сервера PHP Memory Limit. Обязательно сбрасывайте кэш вручную после обработки каждого пакета товаров:
wp_cache_flush();
Теги: