Разработка сайтов и интернет-магазинов Блог веб-разработчика

Как сделать теги tags для сайта на modx revolution

Изображение сгенерированно ИИ и принадлежит qwen.ai
Изображение сгенерированно ИИ и принадлежит qwen.ai

Как работают хештеги в modx revolution?

У ресурса есть теги (по-суте это ссылки с параметром, значение которого будем искать в ресурсах). Кликаем по тегу, перекидывает на страницу, где срабатывает скрипт по параметру и отдает ресурсы, у которых этот тег присутствует.

  1. В админке создаю ТВ с типом ввода Тег. В "Параметрах ввода" нужно указать в Тип ввода - Авто-метка.</li>
  2. У ресурса проставляю теги через запятую, которые подходят по смыслу.</li>

Вывод тегов на странице ресурса

  1. Создаю сниппет с названием, например tagsOnPage
    <?php
    $r = $modx->getObject('modResource',['id'=>$id]);
    $tags = explode(',',$r->getTVValue('tags'));
    $out = '';
    foreach($tags as $tag){ $out.= " <a href=\"/tags?t=$tag\">#$tag</a> ";
    }
    return $out;
  2. Размещаю его в шаблоне { '!tagsOnPage' | snippet}

Вывод ресурсов, в которых упоминается тег на странице /tags

  1. Если страницы /tags нет, то нужно её создать.
  2. На странице tags нужно обработать значение параметра t. Конечно, пишем сниппет, который в вернёт список id ресурсов, у которых в TV-tags присутствует пареметры переданный в t

Создаю сниппет tagResourcesList

<?php
// 1. Получаем и очищаем параметр из URL
$tag = isset($_GET['t']) ? trim($_GET['t']) : '';

if (empty($tag)) { 
    return 'Параметр t не указан';
}

// 2. Получаем объект TV-параметра
$tv = $modx->getObject('modTemplateVar', array('name' => 'tags'));
if (!$tv) { 
    return 'TV-параметр tags не найден';
}
$tvId = $tv->get('id');

// 3. Формируем базовый запрос
$query = $modx->newQuery('modResource');
$query->select('modResource.id');
$query->where(array(
    'published' => true,
    'deleted' => false,
));

// 4. Подключаем таблицу
$query->leftJoin('modTemplateVarResource', 'TV', "TV.contentid = modResource.id AND TV.tmplvarid = ");

// 5. Добавляем условие выборки
$query->where(array(
    'TV.value:LIKE' => "%%"
));

/* 
   Если ваши теги разделены запятыми (например, "modx,SEO"), 
   простой LIKE "%SEO%" найдет и "modx,SEO", и "SEO-продвижение". 
   Если вам нужно СТРОГОЕ совпадение отдельного тега (чтобы "EO" не находил "SEO"), 
   закомментируйте блок выше (п.5) и раскомментируйте строку ниже:
*/
// $query->where("FIND_IN_SET({ $modx->quote($tag)}, REPLACE(TV.value, ' ', '')) > 0");

// 6. Выполняем запрос
$resources = $modx->getCollection('modResource', $query);

// 7. Формируем вывод
$output = array();
foreach ($resources as $resource) {  
    $output[] = $resource->get('id');
}

return !empty($output) ? implode(',', $output) : 'Ресурсы не найдены';
  1. Вывожу ресурсы тега через созданный сиппет tagResourcesList
{ set $taglist = '!tagResourcesList' | snippet}
{ '!pdoResources' | snippet : [ 'parents' => 1, 'resources'=> $taglist, 'tpl' => 'post, ]}
Теги:

❗️ Код и технические решения в блоге — это исключительно субъективное мнение автора, предоставленное по принципу «как есть» (AS IS) в ознакомительных целях. Не является готовым продуктом или призывом к действию. Автор не гарантирует работоспособность и безопасность кода в вашем окружении. Вы обязаны самостоятельно тестировать решения перед использованием в продакшене. Автор снимает с себя любую ответственность за потерю данных, сбои систем, уязвимости, финансовые убытки или любые другие последствия, возникшие из-за применения материалов блога.

Обсудим вашу задачу и рассчитаем стоимость?

Отвечаю лично в течение пары часов. Никакого спама и автоматических рассылок.