• Как устроено
  • Быстрый старт
  • Доступ и токен
    • Страницы
      • Frontmatter
      • Синтаксис markdown
      • Переводы страниц
    • Фреймы
      • Вставки onpress/
      • Бинды data-op-bind
      • Сборка и копии
    • Готовые фреймы
      • assistant
      • outline
      • faq
      • article
      • docs
      • site__header
      • site__footer
      • article__faq
      • landing
      • assistant__chat
      • site__404
      • news
      • news__category
      • news__post
      • news__more
      • news__share
      • author__page
      • author__byline
      • author__card
      • author__avatar
      • author__socials
      • author__head
      • home
      • pricing
    • Данные
      • Повторитель onpress/repeat
  • Стили
  • Меню
  • Сайдбар документации
  • Языки сайта
  • Настройки и кэш
  • SEO
  • Медиа
  • Сайты и домены
  • Пользователи и профиль
  • Дашборд и вход
    • Рецепты
      • Сайт с нуля
      • Раздел документации
      • Лендинг
      • FAQ
      • Свой фрейм из готового
      • Многоязычный сайт
      • Поменять меню
      • Перенести страницу
      • Картинки в статье
      • Список из данных
      • Сменить оформление
    • Справочник API
      • Страницы
      • Переводы
      • Фреймы
      • Данные
      • Меню
      • Сайдбар документации
      • Стили
      • Настройки, главная, кэш
      • Языки
      • SEO
      • Медиа
      • Сайты
      • Пользователи и профиль
      • Вход и служебное
    • Ошибки и проблемы
      • Коды ошибок
OnPress OnPress
  • Документация
  • Контакты
Войти
  • Как устроено
  • Быстрый старт
  • Доступ и токен
    • Страницы
      • Frontmatter
      • Синтаксис markdown
      • Переводы страниц
    • Фреймы
      • Вставки onpress/
      • Бинды data-op-bind
      • Сборка и копии
    • Готовые фреймы
      • assistant
      • outline
      • faq
      • article
      • docs
      • site__header
      • site__footer
      • article__faq
      • landing
      • assistant__chat
      • site__404
      • news
      • news__category
      • news__post
      • news__more
      • news__share
      • author__page
      • author__byline
      • author__card
      • author__avatar
      • author__socials
      • author__head
      • home
      • pricing
    • Данные
      • Повторитель onpress/repeat
  • Стили
  • Меню
  • Сайдбар документации
  • Языки сайта
  • Настройки и кэш
  • SEO
  • Медиа
  • Сайты и домены
  • Пользователи и профиль
  • Дашборд и вход
    • Рецепты
      • Сайт с нуля
      • Раздел документации
      • Лендинг
      • FAQ
      • Свой фрейм из готового
      • Многоязычный сайт
      • Поменять меню
      • Перенести страницу
      • Картинки в статье
      • Список из данных
      • Сменить оформление
    • Справочник API
      • Страницы
      • Переводы
      • Фреймы
      • Данные
      • Меню
      • Сайдбар документации
      • Стили
      • Настройки, главная, кэш
      • Языки
      • SEO
      • Медиа
      • Сайты
      • Пользователи и профиль
      • Вход и служебное
    • Ошибки и проблемы
      • Коды ошибок
Рецепты
Markdown
Открыть в ИИ
  • Открыть в ChatGPT
  • Открыть в Claude
  • Открыть в Gemini
  • Открыть в Perplexity
  • Открыть в Grok
  • Открыть в DeepSeek

FAQ на странице

Три способа. Фрейм faq со слотом — основной для новых страниц: вопросы лежат в markdown страницы, а аккордеон и схема FAQPage — обычной разметкой во фрейме, который правится в одном месте и копируется под другой вид. Вставка onpress/faq — то же в тексте, но с фиксированной разметкой. Общий набор — когда одни и те же вопросы показываются на многих страницах или ими управляют отдельно от текста.

Способ 1. Фрейм faq со слотом

Фрейм faq.html — аккордеон и JSON-LD. Оба повторителя читают источник slot.faq: пары вопрос-ответ из содержимого вызова.

