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

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

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

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

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

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

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

      Тип ввода:

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

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

      @SELECT pagetitle, id FROM modx_site_content WHERE parent = 6

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

  4. Создайте новый сниппет:
    • Назовите его 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), если оно не заполнено, то из заголовка.

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

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

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

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

Комментарии ()

  1. Alex 01 декабря 2015, 14:46 # 0
    Как вывести облако тегов?
    1. Alex 02 декабря 2015, 15:16 # 0
      Вывел wayfinderом
      1. Сергей Зотиков 02 декабря 2015, 18:11 # 0
        Если нужно кроме самих тегов вывести кол-во их использования, например, для визуального оформления блока, то можно использовать небольшой сниппет, о нем я написал небольшую заметку: MODx облако тегов
        1. DrumminMan 12 января 2016, 16:11 # 0
          Вопрос, а реализовать указание тегов непосредственно в момент публикации статьи с помощью этого инструментария возможно? Т.к. из вышеописанного способа я вижу пока только возможность использования заранее вбитых в систему тегов.
          1. Сергей Зотиков 13 января 2016, 08:02 # 1 0
            Смысл тегирования в подготовке страницы тега для поискового продвижения.
            Если Вам не нужна такая оптимизация, то можете создать TV другого типа (тег), создать ресурс (страницу) на которой вставить сниппет для вывода всех статей по тегу. Код сниппета не привожу, его можете написать по аналогии с мои, который выводит блок тегов: MODx облако тегов
            1. DrumminMan 13 января 2016, 10:55 # 1 0
              Да, еще такой вопрос. Поправьте, если не прав — для вывода тегов материала непосредственно на странице материала мы просто подключаем к шаблону этого материала TV tags, ну и указываем их в этом TV? А то у меня тут странность какая то вылезла — после проделывания всех вышеописанных манипуляций, добавляю сниппет на страницу, выставляю теги — и в итоге получаю страницу с пустым head и body. В head вообще только один метатег с названием сайта. На страницах материалов без выставленных тегов все как и раньше было, без изменений.
              1. Сергей Зотиков 13 января 2016, 12:391 # 1 0
                Да, все верно.
                Попробуйте удалить сниппет tags из чанка, если страница начнет нормально отображаться, то проверьте код сниппета.
                1. DrumminMan 13 января 2016, 13:33 # 1 0
                  да, судя по всему, дело в сниппете, но вот в чем конкретно… при ctrl-c/ctrl-v трудно ошибиться, однако… значение tagsPage по умолчанию на свое поменял, естественно…
                  1. DrumminMan 13 января 2016, 14:481 # 1 0
                    И что самое странное, никаких ошибок в логе, вообще.
                    /edit дебаггинг показал, что умирает где то на строке
                    $tag = $res->toArray();, дальше скрипт не отрабатывает.
                    1. Сергей Зотиков 13 января 2016, 15:00 # 1 0
                      Проверил, код в статье один в один как на этом сайте.
                      Не дублируется в начале "<?php"?
                      Напишите в скайп, он есть в обратной связи, попробуем разобраться.
            2. DrumminMan 13 января 2016, 16:24 # 0
              Как выяснилось, проблема крылась в параметрах вывода TV, а именно разделителе — по умолчанию должна стоять запятая, у меня. почему то, не было вообще ничего. Соответственно, скрипт просто не мог понять, что ему за набор цифр пытаются скормить.
              А Сергею спасибо и за метод, и за помощь)
              1. Андрей 10 декабря 2016, 08:26 # 0
                Помогите, пожалуйста. Сделал все по инструкции. Хочу вывести несколько тегов на странице, несколькими запросами pdoResources, меняю только tags==11, tags==12 итд
                [[pdoResources?
                &parents=`0`
                &tpl=`@INLINE [[+pagetitle]] `
                &tvFilters=`tags==10`
                ]]
                При этом один и тот же ресурс может быть в нескольких разных тегах, точнее несколько тегов на один ресурс. Не работает. Что делать?
                Если по 1 тегу у ресурса, то все прекрасно работает
                1. Андрей 10 декабря 2016, 09:24 # 1 0
                  Нужно разобрать вот эту строчку [tv.tags] => 10||11||12
                  Как выбрать из нее tags==10?
                  1. Сергей Зотиков 09 января 2017, 23:52 # 1 0
                    В 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`
                    ]]
                2. Иван 05 мая 2017, 06:04 # 0
                  Как вывести на странице товара только те тэги которые относятся только к этому товару?
                  Естественно со ссылкой на страницу каждого тега.
                  1. Сергей Зотиков 05 мая 2017, 12:15 # 1 0
                    Иван, в статье описана реализация, на странице будет выведен список тегов для конкретного ресурса(статьи/товара).
                  2. Евгений 27 октября 2018, 23:29 # 0
                    А как сделать чтобы в списке статей (вывожу так [[Tags? &input=`[[+tv.pCategory]]`]] ) id выводились через запятую? У меня выводятся через || и сниппет не работает как надо…
                    Пробовал в настройках вывода дополнительного поля выбрать Разделитель — "," все равно выводит через ||
                    1. Сергей Зотиков 29 октября 2018, 21:48 # 1 0
                      Если не помогла настройка формата вывода, то можно в сниппете Tags в $input заменить все || на запятые через str_replace.