Тегирование сайта на MODx

Разработка Зотиков Сергей 18 комментариев

В статье пойдет речь о том, как на сайте организовать перелинковку с помощью меток (тегов) к статьям. Особенность описанного способа в том, что страница тега полностью может быть настроена под SEO, можно указать title, h1, описание, поэтому страницы тегов можно использовать как категории материалов.

Задачи, которые будут решены:

  • реализована возможность для каждой статьи указать несколько тематических тегов;
  • для каждого тега создана уникальная страница с настраиваемым title, h1, другими метатегами и автоматически генерируемым списком статей с этим тегом.

Пошаговая инструкция по тегированию сайта на MODx:

  1. Создайте новый шаблон для вывода списка статей по тегу, назовите его Теги. Статьи по определенному тегу будут выводиться сниппетом 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 – список родителей, через запятую, для поиска результатов, 0 – не ограничивать;
  • includeTVs – какие TV нужно выводить, можно перечислить несколько через запятую;
  • tpl – шаблон вывода результатов;
  • tvFiltersOrDelimiter – разделитель для условий OR в параметре tvFilters, стандартный || не подходит, так как будет использоваться в значениях TV;
  • tvFilters – правило для выбора статей, в строке описаны все возможные варианты вхождения ID статьи в значение TV.

Приведенный выше пример кода предусматривает использование компонента для размещения статей на сайте. Если вы не используете его, то установите отдельно компонент и исправьте значение параметра на компонент, который используете для вывода списка статей.

  1. Создайте новый ресурс:
    1. назовите его Теги,
    2. включите галочку Не показывать в меню,
    3. в качестве шаблона ресурса укажите ранее созданный шаблон Теги.

Его дочерние ресурсы будут тегами для статей.

  1. Создайте новый TV:
    1. назовите его tags,
    2. на вкладке Доступно для шаблонов выберите шаблон Теги,
    3. на вкладке Параметры ввода укажите следующие параметры:

Тип ввода: список (множественный выбор)

Возможные значения:

SQL
@SELECT pagetitle, id FROM modx_site_content WHERE parent = 6

6 – замените на ID ресурса, созданного в пункте 2.

  1. Создайте новый сниппет:
    1. Назовите его Tags.
    2. Вставьте код:
PHP
<?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) {
            $output .= $pdo->getChunk('@INLINE <a href="[[+uri]]" itemprop="keywords" class="tags__link">[[+menutitle:empty=`[[+pagetitle]]`]]</a>', $tag);
        }
        return $output;
    }
}

В качестве входящих данных скрипт получает строку с перечисленными через запятую ID тегов, выбирает данные ресурсов (тегов) по этим ID и формирует ссылки на страницы тегов. Текст ссылки берется из параметра Пункт меню (menutitle), если оно не заполнено, то из заголовка.

  1. Вставьте сниппет Tags на страницу со статьей:
[[Tags? &input=`[[*tags]]`&tagsPage=`6`]]

Параметр tagsPage передает в сниппет номер ресурса «Теги», созданного в пункте 2.

  1. Создайте дочерние ресурсы для ресурса «Теги», пример заполнения свойств:

Страница тега является обычным ресурсом и поэтому вы можете настраивать её как угодно, менять заголовок, добавить параметры keywords, description и т.п. На данном сайте используется именно такой способ тегирования статей.

