pdoTitle — автоматическая генерация title страниц в MODX

pdoTitle Дополнения

Сниппет pdoTitle предназначен для автоматической генерации тега <title> страницы с учетом иерархии ресурсов, пагинации и GET-параметров. Он формирует SEO-дружественные заголовки, включая хлебные крошки родительских разделов, номера страниц при пагинации и поисковые запросы. Основное преимущество — избавление от дублирующихся title на страницах с пагинацией и автоматическое добавление структурированной информации о положении страницы в иерархии сайта.

Сниппет работает в связке с pdoPage и pdoCrumbs, автоматически подхватывая номера страниц и формируя цепочку родительских разделов. PdoTitle также может использоваться для генерации мета-описаний (description), что делает его универсальным инструментом для SEO оптимизации заголовков.

Базовый синтаксис использования

Простейший вызов в теге title:

<title>[[!pdoTitle]]</title>

Вызов с названием сайта:

<title>[[!pdoTitle]] / [[++site_name]]</title>

Использование для meta description:

<meta name="description" content="[[!pdoTitle? &titleField=`description` ]]">

Вызов с отключением лишних функций:

<title>[[!pdoTitle? &limit=`0` &cache=`1` &registerJs=`0` ]]</title>

Обратите внимание что сниппет должен вызываться некешируемым через восклицательный знак для корректной работы с пагинацией.

Параметры

PdoTitle имеет набор параметров для управления выводом заголовка.

Параметр Значение по умолчанию Описание
&id 0 ID ресурса для генерации заголовка
&limit 3 Максимальное количество родителей в заголовке
&titleField longtitle Поле ресурса для использования в title
&separator / Разделитель между элементами заголовка
&pageVarKey page Имя GET-параметра для номера страницы
&queryVarKey query Имя GET-параметра для поискового запроса
&minQuery 3 Минимальная длина поискового запроса для вывода
&tplPages Чанк для оформления пагинации в title
&tplQuery Чанк для оформления поискового запроса
&outputSeparator / Разделитель элементов
&cache 0 Кешировать внутренний вызов pdoCrumbs
&cacheTime 0 Время жизни кеша в секундах
&registerJs 1 Подключать JavaScript для поддержки Ajax
&showLog 0 Вывести отладочную информацию

Параметры pdoCrumbs

PdoTitle внутри себя вызывает pdoCrumbs для формирования цепочки родителей. Можно передавать любые параметры pdoCrumbs:

  • &showHome — показывать главную страницу
  • &showCurrent — показывать текущую страницу
  • &exclude — исключить определенные ресурсы

Структура генерируемого заголовка

PdoTitle формирует заголовок в следующем порядке:

[Цепочка родителей] / [Заголовок страницы] / [Пагинация] / [Поисковый запрос]

Пример для страницы каталога:

Главная / Каталог / Электроника / Смартфоны — страница 2 из 5

Пример для страницы поиска:

Главная / Каталог / Поиск: чехол для iPhone 15

Параметр &titleField

Параметр &titleField определяет какое поле ресурса использовать для заголовка.

Использование longtitle по умолчанию:

<title>[[!pdoTitle]]</title>

Использование pagetitle вместо longtitle:

<title>[[!pdoTitle? &titleField=`pagetitle`]]</title>

Использование TV-параметра для заголовка:

<title>[[!pdoTitle? &titleField=`seo_title`]]</title>

Использование description для мета-тега:

<meta name="description" content="[[!pdoTitle? &titleField=`description` &limit=`0` &registerJs=`0`]]">

Управление иерархией родителей

Параметр &limit контролирует количество родительских разделов в заголовке.

Отключить вывод родителей:

<title>[[!pdoTitle? &limit=`0` ]] — [[++site_name]]</title>

Вывод только одного родителя:

<title>[[!pdoTitle? &limit=`1` ]]</title>

Вывод до трех родителей (по умолчанию):

<title>[[!pdoTitle? &limit=`3` ]]</title>

Неограниченное количество родителей:

<title>[[!pdoTitle? &limit=`99` ]]</title>

Настройка разделителя

Параметр &separator определяет символ между элементами заголовка.

Использование тире:

<title>[[!pdoTitle? &separator=` — `]]</title>

Использование вертикальной черты:

<title>[[!pdoTitle? &separator=` | `]]</title>

Использование стрелки:

<title>[[!pdoTitle? &separator=` → `]]</title>

Использование двоеточия:

<title>[[!pdoTitle? &separator=`: `]]</title>

Работа с пагинацией

PdoTitle автоматически определяет наличие GET-параметра пагинации и добавляет информацию о текущей странице.

Базовая настройка для страниц с pdoPage:

<title>[[!pdoTitle? &cache=`1` &registerJs=`0` ]] — [[++site_name]]</title>

Результат для второй страницы:

Название раздела — страница 2 из 5 — Название сайта

Кастомный шаблон для пагинации:

<title>[[!pdoTitle? &tplPages=`@INLINE стр. [[+page]] / [[+pageCount]]`]]</title>

Если используется нестандартный параметр для пагинации:

<title>[[!pdoTitle? &pageVarKey=`news` ]]</title>

Поисковые запросы в заголовке

PdoTitle может подхватывать поисковый запрос из GET-параметров и добавлять его в title.

