Синхронизация 1С и WordPress интернет-магазина через REST API | IT-Gig

Интеграция 1С и WordPress: как настроить автоматический обмен данными без плагинов

Стандартные готовые модули синхронизации CommerceML часто перегружают базу данных WordPress, создают критические задержки при обновлении остатков и генерируют тысячи мусорных SQL-запросов. Оптимальное инженерное решение для высоконагруженных проектов — построение кастомного коннектора на базе нативного WordPress REST API и интерфейса 1С OData. Такой подход позволяет осуществлять прямую запись пакетов данных в формате JSON, полностью минуя создание промежуточных XML-файлов и снижая показатель TTFB сервера при импорте.

1. Архитектура кастомной конечной точки (Endpoint) в WordPress

Для инициализации выделенного маршрута используется хук rest_api_init. Изолированный эндпоинт позволяет обрабатывать POST-запросы от 1С в обход стандартной инициализации глобального объекта WP_Query, экономя оперативную память сервера.

add_action('rest_api_init', function () {
    register_rest_route('it-gig/v1', '/products/sync', [
        'methods'             => 'POST',
        'callback'            => 'it_gig_handle_1c_import',
        'permission_callback' => 'it_gig_auth_1c_request',
    ]);
});

2. Авторизация и защита входящих пакетов данных

Безопасность трансляции данных обеспечивается валидацией статического Bearer-токена в заголовках запроса. Функция проверки прав отсекает неавторизованные сессии на раннем этапе, защищая базу данных от брутфорса и спам-нагрузок.

function it_gig_auth_1c_request(WP_REST_Request $request) {
    $auth = $request->get_header('Authorization');
    if (!$auth || strpos($auth, 'Bearer ') !== 0) {
        return false;
    }
    $token = substr($auth, 7);
    return hash_equals(get_option('it_gig_1c_token'), $token);
}

3. Потоковый парсинг JSON и синхронизация по GUID без дублей

При обработке каталогов объемом более 10 000 SKU стандартные функции вроде wp_insert_post() могут приводить к утечкам памяти. Для предотвращения дублирования записей при активном Object Cache необходимо использовать поиск по мета-полю, в котором хранится уникальный идентификатор 1С (GUID / ИдХарактеристика).

function it_gig_handle_1c_import(WP_REST_Request $request) {
    $items = $request->get_json_params();
    if (empty($items)) return new WP_REST_Response(['error' => 'No data'], 400);
    foreach ($items as $item) {
        $guid = sanitize_text_field($item['guid']);
        $price = floatval($item['price']);
        $stock = intval($item['stock']);
        $args = [
            'meta_key'   => '_1c_guid',
            'meta_value' => $guid,
            'post_type'  => 'product',
            'posts_per_page' => 1
        ];
        $posts = get_posts($args);
        if (!empty($posts)) {
            $pid = $posts[0]->ID;
            update_post_meta($pid, '_price', $price);
            update_post_meta($pid, '_manage_stock', 'yes');
            update_post_meta($pid, '_stock', $stock);
            wp_cache_delete($pid, 'post_meta');
        }
    }
    return new WP_REST_Response(['status' => 'success'], 200);
}

4. Оптимизация производительности: Пакетная запись и WP-CLI

Для нивелирования просадок по API при массовом изменении цен рекомендуется разбивать входящий поток данных на чанки (пакеты по 500-1000 позиций) и выполнять транзакции на стороне СУБД изолированно. Применение нативного кэширования WordPress и своевременная очистка кэша объектов командой wp_cache_flush() предотвращают падение демона MySQL под высокой нагрузкой.

Теги:

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