<section class="opfaq"><div class="opfaq__list"><!-- onpress/repeat {"source":"slot.faq","empty":"frame"} --><details class="opfaq__item"><summary class="opfaq__q"><span class="opfaq__q-text" data-op-bind='{"html":"item.q"}'></span></summary><div class="opfaq__a" data-op-bind='{"html":"item.a"}'></div></details><!-- /onpress/repeat --></div></section>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[<!-- onpress/repeat {"source":"slot.faq","separator":","} -->{"@type":"Question","name":<!-- onpress/value {"bind":"item.q_text","format":"json"} /-->,"acceptedAnswer":{"@type":"Answer","text":<!-- onpress/value {"bind":"item.a_text","format":"json"} /-->}}<!-- /onpress/repeat -->]}</script>
curl -s -X POST "$API/site/$SITE/frames" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d "$(jq -n --rawfile html faq.html '{slug: "faq", html: $html}')" \
  | jq -c '{slug: .frame.slug, inserts, warnings}'

Как это работает:

  • у элемента slot.faq поля q и a — HTML вопроса и ответа, q_text и a_text — тот же текст без разметки, question и answer — исходный markdown;
  • onpress/value с "format":"json" выводит значение JSON-литералом, безопасным внутри <script>, — в скрипте тегов для data-op-bind нет;
  • separator ставит запятую между элементами, после последнего — нет, поэтому JSON остаётся корректным;
  • классы opfaq* те же, что у вставки onpress/faq, — стили темы подходят без правок.

Страница пишет заголовок раздела и вызов фрейма с вопросами внутри:

## FAQ

<!-- onpress/frame {"name":"faq"} -->
### Сколько стоит?

Бесплатно на старте. Платный тариф включает:

- свой домен;
- неограниченное число страниц.

### Нужна ли карта?

Нет, карта не нужна.
<!-- /onpress/frame -->

Правило вопросов то же, что у onpress/faq: уровень первого заголовка внутри вызова — вопрос, всё до следующего такого же — ответ. Содержимое вызова остаётся в теле страницы как есть: выгрузка и повторная заливка его не меняют, а перед вызовом выгрузка ставит пустую строку после заголовка.

FAQPage на странице ровно один. Если FAQ-фреймов в теле несколько, их схемы при сборке тела сливаются в первую, остальные снимаются; старая onpress/faq-schema в этом случае свой FAQPage не выводит.

Проверка:

curl -s "https://ВАШ_ДОМЕН/tarify/" | grep -c 'class="opfaq__item"'
curl -s "https://ВАШ_ДОМЕН/tarify/" | grep -o '"@type":"FAQPage"' | wc -l

Нужен другой вид — не правьте faq, а сделайте копию со своей разметкой: свой фрейм из готового.

Способ 2. Вопросы в тексте: onpress/faq

Допишите в markdown страницы раздел с заголовком и вставку:

## Частые вопросы

<!-- onpress/faq -->
### Сколько стоит?

Бесплатно на старте. Платный тариф включает:

- свой домен;
- неограниченное число страниц.

### Нужна ли карта?

Нет, карта не нужна.

### Есть ли API?

Да — [API v2](/docs/v2/ru/).
<!-- /onpress/faq -->

Опубликуйте страницу как обычно (POST /pages/markdown). На странице получится аккордеон на details/summary, работающий без JavaScript, и после него — JSON-LD FAQPage с теми же вопросами:

<section class="opfaq" id="faq"><div class="opfaq__list">
  <details class="opfaq__item"><summary class="opfaq__q"><span class="opfaq__q-text">Сколько стоит?</span></summary><div class="opfaq__a"><p>Бесплатно на старте. …</p><ul>…</ul></div></details>
  …
</div></section>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[…]}</script>

