Перейти к содержимому

Своя страница результатов

Сценарий: подсказки показывает виджет SearchBooster, а по Enter пользователь попадает на вашу страницу /search?q=…, которая рендерится на сервере в дизайне сайта.

  1. Настройте виджет в режиме «только подсказки», а в событии search (настройки виджета) перенаправьте пользователя на /search?q=… вашего сайта.
  2. На сервере вызовите /search с запросом, фильтрами и страницей из URL.
  3. Обработайте redirect — ответьте 302.
  4. Отрендерьте товары, фасеты и пагинацию.
  5. Отправляйте клики с браузера с тем же queryId.
server.js (Express)
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,
});
});
search.html — клик по товару
<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() + '&params=' + encodeURIComponent(JSON.stringify({ pos: {{ position }} })))">