Базовая настройка для страниц поиска:

<title>[[!pdoTitle? &queryVarKey=`query`]]</title>

Результат для поиска по запросу «чехол iPhone»:

Каталог / Поиск: чехол iPhone — Название сайта

Кастомный шаблон для поискового запроса:

<title>[[!pdoTitle? &tplQuery=`@INLINE Поиск по запросу «[[+query]]»`]]</title>

Использование другого GET-параметра:

<title>[[!pdoTitle? &queryVarKey=`s`]]</title>

Title и Description для пагинации

Полная настройка мета-тегов для страниц с постраничной навигацией.

Вариант через pdoTitle

<title>[[!pdoTitle? &limit=`0` &cache=`1` &registerJs=`0` ]]</title> <meta name="description" content="[[!pdoTitle? &limit=`0` &cache=`1` &titleField=`description` &registerJs=`0` ]]">

На Fenom:

<title>{'!pdoTitle' | snippet : [ 'limit' => '0', 'cache' => '1', 'registerJs' => '0' ]}</title> <meta name="description" content="{'!pdoTitle' | snippet : [ 'limit' => '0', 'cache' => '1', 'titleField' => 'description', 'registerJs' => '0' ]}">

Вариант через GET-параметр

Создайте сниппет get_post:

Использование в head:

<title>[[*longtitle]][[!get_post]]</title> <meta name="description" content="[[*description]][[!get_post]]">

Расширенный вариант с передачей текста:

Вызов:

<title>[[!get_post? &text=`[[*longtitle]]`]]</title> <meta name="description" content="[[!get_post? &text=`[[*description]]`]]">

Оптимизация производительности

Параметр &cache включает кеширование результатов:

<title>[[!pdoTitle? &cache=`1`]]</title>

Параметр &registerJs отключает регистрацию JavaScript если не нужен:

<title>[[!pdoTitle? &registerJs=`0`]]</title>

Полная оптимизация для продакшена:

<title>[[!pdoTitle? &limit=`0` &cache=`1` &registerJs=`0` &separator=` — `]] — [[++site_name]]</title>

Практические примеры для разных типов страниц

Главная страница

Вывод только названия сайта для главной:

[[*id:is=`[[++site_start]]`:then=`
<title>[[++site_name]] — [[*description:limit=`100`]]</title>
`:else=`
<title>[[!pdoTitle?
&limit=`2`
&cache=`1`
&registerJs=`0`
]] — [[++site_name]]</title>
`]]

Каталог с пагинацией

Настройка title для каталога товаров:

<title>[[!pdoTitle?
&limit=`1`
&cache=`1`
&registerJs=`0`
&separator=` — `
]] | [[++site_name]]</title>

<meta name="description" content="[[!pdoTitle?
&limit=`0`
&titleField=`description`
&cache=`1`
&registerJs=`0`
]]">

Блог с категориями

Заголовки для статей блога:

<title>[[!pdoTitle? &limit=`2` &titleField=`longtitle` &cache=`1` &registerJs=`0` ]] / [[++site_name]]</title>

Страница поиска

Title для результатов поиска:

<title>[[!pdoTitle? &limit=`1` &queryVarKey=`query` &tplQuery=`@INLINE Поиск: [[+query]]`]]</title>

Мультиязычные сайты

Использование названия сайта из контекста:

<title>[[!pdoTitle? &limit=`0` ]] — [[++translate_site_name]]</title>

Или с условием по контексту:

<title>[[!pdoTitle? &limit=`2` ]] — [[++[[!modx.context:is=`en`:then=`site_name_en`:else=`site_name`]]]]</title>

Канонические ссылки и pdoTitle

PdoTitle работает совместно с параметром &setMeta из pdoPage для управления мета-тегами.

Если на странице несколько pdoPage, для остальных отключите метатеги:

[[!pdoPage? &parents=`10` &setMeta=`0` ]]

Отключить canonical если не нужен:

[[!pdoPage? &parents=`5` &setMetaCanonical=`0` ]]

SEO рекомендации для title

Оптимальная длина title — от 30 до 100 символов (около 60-70).

Структура эффективного title:

  1. Прямое вхождение основного запроса
  2. Дополнительные ключевые слова
  3. Название бренда/сайта (необязательно)

Плохой пример:

<title>[[++site_name]] — [[*pagetitle]]</title>

Проблема: название сайта впереди снижает релевантность.

Хороший пример:

<title>[[!pdoTitle? &limit=`0` &titleField=`longtitle` ]] — [[++site_name]]</title>

Title должен описывать конкретную страницу, а не сайт в целом.

Отладка работы pdoTitle

Проверка генерируемого заголовка:

<title>[[!pdoTitle? &showLog=`1` ]]</title>

Вывод в консоли браузера покажет какие элементы были включены в заголовок и почему.

Проверка наличия GET-параметра page:

[[!+page:notempty=`Страница [[!+page]]`]]

Альтернативные решения

Если pdoTitle не подходит, можно использовать условную логику на Fenom:

<title>{$_modx->resource.longtitle} {if $_GET.page} — страница {$_GET.page} {/if} — {$_modx->config.site_name}</title>

Или через ручной сниппет для полного контроля над логикой.

Оцените статью
MODX 3
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.