[SeoFilter] 1.5.0 - привязка правила на несколько страниц, ссылки в 1 уровень, интеграция с Tagger

[ купить дополнение ] [ демо ] [ документация ]

Рад представить новую версию компонента SeoFilter — 1.5.0.

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

Каждое такое обновление будет описываться в отдельном топике, так как изменений от версии к версии много.

Сейчас уже тяжело составить краткое описание для новичков, но если вы что-то фильтруете у себя на сайте или хотите — то SeoFilter вам поможет сделать это ещё полезнее, получив множество релевантных страниц для поисковых запросов с постоянными дружественными URL-адресами :)

Итак, сегодня на повестке дня:
  • Привязка правила к нескольким страницам (ура!)
  • Возможность создавать SEO-страницы в один уровень (и даже от корня сайта)
  • Интеграция с компонентом Tagger — интересный компонент для тегов без TV-полей
  • Новые функции сниппетов sfWord и sfLink
  • Больше удобств для подсчётов результатов
  • При создании, редактировании и пересчёте правил всплывают информативные окошки
  • Добавлен класс seoPage для более точных ссылок в пагинации pdoPage на SEO страницах
  • Панель виджетов, вставка таба с правилами и SEO-ссылками на страницу редактирования ресурса, автоматическая работа со множественными значениями, интеграция с ShopKeeper и TagManager и многое другое пока ещё в планах, но не стесняйтесь, пишите что нужно в первую очередь — всё можно сделать :)

Привязка правила к нескольким страницам


С давних времён в компоненте правило привязывалось только к одному ресурсу. Это было удобно тем, у кого категорий не больше 10 и дико не удобно, когда больше 50-100 категорий товаров.

Так как в текстах правила через Fenom можно использовать все поля ресурса через конструкцию {$id|resource:'pagetitle'} (а вот здесь пришла идея сразу передавать весь массив полей ресурса без дополнительных запросов), то почему бы генерацию текстов не делать с полями ресурса?) При чём сам заголовок ресурса тоже можно получить в разных склонениях через sfWord, правда пока не слишком лаконично — если нужно, опишу как)

За активацию этой функции отвечает настройка seofilter_pro_mode. Естественно, такой режим, по умолчанию выключен. После активации желательно хорошенько почистить кэш и перейти к правилам.

Теперь при редактировании и создании правила вместо селекта для выбора одной страницы появится поле для ввода ID ресурсов, через запятую. Пример (кликабельно):


! Если ранее уже создали правила в обычном режиме к одному ресурсу, то ничего страшного, там будет прописан один ID.

И теперь после сохранения правила (для большей информации сохранил, поставив галочки на изменение названий и пересчёт результатов по ссылкам) всплывает информирующее окошко:

По которому сразу видно, сколько всего ссылок, сколько добавлено/удалено/оставлено и что есть и дубли (то есть с такими же полями есть правило для одной или нескольких страниц из списка).
Если ничего не поменяется — будет только текст об общем количестве ссылок.

По привязке правила к нескольким страницам рассказывать больше то и нечего, хотя было переделано в компоненте очень и очень много для поддержки этой функции) Про следующие пункты постараюсь расписать покороче.

Кстати, этот функционал дополнительно проспонсировали два человека — спасибо за поддержку!

Ссылки в один уровень


За этот функционал отвечают две настройки с разделителями.
seofilter_level_separator ("/") — разделитель между полями в одном правиле.
seofilter_between_urls ("/") — разделитель, который склеивает URL основной страницы и SEO-ссылки.
Можете дефис или хоть нижнее подчеркивание прописать везде — будет работать)
Есть один нюанс в том, что если изменить seofilter_level_separator там, где уже есть ссылки, то старые ссылки будут открываться по старому адресу с вложенностью. А новые правила и их ссылки будут без вложенности. Старые ссылки можно будет обновить просто открыв старые правила и пересохранив их.

Интеграция с компонентом Tagger


Tagger удобен тем, что это не TV поле, а полноценные таблицы в БД. Место для вывода таких полей можно выбрать в самом компоненте. Теги могут добавляться на лету или выбираться строго из базы. У тега есть значение, метка(Label), псевдоним — и если они заполнены, SeoFilter всё это увидит и добавит в свой словарь в таком виде.

Для интеграции нужно добавить новое поле в SeoFilter и выбрать класс Tagger. а в качестве ключа ID группы или псевдоним группы. А для интеграции Tagger с mSearch2 есть решение modx.pro/solutions/4517/, но я его немного подправил и чуть позже добавлю в комментариях к той записи.

Новые функции сниппетов sfWord и sfLink


Сниппет sfLink становится ещё удобнее для поиска ссылок по переданным параметрам на SEO-страницы.

Новые параметры для sfLink: pages — список id страниц, where — условие, as_name — что выводить в качестве названия.

