Стандартные готовые модули синхронизации CommerceML часто перегружают базу данных WordPress, создают критические задержки при обновлении остатков и генерируют тысячи мусорных SQL-запросов. Оптимальное инженерное решение для высоконагруженных проектов — построение кастомного коннектора на базе нативного WordPress REST API и интерфейса 1С OData. Такой подход позволяет осуществлять прямую запись пакетов данных в формате JSON, полностью минуя создание промежуточных XML-файлов и снижая показатель TTFB сервера при импорте.
Для инициализации выделенного маршрута используется хук 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',
]);
});
Безопасность трансляции данных обеспечивается валидацией статического 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);
}
При обработке каталогов объемом более 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);
}
Для нивелирования просадок по API при массовом изменении цен рекомендуется разбивать входящий поток данных на чанки (пакеты по 500-1000 позиций) и выполнять транзакции на стороне СУБД изолированно. Применение нативного кэширования WordPress и своевременная очистка кэша объектов командой wp_cache_flush() предотвращают падение демона MySQL под высокой нагрузкой.