Skip to content

feat(web-api): seo-блок для product/category get - #599

Open
Ibochkarev wants to merge 1 commit into
betafrom
feat/issue-567-public-seo-block
Open

feat(web-api): seo-блок для product/category get#599
Ibochkarev wants to merge 1 commit into
betafrom
feat/issue-567-public-seo-block

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

В ответах GET /api/v1/product/get/{id} и GET /api/v1/category/get/{id} появляется объект seo с title, description, canonical, robots и og.{title,description,image,type}. Nuxt SSR может собрать <title>, meta description, canonical и базовый Open Graph без своей угадайки по полям ресурса.

Плоские поля (pagetitle, longtitle, description, uri, image/thumb) не меняются. product/list, category/list и category/tree полный seo не отдают.

Тип изменений

  • Новая функциональность (non-breaking change)

Связанные Issues

Closes #567

Как это было протестировано?

Локальный CI-гейт (без полной установки MODX/MySQL):

cd core/components/minishop3
php -l src/Services/Seo/PublicSeoBuilder.php
php -l src/Services/Seo/PublicSeoService.php
composer test:smoke
composer ci:php
composer stan
Команда Результат
php -l (затронутые PHP) exit 0
composer test:smoke 88 smoke, exit 0
composer ci:php PHPUnit 258, exit 0
composer stan OK, exit 0
  • Ручное тестирование
  • Автоматические тесты (composer ci:php / composer test, npm run lint:ci, composer stan / GitHub Actions CI)
  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3: ветка feat/issue-567-public-seo-block от beta
  • MODX: stubs / без live install
  • PHP: 8.4.17

Скриншоты (если применимо)

Не применимо (JSON API).

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en) — новых ключей нет
  • PHPStan проходит без новых ошибок (composer stan / CI job PHPStan)
  • ESLint проходит без ошибок (npm run lint:ci для Vue) — Vue не трогали
  • Обновлён CHANGELOG.md (для значимых изменений) — запись на релизе

Дополнительные заметки

Правила derivation: title ← непустой longtitle, иначе pagetitle. description ← непустой description, иначе introtext. canonical и og.image — absolute URL из site_url контекста (?context= или context_key ресурса) + relative path. robots для уже публичных сущностей: index,follow. og.type: product / website.

include_seo=0 на get убирает ключ seo. Default на get — включено.

Опциональный хук msOnGetPublicSeo: плагин патчит $modx->event->returnedValues['seo']. Патч только title зеркалится в og.title, пока плагин сам не задал og.title. Whitelist отбрасывает неизвестные ключи и не-скаляры. TV map ms3_public_seo_tv_map в этот PR не входит.

Событие появится в Manager после rebuild/upgrade пакета.

Follow-up: get по uri/alias, multi-size og из галереи (#566), include_seo на list.

Headless SSR needs a stable title/canonical/og contract instead of
guessing longtitle vs pagetitle and joining site_url by hand.
@biz87

biz87 commented Aug 18, 2026

Copy link
Copy Markdown
Member

Влил #597 (facets) — этот PR теперь конфликтует с beta (mergeStateStatus: DIRTY), нужен ребейз.

Хорошая новость: конфликт тривиальный, всего два файла и чистый union — обе стороны регистрируют свой сервис в одном месте:

src/ServiceRegistry.php          ms3_public_seo  vs  ms3_product_facets
src/ServiceRegistryFactories.php ms3_public_seo  vs  ms3_product_facets

Нужны обе записи. ProductCatalogService.php смержился автоматически, там ничего решать не надо.

Проверил локально: после union-резолва всё зелёное — smoke 90, PHPUnit 273. То есть после ребейза PR готов, вопросов по содержанию нет.

Заметил, что ты добавляешь новое событие msOnGetPublicSeo в _build/elements/events.php — это правильно, реестр там единственный источник для build.php. Если планируешь описать его в доках, скажи, добавлю в events/product.md при следующей сверке.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request priority: medium Средний приоритет

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Web API: seo-блок для product/category (headless SSR)

2 participants