Мой пример использования для вывода ссылок на товары по тегу.
{foreach $_modx->resource['tags'] as $option first=$first}{if $option?}{if !$first}, {/if}
        {'sfLink'|snippet:[
		'tags'=>$option,
		'pages'=>$_modx->resource.parent~',46341',
		'where'=>[
			'url'=>'{$tags}'
		]
	]}{/if}{/foreach} //не ставлю переносы, чтоб между ссылок не было пропусков
Сниппет вернёт ссылку на родительскую категорию, если существует такое правило с этой страницей, а если нет, то вернёт ссылку с тегом на ресурс 46341 (так как я достоверно знаю, что к этому ресурсу есть правило связанное с тегом).

В качестве where я прописал массив на Fenom, хотя можно и в JSON формате передать. Здесь url — это маска для генерации страниц. Так как к ресурсу 46341 может быть привязано множество правил с разными полями, то лучше ограничить условием, дабы точнее и быстрее найти правильную ссылку)

А сниппет sfWord теперь возвращает полностью массив для переданного слова, чтобы с помощью Fenom использовать необходимые склонения. Но помимо этого также остался параметр tpl для более удобной шаблонизации. И да, теперь параметр field_id(options) становится необязательным, но могут вернуться и слова из других полей, если их значение полностью совпадает.

Класс seoPage для ссылок в пагинации


Функцию убирания get-параметров из пагинации очень просил Денис и даже проспонсировал, благодарю!

Ранее ссылки на пагинацию с такой страницы: site.ru/telephony/krasnye (krasnye — SEO страница) были такими:
site.ru/telephony/krasnye?page=2&color=красные
а теперь такие: site.ru/telephony/krasnye?page=2

То есть убираются GET-параметры, которые участвуют в формировании SEO-страницы.

Для этого нужно переопределить/добавить системные настройки в pdoTools для класса pdoPage.
ключ pdoPage.class — прописать seofilter.seoPage
ключ pdopage_class_path — прописать {core_path}components/seofilter/model/

В классе seoPage переопределяется только метод makePageLink.

! Настройка не убирает get-параметры в пагинации через AJAX, только при обновлении страницы.

Удобства для подсчёта результатов

Перечислю просто списком:
  • Пересчитать результаты теперь можно правой кнопкой по слову, ссылку или правилу;
  • Добавлен файл пересчёта результатов для CRON — recount.php (/core/components/seofilter/recount.php);
  • Есть настройка, с значением в формате JSON условий для подстановки в новые правила;
  • Активирован строгий поиск по умолчанию в новых полях. Не рекомендуется изменять, чтобы например при поиске значений «iPhone 5» не выдавало результаты «iPhone 5s»;
  • Мелкие правки в классе подсчётов, убирающие повторный учёт ресурса;
  • Счётчик результатов для SEO-страницы обновляется, если количество отличается при новом поиске.

Планы по развитию


  1. Думаю сделать панель виджетов, которая будет давать сводное представление по работе компонента. Можно будет хоть графики там рисовать их переходов. Показывать сколько страниц с результатами. Возможны ли дубли. Есть ли ещё какие-то проблемы, может в системных настройках или что-то подобное. А также, чтобы какой-либо из виджетов на главную страницу админки можно было бы вынести.
  2. Вставку таба от SeoFilter для категорий, куда могут быть сгенерированы ссылки или же привязаны правила
  3. Интеграция с компонентом msProductsComposerSelection — недооценённый компонент по управлению фильтрами и условиями для mFilter2 и не только. Рекомендую присмотреться.
  4. Автоматическая работа с множеством значений одного фильтра, об этом писал ранее здесь modx.pro/components/14899/
  5. И ещё небольшой вагончик улучшений :)

Ну и по традиции приветствую любые вопросы, критику и пожелания :)


UPD: 23.05.2018

Немного изменений с полями для производителя


Много раз уже столкнулся с проблемами вокруг класса msVendor (производитель miniShop2).

Раньше чёрт меня дернул, пытаясь добавить удобства с добавлением поля производителя я добавил в пункт выбора класса msVendor. Почему-то подразумевая, что в поле ключ все будут прописывать «id», но нет)

Теперь же я убрал этот класс, так как он изначально нарушает логику работы. SeoFilter может работать с любыми классами, как и mSearch2. В том числе фильтровать их поля, значения.

Сам класс msVendor тоже может выступать как полноценный объект для фильтрации, сортировки и так далее, поэтому теперь производителя товара рекомендую добавлять только так:
  1. Жмём «Добавить поле»
  2. Пишем:
    • Название Производитель или как удобнее)
    • Класс: msProductData
    • Ключ: vendor
    • Синоним: vendor — то, что используете в качестве синонима в mFilter2
    • Ставим галочку на Значение в другой таблице и в появившихся полях:
    • Компонент: minishop2
    • Класс: msVendor
    • Поле для сопоставления: id
    • Поле, где хранится значение: name
  3. Проверяем по скриншоту, сохраняем и смотрим на значения в словаре :)