Правила:

  • уровень первого заголовка внутри вставки — уровень вопросов (здесь ###); всё до следующего такого заголовка — ответ;
  • ответы — обычный markdown: списки, ссылки, выделение, картинки;
  • заголовок раздела — над вставкой, вплотную, без абзаца между ними; назвать его можно и просто «FAQ»: якорь #faq останется у заголовка, секция получит faq-2. Нужен свой якорь у секции — <!-- onpress/faq {"id":"voprosy"} -->;
  • FAQPage выводится один раз на страницу; выключить — {"schema": false}.

Проверка:

curl -s "https://ВАШ_ДОМЕН/tarify/" | grep -c 'class="opfaq__item"'
curl -s "https://ВАШ_ДОМЕН/tarify/" | grep -o '"@type":"FAQPage"'

Правка — выгрузить страницу (GET /pages/{ref}/markdown), поправить вопрос прямо в тексте, опубликовать обратно.

Способ 3. Общий набор и фрейм

Один набор faq на весь сайт, у каждого вопроса поле page со слагом страницы. Блок выводит отдельный фрейм article__faq, который гаснет на страницах без вопросов.

Набор:

curl -s -X PUT "$API/site/$SITE/data/faq" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"items": [
        {"page": "tarify", "q": "Сколько стоит?", "a": "Бесплатно на старте."},
        {"page": "tarify", "q": "Нужна ли карта?", "a": "Нет."},
        {"page": "o-kompanii", "q": "Где вы находитесь?", "a": "Работаем удалённо."}
      ]}' | jq -c '{applied, items: .dataset.items}'

Фрейм блока article__faq.html:

<section class="article__faq">
  <h2>Частые вопросы</h2>
  <!-- onpress/repeat {"source":"faq","match":{"page":"page.slug"},"empty":"frame"} -->
  <details class="article__faq-item">
    <summary data-op-bind='{"text":"item.q"}'></summary>
    <p data-op-bind='{"text":"item.a"}'></p>
  </details>
  <!-- /onpress/repeat -->
  <!-- onpress/faq-schema {"source":"faq","match":{"page":"page.slug"}} /-->
</section>
curl -s -X POST "$API/site/$SITE/frames" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d "$(jq -n --rawfile html article__faq.html '{slug: "article__faq", html: $html}')" \
  | jq -c '{slug: .frame.slug, sources, renders_on_request}'

Вложите блок в оболочку статьи — строкой <!-- onpress/frame {"name":"article__faq"} /--> после onpress/content в article (PUT /frames/article с новой разметкой).

Проверьте, что получит каждая страница, до того как смотреть сайт:

for p in tarify o-kompanii kontakty; do
  printf '%s: ' "$p"
  curl -s -X POST "$API/site/$SITE/data/resolve" \
    -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
    -d "{\"source\": \"faq\", \"page\": \"$p\", \"match\": {\"page\": \"page.slug\"}}" | jq -c '[.items[].q]'
done
tarify: ["Сколько стоит?","Нужна ли карта?"]
o-kompanii: ["Где вы находитесь?"]
kontakty: []

На kontakty блока не будет вовсе — ни заголовка, ни пустой секции: "empty":"frame" гасит фрейм article__faq. Правка вопросов — PATCH /data/faq (например {"op":"merge","match":{"q":"Нужна ли карта?"},"fields":{"a":"Нет, не нужна."}}); страницы подхватят её на следующем запросе, кэш сбросится сам.

Переводы. Вариант набора на язык — PUT /data/faq с "lang": "en": английские страницы получат свои вопросы, остальные — общий набор.

Какой способ выбрать

Фрейм faq со слотомonpress/faq в текстеНабор + фрейм
Где живут вопросыв markdown страницыв markdown страницыв наборе faq
Правкавместе с текстом страницывместе с текстом страницыPUT/PATCH /data/faq
Один вопрос на многих страницахкопироватькопироватьодна запись, фильтр match
Страница читается целиком одним запросомдаданет, вопросы отдельно
Своя разметкакопия фрейманет, разметка фиксированнаясвоя разметка фрейма
Статическая копияне мешаетне мешаетфильтр page.* делает фрейм зависимым от страницы
arrow_backНазад
Лендинг из конструктора
Далееarrow_forward
Свой фрейм из готового
На этой странице
  • Способ 1. Фрейм faq со слотом
    • Способ 2. Вопросы в тексте: onpress/faq
      • Способ 3. Общий набор и фрейм
        • Какой способ выбрать
        OnPress
        OnPress
        ИП Зуев И.В. ИНН: 360408359441
        © 2026
        политика конфиденциальности публичная оферта
        • visa
        • mastercard
        • sber
        • tpay