В статье пойдет речь о том, как на сайте организовать перелинковку с помощью меток (тегов) к статьям. Особенность описанного способа в том, что страница тега полностью может быть настроена под SEO, можно указать title, h1, описание, поэтому страницы тегов можно использовать как категории материалов.
Задачи, которые будут решены:
- реализована возможность для каждой статьи указать несколько тематических тегов;
- для каждого тега создана уникальная страница с настраиваемым title, h1, другими мета теги и автоматически генерируемым списком статей с этим тегом.
Пошаговая инструкция тегированию сайта на MODx:
- Создайте новый шаблон для вывода списка статей по тегу, назовите его Теги. Статьи по определенному тегу будут выводиться сниппетом pdoPage компонента pdoTools, этот сниппет позволит разбить вывод статей на несколько страниц:
[[!pdoPage? &element=`getTickets` &parents=`0` &includeTVs=`tags` &tpl=`tpl.myTickets.list.row` &tvFiltersOrDelimiter=`^^` &tvFilters=`tags==[[*id]]||%^^tags==%||[[*id]]^^tags==%||[[*id]]||%^^tags==[[*id]]` ]] [[!+page.nav]]
Описание параметров:
- element - сниппет который выполняет непосредственно выборку данных из БД;
- parents - cписок родителей, через запятую, для поиска результатов, 0 – не ограничивать;
- includeTVs - какие TV нужно выводить, можно перечислить несколько через запятую;
- tpl - шаблон вывода результатов;
- tvFiltersOrDelimiter - разделитель для условий OR в параметре tvFilters, стандартный || не подходит так как будет использоваться в значениях TV;
- tvFilters - правило для выбора статей, в строке описаны все возможные варианты вхождения ID статьи в значение TV;
Приведенные выше пример кода предусматривают использование компонента для размещения статей на сайте. Если Вы не используете его, то установите отдельно компонент и исправьте значение параметра на компонент, который используете для вывода списка статей.
- Создайте новый ресурс:
- назовите его «Теги»,
- включите галочку «Не показывать в меню»,
- в качестве шаблона ресурса укажите ранее созданный шаблон «Теги».
Его дочерние ресурсы будут тегами для статей.
- Создайте новый TV:
- назовите его «tags»,
- на вкладке «Доступно для шаблонов» выберите шаблон Теги,
- на вкладке «Параметры ввода» укажите следующие параметры:
Тип ввода:
список (множественный выбор)
Возможные значения:
@SELECT pagetitle, id FROM modx_site_content WHERE parent = 6
6 – замените на ID ресурса, созданного в пункте 2.
- Создайте новый сниппет:
- Назовите его Tags.
- Вставьте код:
<?php if (!empty($input)) { $pdo = $modx->getService('pdoFetch'); $parameters = array( 'parents' => (empty($tagsPage) ? 6 : $tagsPage), // ID - корнего раздела с тегами 'depth' => 0, // не искать в дочерних элементах 'resources' => $input // список ID тегов для выборки ); // Получает данные ресурсов (тегов) $tags = $pdo->getCollection('modResource', null, $parameters); if (!empty($tags)) { $output = ''; foreach ($tags as $tag) { $tag['count'] = $count[$tag['id']]; $output .= $pdo->getChunk('@INLINE [[+menutitle:empty=`[[+pagetitle]]`]]', $tag); } return $output; } }
В качестве входящих данных скрипт получает строку с перечисленными через запятую ID тегов, выбирает данные ресурсов (тегов) по этим ID и формирует ссылки на страницы тегов. Тест ссылки берется из параметра «Пункт меню» (menutitle), если оно не заполнено, то из заголовка.
- Вставьте сниппет Tags на страницу со статьей:
[[Tags? &input=`[[*tags]]`&tagsPage=`6`]]
Параметр tagsPage передает в сниппет номер ресурса Теги созданного в пункте 2.
- Создайте дочерние ресурсы для ресурса «Теги», пример заполнения свойств:
Страница тега является обычным ресурсом и поэтому вы можете настраивать её как угодно, менять заголовок, добавить параметры keywords, description и т.п. На данном сайте используется именно такой способ тегирования статей.
Если Вам не нужна такая оптимизация, то можете создать TV другого типа (тег), создать ресурс (страницу) на которой вставить сниппет для вывода всех статей по тегу. Код сниппета не привожу, его можете написать по аналогии с мои, который выводит блок тегов: MODx облако тегов
Попробуйте удалить сниппет tags из чанка, если страница начнет нормально отображаться, то проверьте код сниппета.
/edit дебаггинг показал, что умирает где то на строке
$tag = $res->toArray();, дальше скрипт не отрабатывает.
Не дублируется в начале "<?php"?
Напишите в скайп, он есть в обратной связи, попробуем разобраться.
А Сергею спасибо и за метод, и за помощь)
[[pdoResources?
&parents=`0`
&tpl=`@INLINE [[+pagetitle]] `
&tvFilters=`tags==10`
]]
При этом один и тот же ресурс может быть в нескольких разных тегах, точнее несколько тегов на один ресурс. Не работает. Что делать?
Если по 1 тегу у ресурса, то все прекрасно работает
Как выбрать из нее tags==10?
Пример для получения всех статей (ресурсов) с тегом под ID 10:
[[!pdoPage?
&element=`getTickets`
&parents=`0`
&includeTVs=`tags`
&tpl=`tpl.myTickets.list.row`
&tvFiltersOrDelimiter=`^^`
&tvFilters=`tags==10||%^^tags==%||10^^tags==%||10||%^^tags==10`
]]
Естественно со ссылкой на страницу каждого тега.
Пробовал в настройках вывода дополнительного поля выбрать Разделитель — "," все равно выводит через ||