Комментарии 18

  1. Сергей Зотиков

    Если нужно кроме самих тегов вывести кол-во их использования, например, для визуального оформления блока, то можно использовать небольшой сниппет, о нем я написал небольшую заметку: MODx облако тегов (https://myitx.ru/10016)

  2. DrumminMan

    Вопрос, а реализовать указание тегов непосредственно в момент публикации статьи с помощью этого инструментария возможно? Т.к. из вышеописанного способа я вижу пока только возможность использования заранее вбитых в систему тегов.

    1. Сергей Зотиков

      Смысл тегирования в подготовке страницы тега для поискового продвижения.
      Если Вам не нужна такая оптимизация, то можете создать TV другого типа (тег), создать ресурс (страницу) на которой вставить сниппет для вывода всех статей по тегу. Код сниппета не привожу, его можете написать по аналогии с мои, который выводит блок тегов: MODx облако тегов (https://myitx.ru/10016)

      1. DrumminMan

        Да, еще такой вопрос. Поправьте, если не прав — для вывода тегов материала непосредственно на странице материала мы просто подключаем к шаблону этого материала TV tags, ну и указываем их в этом TV? А то у меня тут странность какая то вылезла — после проделывания всех вышеописанных манипуляций, добавляю сниппет на страницу, выставляю теги — и в итоге получаю страницу с пустым head и body. В head вообще только один метатег с названием сайта. На страницах материалов без выставленных тегов все как и раньше было, без изменений.

        1. Сергей Зотиков DrumminMan

          Да, все верно.
          Попробуйте удалить сниппет tags из чанка, если страница начнет нормально отображаться, то проверьте код сниппета.

          1. DrumminMan Сергей Зотиков

            да, судя по всему, дело в сниппете, но вот в чем конкретно… при ctrl-c/ctrl-v трудно ошибиться, однако… значение tagsPage по умолчанию на свое поменял, естественно…

          2. DrumminMan Сергей Зотиков

            И что самое странное, никаких ошибок в логе, вообще.
            /edit дебаггинг показал, что умирает где то на строке
            $tag = $res->toArray();, дальше скрипт не отрабатывает.

            1. Сергей Зотиков DrumminMan

              Проверил, код в статье один в один как на этом сайте.
              Не дублируется в начале <?php?
              Напишите в скайп, он есть в обратной связи, попробуем разобраться.

  3. DrumminMan

    Как выяснилось, проблема крылась в параметрах вывода TV, а именно разделителе — по умолчанию должна стоять запятая, у меня. почему то, не было вообще ничего. Соответственно, скрипт просто не мог понять, что ему за набор цифр пытаются скормить.
    А Сергею спасибо и за метод, и за помощь)

  4. Андрей

    Помогите, пожалуйста. Сделал все по инструкции. Хочу вывести несколько тегов на странице, несколькими запросами pdoResources, меняю только tags==11, tags==12 итд

    [[pdoResources?
    &parents=`0`
    &tpl=`@INLINE [[+pagetitle]] `
    &tvFilters=`tags==10`
    ]]

    При этом один и тот же ресурс может быть в нескольких разных тегах, точнее несколько тегов на один ресурс. Не работает. Что делать?
    Если по 1 тегу у ресурса, то все прекрасно работает

    1. Андрей

      Нужно разобрать вот эту строчку [tv.tags] => 10||11||12
      Как выбрать из нее tags==10?

      1. Сергей Зотиков

        В 1 пункте в описание параметров указано, что надо использовать в параметре tvFiltersOrDelimiter, вам нужно заменить [[*id]] на нужный ID. А в параметре tvFilters указывается некое подобие регулярного выражения, оно позволяет найти статьи (ресурсы) с множественным значением поля теги ([tv.tags] => 10||11||12).

        Пример для получения всех статей (ресурсов) с тегом под ID 10:

        [[!pdoPage?
        &element=`getTickets`
        &parents=`0`
        &includeTVs=`tags`
        &tpl=`tpl.myTickets.list.row`
        &tvFiltersOrDelimiter=`^^`
        &tvFilters=`tags==10||%^^tags==%||10^^tags==%||10||%^^tags==10`
        ]]
  5. Иван

    Как вывести на странице товара только те тэги которые относятся только к этому товару?
    Естественно со ссылкой на страницу каждого тега.

    1. Сергей Зотиков

      Иван, в статье описана реализация, на странице будет выведен список тегов для конкретного ресурса(статьи/товара).

  6. Евгений

    А как сделать чтобы в списке статей (вывожу так [[Tags? &input=`[[+tv.pCategory]]`]] ) id выводились через запятую? У меня выводятся через || и сниппет не работает как надо…
    Пробовал в настройках вывода дополнительного поля выбрать Разделитель — "," все равно выводит через ||

    1. Сергей Зотиков

      Если не помогла настройка формата вывода, то можно в сниппете Tags в $input заменить все || на запятые через str_replace.

Поддерживаются `код`, **жирный**, *курсив* и блоки кода

Как оформить
ПишетеПолучится
`npm install`код в строке: npm install
```bash
npm install
npm run build
```
блок кода: три обратные кавычки — отдельной строкой до и после кода; язык подсветки (bash, php, sql) — по желанию, сразу после первых кавычек
**важно**важно
*термин*термин
https://example.comссылка: адрес достаточно вставить как есть
Наверх