P.S. пока в функционале ничего не стал убирать, кто добавил msVendor — всё будет также работать, как раньше.
Евгений Шеронов
22 мая 2018, 19:05
modx.pro
3
3 568
+7
Поблагодарить автора Отправить деньги

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

Дмитрий
23 мая 2018, 01:05
+2
Евгений, круто! Один из самых мощных и быстроразвивающихся компонентов для modx. Большое вам спасибо!
    Николай Савин
    25 мая 2018, 12:08
    0
    Жень, когда ты все успеваешь то!
      Евгений Шеронов
      25 мая 2018, 13:25
      0
      Ох, если бы я всё успевал) Мне бы хотя бы половину от всего успевать))
      parabellum
      03 июня 2018, 17:06
      0
      Добрый день.
      Благодарим за отличный модуль и апдейты.
      В прошлом апдейте автор спрашивал нужно ли доработать хлебные крошки и в комментариях вроде как ответили что да. Подскажите, планируется провести работу в этом направлении, так как в этом есть необходимость для навигации самих пользователей с карточки продукта и тд.
      Спасибо.
        Евгений Шеронов
        04 июня 2018, 00:32
        0
        Спасибо!

        Про хлебные крошки с вложенностью имел ввиду, что на странице каталога для правил состоящих из нескольких полей можно постараться сделать)

        А вот со страницы товара — большой вопрос.
        Тут в принципе можно сделать, но скорее всего нужно будет построить pdoCrumbs до родителя, передав в параметр &to=`[[*parent]]`, используя шаблон последней ссылки таким же, как и у других ссылок.

        А потом сделать несколько вызовов sfLink, передавая параметры, чтобы получить необходимую ссылку.

        Но вообще да, можно конечно сделать сниппет sfCrumbs (обёртку над pdoCrumbs) для страницы товара, который будет пытаться построить максимальную вложенность SEO-страниц к странице родителю (или переданной категории).

        В этом сниппете уже получать все возможные поля ресурса, которые заведены в компонент SeoFilter и в зависимости от приоритета правил — строить вложенные хлебные крошки. Запросов прибавится, но так как это страница одного товара — будет почти не заметно.

        Подумаю над этой реализацией — если ещё кому нибудь нужно что-то подобное, пишите обязательно)
        Максим
        15 июня 2018, 18:43
        0
        Все никак руки не дойдут, посмотреть новую версию.
        Так что спрошу здесь.
        Можно ли в привязке к нескольким правилам, в мета-тегах доставать заголовок?
        Т.е. делать h1 вроде "{$pagetitle} компании {$vendor}"?
        Чтобы получались заголовки вроде «Носки компании Адидас», «Рубашки компании Адидас» и т.п.?

        Заранее спасибо =)
          Евгений Шеронов
          17 июня 2018, 16:55
          +1
          Да, конечно можно)
          Без этого и нельзя было бы сделать привязку правила к нескольким страницам.
          Только синтаксис не совсем стандартный, а вот такой:
          {$id|resource:'pagetitle'}
          В тексте тоже было:
          в текстах правила через Fenom можно использовать все поля ресурса через конструкцию {$id|resource:'pagetitle'}
            Максим
            17 июня 2018, 19:44
            0
            Когда-нибудь я приучу себя читать документацию от корки до корки =)
            Спасибо.
          Андрей
          14 июля 2018, 22:39
          0
          Добрый день. Озадачился созданием турбо страниц. Хочется вывести все, сгенерированные компонентом страницы также. Код такой:
          <?xml version="1.0" encoding="utf-8"?>
          <rss xmlns:yandex="http://news.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/" xmlns:turbo="http://turbo.yandex.ru" version="2.0">
          <channel>
          <title>{$_modx->config.site_name}</title>
          <link>{$_modx->config.site_url}</link>
          <description>{1 | resource : 'description'}</description>
          {'!pdoResources' | snippet : [
              'parents' => '2,3,4,5',
              'tpl' => '@FILE chunks/turborss.tpl',
              'includeContent' => 1,
              'limit' => 100,
          ]}
          </channel>
          </rss>
          Подскажите, как вывести сюда страницы, сформированые компонентом?
            Евгений Шеронов
            16 июля 2018, 18:18
            0
            Добрый день!

            Прям содержимое страниц вот так просто не вывести, потому что переменные в текстовых шаблонах на лету добавляются для каждой ссылки.

            Но самое простое, приспособить sfMenu под это дело, но придётся доработать класс, при этом если страниц много — то скорость загрузки серьёзно увеличится.

            Вообще можете написать в тех поддержку мне и уже там пришлите код чанка в turborss.tpl.
            Что-нибудь попробуем придумать)
            Игорь
            19 июля 2018, 15:45
            0
            Евгений, привествую!

            В каталоге при выборе параметров фильтра, изменяются метатеги заголовок и контент страницы.
            Но, если у новой страницы не заполнено, например, поле «introtext», то обновление конкретно этого контента не происходит и остаётся текст с предыдущей страницы.

            Т.е. контент страницы обновляется, только если его есть чем заменить.

            Вероятно, я упускаю что-то, подскажите пожалуйста.
              Максим
              20 августа 2018, 22:31
              0
              А у меня чет не появляются новые ссылки в таблице URL. В чем может быть проблема?
              Появляются, только если открыть и сохранить без изменений поле во вкладке «Поля фильтра».
                Alex
                08 сентября 2018, 20:22
                1
                0
                Здравствуйте. Обнаружил такую проблему, возможно я что-то не так делаю.
                Есть каталог Сад Огород. В нем категории «Пилы цепные», «Газонокосилки», «Мотоблоки» и тд. У каждого товара есть производитель (msVendor). И вот тут возникает проблема. Создаем поле фильтра для вендоров, создаем правило и назначаем это правило для страницы «Пилы цепные», сохраняем. И вот тут начинается беда.
                То есть, создаются УРЛы для раздела «Пилы цепные» с производителями, которых там нет и в помине. Например, пилы представлены двумя производителями — Honda, Hyundai, но также создаются и «левые» типа Пуберт, Макита и тд. То есть, осмелюсь предположить что компонент фигачит всех подряд вендоров, которые назначены товарам не ограничиваясь указанной страницей для правила. С любыми другими опциями та же беда, берутся значения со всех товаров. а не только с товаров указанной в правиле категории.
                Вот это вот дело очень мешает жить, во-первых, создаются страницы с пустыми результатами фильтрации, но это можно побороть соответствующей системной настройкой и будет 404. Во-вторых, и главных, вот эта куча мусора которого быть по идеи не должно очень мешает работать, так как из, например, созданных 150-ти строк в таблице УРЛ, реально нужны 15, остальное просто мешает. Я боюсь представить что будет если на реальном проекте я загружу 2000 товаров с кучей опций для фильтрации, я просто ничего не смогу найти в «таблице УРЛ».
                Еще заметил такой момент в сниппете sfMenu. Так как много мусорных УРЛ создается, как я описал выше, в «облаке ссылок» они также вылазят при выводе sfMenu и получается ссылки ведут на 404. Ок. Есть параметр mincount, задаю значение 1, и блин, вместе с УРЛами где результатов 0, также не выводятся УРЛы по которым результат 1. То есть, если я правильно понимаю, то дословно параметр mincount означает минимальное количество, то есть вывести ссылки с минимальным количеством результатов один и более. Но не работает. Выводится больше одного.
                Подитожу вопрос. Как сделать чтобы при создании правила, ссылки в таблице УРЛ создавались относительно товаров указанной страницы, а не брались значения всех товаров подряд из всех категорий на сайте?
                  Юрий
                  18 сентября 2018, 20:24
                  1
                  +1
                  Поддерживаю, у меня сотни пустых страниц сгенерировало, причем даже для страниц, у которых нет товара пока… на 6 правил для 15 категорий появилось больше 400 урл, большая часть из которых с пустым содержимым. Прийдется отказываться от компонента(((
                    Артем
                    13 декабря 2018, 16:49
                    0
                    Если б это была единственная проблема этого компонента(
                      Евгений Шеронов
                      13 декабря 2018, 16:57
                      0
                      Здравствуйте, что-то я упустил из вида комментарии выше.

                      Формируются все страницы по собранным значениям.
                      Нужно всего лишь разобраться с подсчётами, активировать настройку — отдавать 404 на пустых настройках.
                      И в таблицу урл можно даже не заходить.

                      P.S. Планирую добавить возможность не создавать пустые страницы.
                      Но в любом случае, нужно будет корректно настраивать подсчёты (то есть делать так, чтобы совпадали условия страницы и правил, корректно прописаны ключи, при множественных ТВ полях не стояла галочка строгий поиск, расширять класс подсчётов при использовании нестандартных полей, таблиц, классов)

                      Артем, какие ещё проблемы есть?
                      Над компонентом регулярно работаю и готовлю большое обновление.
                      Можете и на почту ответить, как будет удобнее.
                  Илья
                  17 декабря 2018, 16:02
                  0
                  Всем доброго времени суток! Вопрос такой, настроил правила, сам фильтр работает, в адресной строке всё отображается как надо, НО если обновить страницу, то вываливается 404 ошибка. Может подскажите, где может быть проблема?
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  18