Поиск материалов по тегам Seo.Pro

Добрый вечер.
Раньше я юзал отдельный плагин, чтобы выводить теги материала и искать материалы по тегу. Что-то меня немного раздражало, что я заполняю поле keywords у Seo.Pro и ещё в отельное поле пишу ключевые слова для поиска (поле на основе tvSuperSelect). И решил, что нужно оставить поле keywords и организовать поиск по ключевым словам именно на основе поля keywords плагина Seo.Pro.
Код вывода тега материала для текущей страницы:
{set $keywords = ('seoPro.keywords' | placeholder) | esplit}
                        {if ('tv.get_tags' | resource) == '1' && $keywords.0}
                            <hr>
                            <div class="row justify-content-center">
                                {foreach $keywords as $keyword}
                                    {include "tpl.Tag" tag=$keyword}
                                {/foreach}
                            </div>
                        {/if}
Шаблон tpl.Tag:
<a class="chip m-2" href="{76 | url}?tag={$tag}">#{$tag}</a>
, где тут 76 id ресурса страницы «Материалы по тегу».

Код страницы «Материалы по тегу»:
{if $.get['tag']?}
    <div class="row">
        {set $tag = $.get['tag']}
        {'!pdoPage@Pagination' | snippet : [
            'element' => 'pdoResources',
            'parents' => '29, 6, 28',
            'sortby' => 'publishedon',
            'sortdir' => 'DESC',
            'leftJoin' => '{ "SeoPro": { "class": "seoKeywords", "on": "modResource.id = SeoPro.resource" } }',
            'select' => '{ "modResource": "*", "SeoPro": "keywords" }',
            'where' => '{ "published:=": "1", "AND:SeoPro.keywords:LIKE": "%, '~ $tag ~',%", "OR:SeoPro.keywords:LIKE": "%,' ~ $tag ~ ',%", "OR:SeoPro.keywords:LIKE": "%, ' ~ $tag ~ '", "OR:SeoPro.keywords:LIKE": "%' ~ $tag ~ ',", "OR:SeoPro.keywords:LIKE": "% ' ~ $tag ~ ' %" }',
            'groupby' => 'modResource.id',
            'limit' => ('mobile' | mobiledetect ? '10' : '20'),
            'pageLimit' => ('mobile' | mobiledetect ? '3' : '5'),
            'pageVarKey' => 'material',
            'pageNavVar' => 'material.nav',
            'tplWrapper' => '@INLINE <ul>{$output}</ul>',
            'tpl' => '@INLINE <li><a href="{$uri}"><span class="grey-text mt-4 mb-3">{$pagetitle}</span></a></li>',
            'showLog' => 0,
        ]?: 'Ресурсов по данному тегу не найдено'}
    </div>
    {'material.nav' | placeholder}
{else}
    Укажите тег для выборки документов
{/if}
, где в parents указывается в каких ресурсах (папках) искать.

По большому счёту заметку я создал для себя, чтобы сохранилась работа, но может кому-то понадобиться…
Дмитрий
22 сентября 2020, 19:09
modx.pro
257
+2

Комментарии: 7

Evgeny Gromin
22 сентября 2020, 20:40
0
@Дмитрий лишнее убери

'where' => '{ "published:=": "1", "AND:SeoPro.keywords:LIKE": "%, '~ $tag ~',%", "OR:SeoPro.keywords:LIKE": "%,' ~ $tag ~ ',%", "OR:SeoPro.keywords:LIKE": "%, ' ~ $tag ~ '", "OR:SeoPro.keywords:LIKE": "%' ~ $tag ~ ',", "OR:SeoPro.keywords:LIKE": "% ' ~ $tag ~ ' %" }',
    Eugene Generalov
    23 сентября 2020, 16:21
    0
    Если это не вопрос, а заметка, то лучше перенести в соответствующий раздел
      SEQUEL.ONE
      25 сентября 2020, 17:54
      0
      Рейтинга у человека не хватает, чтобы в другие разделы размещать 🤷‍♂️
        Василий Наумкин
        25 сентября 2020, 22:35
        0
        Автор, похоже, не в курсе, что именно в запросе LIKE заменяет %. Подсказка: выборка очень не оптимальна.

        Более того, при совпадении ключевого слова будут выведены и неопубликованные ресурсы. Ну и создание отдельного чанка tpl.Tag при использовании Fenom тоже под большим вопросом.

        Так что рано это куда-то размещать.
          Дмитрий
          25 сентября 2020, 23:48
          0
          Ну извините)
          Как умею)
          В where я указал «published:=»: «1». Почему будет выводить неопубликованные?
            Василий Наумкин
            25 сентября 2020, 23:54
            0
            Потому что далее идёт OR.

            И то, что перед этим есть AND не имеет никакого значения, потому что условие не вложенное.

            Можно сделать &showLog=`1` и посмотреть, что получается в результате.
              Дмитрий
              26 сентября 2020, 00:01
              0
              И как условие сделать вложенным?
              A && (B || C || D || E)
              ?
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      7