Синхронизация каталога WooCommerce по API: как избежать зависания базы данных

Прямой импорт остатков из ERP-систем или 1С через стандартные вебхуки часто намертво блокирует таблицы базы данных wp_posts и wp_postmeta. Когда скрипт пытается обновить 5 000 товаров в один поток, сайт выдает ошибку 504 Gateway Timeout. Разберем архитектуру фоновой синхронизации пакетами.

1. Пакетная обработка данных через транзакции

Главная ошибка — вызов функции 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');
}

2. Очистка объектного кэша WordPress

При массовой работе с базой данных WordPress кэширует каждый измененный объект в оперативной памяти. При импорте больших массивов это вызывает переполнение выделенного лимита памяти сервера PHP Memory Limit. Обязательно сбрасывайте кэш вручную после обработки каждого пакета товаров:

wp_cache_flush();

Теги:

[wp_chatgpt_assistant]
Скопировано!