Своя страница результатов
Сценарий: подсказки показывает виджет SearchBooster, а по Enter пользователь попадает на вашу страницу /search?q=…, которая рендерится на сервере в дизайне сайта.
- Настройте виджет в режиме «только подсказки», а в событии
search(настройки виджета) перенаправьте пользователя на/search?q=…вашего сайта. - На сервере вызовите
/searchс запросом, фильтрами и страницей из URL. - Обработайте
redirect— ответьте302. - Отрендерьте товары, фасеты и пагинацию.
- Отправляйте клики с браузера с тем же
queryId.
import express from 'express';import { randomUUID } from 'node:crypto';
const UUID = process.env.SB_UUID;const app = express();
app.get('/search', async (req, res) => { const page = Math.max(1, Number(req.query.page) || 1); const perPage = 24; const queryId = randomUUID(); const userId = req.cookies?.searchbooster_v2_user_id ?? '';
// фильтры из URL: ?f[Цвет]=белый&f[Цвет]=серый&price=1000-5000 const params = Object.entries(req.query.f ?? {}).map(([field, v]) => ({ field, condition: 'in', options: [].concat(v), })); if (req.query.price) { const [min, max] = String(req.query.price).split('-'); params.push({ field: 'price', condition: 'range', min, max }); }
const url = new URL(`https://api.searchbooster.net/api/${UUID}/search`); url.search = new URLSearchParams({ query: req.query.q ?? '', limit: String(perPage), skip: String((page - 1) * perPage), userId, queryId, client: 'desktop', ...(params.length && { params: JSON.stringify(params) }), ...(req.query.sort && { sortBy: 'price', sortDest: req.query.sort }), });
const data = await fetch(url, { signal: AbortSignal.timeout(3000) }).then((r) => r.json()); if (data.redirect) return res.redirect(302, data.redirect);
res.render('search', { query: data.forceCorrectedQuery || req.query.q, corrected: Boolean(data.forceCorrectedQuery), offers: data.offers, facets: data.params, tips: data.tips, total: data.hits, pages: Math.ceil(data.hits / perPage), page, queryId, });});<a href="{{ offer.url }}" onclick="navigator.sendBeacon('https://api.searchbooster.net/api/UUID/event/click.json?type=productClick&entityId={{ offer.id }}&queryId={{ queryId }}&userId=' + sbUser() + '¶ms=' + encodeURIComponent(JSON.stringify({ pos: {{ position }} })))">