[SeoFilter] долгожданное обновление: меню, sitemap
[ купить дополнение ] [ демо ] [ документация ]
Выкладываю долгожданное обновление SeoFilter со сниппетами для формирования меню и карты сайта.

Кто ещё не знаком с SeoFilter, рассказываю его возможности.
Компонент позволяет создавать виртуальные страницы с красивым постоянным адресом по любым полям ресурса, товара, включая дополнительные поля(TV) и поля, значения которых хранятся в других таблицах. Также можно использовать одновременно несколько полей для формирования страниц.
Для виртуальных страниц предусмотрено динамическое формирование заголовков, контента с автоматической подстановкой значений полей с возможностью их склонения по падежам и с подсчётом количества ресурсов, удовлетворяющих условиям станицы.
Всё это может работать даже через AJAX совместно с mSearch2 или без него.
Подробнее про все возможности в первом анонсе и документации.
А в этом обновлении два новых сниппета и небольшие изменения в коде:
! Важно ! Отличается от pdoMenu тем, что за сформированную ссылку на страницу здесь отвечает параметр [[+url]], а за её название параметр [[+name]].
Вообще можете задавать пустые чанки и проверять что можно использовать :) Параметров, которыми можно управлять формированием меню много, что я наверно и не все проверил) Можно вообще не указывать параметры и получить все ссылки. Но вот основные:
1. Пример с группировкой на отдельной странице с исключением «пустых» страниц.
Самый первый скриншот.
2. Пример с вложенностью ссылок от двух ресурсов

3. Меню только первого уровня с сортировкой по количеству

В pdoSitemap для параметра tplWrapper на демке я использовал чанк. Его содержимое:
! Важно ! При совместном использовании на одной странице нужно задавать пустой параметр forceXML, чтобы не было конфликтов заголовков header.

Теперь не нужно вызывать дополнительные сниппеты для названия ссылки, так как в одном из предыдущих обновлений для всех ссылок правила (виртуальных страниц) можно задавать шаблон для формирования названия.
Если же какой-то цвет исключается правилом 22 (цвет + категория) или ссылка отключена, то будет поиск по правилу 17 (категория). Оно здесь специально стоит последним.
Меню и карта сайта кэшируются по-умолчанию на час. Подсчёт ресурсов дорогая операция на запросы, так как для каждой ссылки прогоняется. Но по времени у меня даже первый запуск не особо долгий, но всё сильно зависит от количества ссылок.
Описал, что вспомнил. Документация будет позже, а пока задавайте вопросы, если есть :)
Выкладываю долгожданное обновление SeoFilter со сниппетами для формирования меню и карты сайта.

Кто ещё не знаком с SeoFilter, рассказываю его возможности.
Компонент позволяет создавать виртуальные страницы с красивым постоянным адресом по любым полям ресурса, товара, включая дополнительные поля(TV) и поля, значения которых хранятся в других таблицах. Также можно использовать одновременно несколько полей для формирования страниц.
Для виртуальных страниц предусмотрено динамическое формирование заголовков, контента с автоматической подстановкой значений полей с возможностью их склонения по падежам и с подсчётом количества ресурсов, удовлетворяющих условиям станицы.
Всё это может работать даже через AJAX совместно с mSearch2 или без него.
Подробнее про все возможности в первом анонсе и документации.
А в этом обновлении два новых сниппета и небольшие изменения в коде:
sfMenu — формирование меню
Первый и самый функциональный это sfMenu. Для формирования меню создал новый класс. Очень многое взято из pdoMenu, в том числе почти вся поддержка классов. Очередное спасибо Василию. Мой код, пока не такой изящный, но стараюсь делать всё красиво. Всю документацию напишу позже.! Важно ! Отличается от pdoMenu тем, что за сформированную ссылку на страницу здесь отвечает параметр [[+url]], а за её название параметр [[+name]].
Вообще можете задавать пустые чанки и проверять что можно использовать :) Параметров, которыми можно управлять формированием меню много, что я наверно и не все проверил) Можно вообще не указывать параметры и получить все ссылки. Но вот основные:
- rules — список правил, чьи ссылки нужно использовать в меню; (можно с минусом)
- parents — список страниц, к которым привязаны правила; (можно с минусом)
- urls — отдельно id виртуальных страниц из таблицы url; (можно с минусом)
- countChildren — подсчёт ресурсов(товаров) которые будут на странице;
- mincount — минимальное количество ресурсов для включения ссылки в меню;
- sortcount: — сортировка по количеству ресурсов, приоритетнее той что в sortby;
- relative — экспериментальная перестройка меню исходя из выбранной seo-страницы;
- nesting — виртуальное вкладывание ссылок в ссылки, попробуйте :) ;
- double — дублирование ссылок при вкладывании, так как могут относится к нескольким правилам, так сказать мультикатегории;
- nesting — виртуальное вкладывание ссылок в ссылки, попробуйте :) ;
- groupbyrule — группировка по правилам (отдельный чанк-обёртка tplGroup);
1. Пример с группировкой на отдельной странице с исключением «пустых» страниц.
Самый первый скриншот.
[[!sfMenu?
&countChildren=`1`
&groupbyrule=`1`
&sortby=`createdon`
&sortdir=`ASC`
&mincount=`1`
&parents=`9`
&tplGroup=`@INLINE <div class="col-sm-6"><h4>[[+name]] <small>[[+total]] ссылок</small></h4>[[+wrapper]]</div>`
&tplOuter=`@INLINE <ul[[+classes]]>[[+wrapper]]</ul>`
&tpl=`@INLINE <li[[+classes]]><a href="[[+url]]">[[+name]]</a> <nobr><span>([[+total]] [[+total:units=`товар|товара|товаров`]])</span><small> - [[+count]] [[+count:units=`просмотр|просмотра|просмотров`]]</small></nobr>[[+wrapper]]</li>`
]]2. Пример с вложенностью ссылок от двух ресурсов

[[!sfMenu?
&countChildren=`1`
&nesting=`1`
&double=`0`
&mincount=`2`
&parents=`9`
]]3. Меню только первого уровня с сортировкой по количеству

[[!sfMenu?
&countChildren=`1`
&sortcount=`1`
&sortby=`createdon`
&sortdir=`DESC`
&mincount=`1`
&parents=`9`
&level=`1`
]]sfSitemap — карта сайта
Сниппет создан на основе класса меню, поэтому поддерживает почти все те параметры, за исключением вложенности и группировки. Также здесь взято почти всё из pdoSitemap и использовать их можно совместно. Здесь напишу только этот пример, в остальном разобраться не сложно.В pdoSitemap для параметра tplWrapper на демке я использовал чанк. Его содержимое:
<?xml version="1.0" encoding="{'modx_charset' | option}"?>
<urlset xmlns="{$schema}">
{$output}
{$_modx->runSnippet('sfSitemap',['tplWrapper'=>'sitemap.output', 'countChildren'=>1, 'mincount'=>1, 'forceXML'=>''])}
</urlset>Где в сниппете sfSitemap в параметр tplWrapper написал чанк sitemap.output с содержимым {$output}. ! Важно ! При совместном использовании на одной странице нужно задавать пустой параметр forceXML, чтобы не было конфликтов заголовков header.
sfLink — обновление логики работы
Его смысл остался таким же, выводить ссылку при вводе id правила(или нескольких). Но код и формат использования стали лучше. Простой пример для того, чтобы вывести ссылку на сложную страницу. (у меня включён Fenom в шаблонах)Ссылка на категорию:
{foreach $_modx->resource.color as $cvet}
{'!sfLink'|snippet:[
'rules'=>'22,17',
'category'=>$_modx->resource.parent,
'cvet'=>$cvet
]}
{/foreach}Где-то выведет одну ссылку, где-то несколько: 
Теперь не нужно вызывать дополнительные сниппеты для названия ссылки, так как в одном из предыдущих обновлений для всех ссылок правила (виртуальных страниц) можно задавать шаблон для формирования названия.
Если же какой-то цвет исключается правилом 22 (цвет + категория) или ссылка отключена, то будет поиск по правилу 17 (категория). Оно здесь специально стоит последним.
Меню и карта сайта кэшируются по-умолчанию на час. Подсчёт ресурсов дорогая операция на запросы, так как для каждой ссылки прогоняется. Но по времени у меня даже первый запуск не особо долгий, но всё сильно зависит от количества ссылок.
Описал, что вспомнил. Документация будет позже, а пока задавайте вопросы, если есть :)
Комментарии: 62
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Дублями вы называете то, когда одна страница доступна по нескольким адресам?
Если так, то в системных настройках SeoFilter можно включить переадресацию на страницу с нужным окончанием (слэш, .html и т.д).
В чанке ссылки (параметр tpl) вместо плейсхолдера [[+url]] можете прописать так:
При этом чанк ссылки в таком варианте лучше не в inline формате использовать.
Или же в синтаксисе Fenom: (что приятнее выглядит)
P.S. Эта инструкция для тех, у кого в качестве суффикса контейнера пустое значение.
спасибо.
Заодно поставьте mSearch2, miniShop2 и пройдите Быстрый старт SeoFilter
Проблем с совместимостью пока ещё не бывало.
Раз задались таким вопросам — то на 99% дополнение Вам подойдёт)
s11324
EeYrtfL6AqMZ
Для этого предусмотрен сниппет sfLink.
seofilter_title
А в каком именно сниппете?
Если в SEO шаблонах правила, то вот так:
Здесь $id — это id страницы, куда относится правило.
А сама настройка seofilter_title отвечает за то, чтобы подставлять оригинальный заголовок страницы, когда, например, будет выбрано много значений одного поля.
Либо же можете передавать как параметры:
Например, для всех категорий каталога одежды сформирован один стиль генерации description (default), но при указании индивидуального описания и в фильтре при возврате к товару без фильтра, description остаётся как при индивидуальном, но уже не default т.к. он генерировался в другом месте и брался не из поля.
Вот есть ли возможность вернуть значение к default?
Как вариант, можете сделать ТВ поле, куда можете записать свой вызов сниппета для формирования description и в системных настройках для поля description задать это ТВ поле, для подстановки по умолчанию.
Я думаю было бы не плохо в системных настройках сделать возможность указания сниппета по обработке seo данных при возврате значений на default или что-то подобное.
Думал когда-то над тем, чтобы сделать там возможность писать @INLINE чанки, где можно будет и сниппеты на Fenom запускать, но что-то взвесил все за и против, решил остаться на одном варианте.
Но так как много категорий может быть разных — это не самый удобный вариант.
Я просто всё равно не понимаю, что у Вас там по умолчанию делает сниппет?)
Берёт значение из description и изменяет его?
Или в самом description какие нибудь параметры-плейсхолдеры, выставляемые другими сниппетами? Если так, то все возвращаемые текстовые шаблоны (даже для страниц по умолчанию) через AJAX могут обрабатываться сниппетом из настройки prepareSnippet.
Вот пример сниппета обработчика:
И мне нужно вернуть именно такой дефолт.
И ещё одно, например, у страницы фильтра есть контент а у дефолтной нет, но чтобы текст при переходе на дефолт пропадал приходится в каждой категории вставлять пустые символы.
А если кому-то наоборот, не надо, чтобы контент пропадал?)
Какое решение Вы можете предложить, чтобы всех устроило?
С компонентом точно можно создать страницы производителей, производителей с категориями, привязав это к родительской категории.
Ну и меню можно сформировать на разделы, с функцией относительности или же изначально создать правила, ограничив их по производителям.
В целом ответ, да, можно)
Если не разберётесь как — напишите в поддержку, сделаю пример именно для вашего сайта.
У меня был сниппет который разбирал текущий url и если там присутствовал вопросительный знак возвращал канонический адрес страницы. Т.е это site.com/a?raz=dva превращал в это
Установил сеофильтр, и думал он будет возвращать в сниппет для преобразования site.com/a/dva, а он все равно возвращает site.com/a?raz=dva
В принципе можете прописать туда плейсхолдер:
Теперь о проблеме. Я пробовал сделать через сниппет sfMenu меню. И хотелось сделать его так, чтобы пустые категории не выводились. И тут я столкнулся с проблемой. У меня есть составные разделы. К ним привязано несколько полей. Для таких разделов сниппет неправильно считает кол-во вложенных товаров, если фильтровать по msProductOption. Он учитывает только одно значение, а остальные игнорирует.
Я решил эту проблему изменением функции countChildren. Вот мое решение gist.github.com/Kookabura/e9ef4c0f94faa8deaf1fe6e02c41d1d7. Правки в коде в строках 18-21, 30-33, 70-82.
Посмотрите, пожалуйста, у себя. Если решение вам понравится, то включите в следующее обновление.
Протестирую у себя и добавлю)
Каталог->подкатегории (>10)
вывел я их селектом, кое как разобрался, конечно :-)
Но, теперь выявилась проблема, при обновлении страницы пропадает заголовок, он просто пустой. Далее, ссылка формируется такая же, как и реальная ссылка с подкатегорией товаров. И там, оказывается, вообще не отображается заголовок h1. Решил я вопрос таким образом
Но, это же стоит и в title, каким образом можно исправить?
до этого стоял такой вариант.
Такой вариант точно не будет работать в заголовке:
Правильно так:
По таким вопросам лучше в поддержку на Modstore пишите modstore.pro/office/support#office/support/add
Ещё не было случая, где не удавалось помочь)
1) Одно SEO правило на все.
2) Возможность, указать — разделы где выводить то или иное правило (массово — проставление галок + поиск).
3) Было бы не плохо, сделать возможность, выводить несколько — sfMenu, указав одно правило, которое обрабатывается согласно текущего ID ресурса. C применением параметра rules.
4) Картинки
Вызов фильтра:
Создал «Поле Фильтра», поставил там галку «Поле типа „Слайдер“ (number фильтры)»
Создал «Правило SEO» для цены и в «Заголовок Н1» добавил примерно так — «лоауцло».
В общем при фильтрации по цене выдает вот такую ссылку: site.com/catalog/?price=526,829 и не производит замену заголовка. Можно вообще сделать ссылку site.com/catalog/price=526,829 без? и замену заголовка или такого нет в функционале? Для остальных полей все прекрасно работает и чпу и замена заголовка.
Так, видимо с последним обновлением mSearch2 (где добавлена фишка с динамическим слайдером) перестало работать (на демке тоже).
Раньше работало так:
Для полей с галочкой «Слайдер», нужно в ручную записывать необходимый диапазон в словарь.
(так как различных значений цен может быть очень и очень много).
Например, записав в словарь запрос «0,1000», можно отнести его к недорогим товарам.
Тогда когда в слайдере будут выбраны значения в диапазоне от 0 до 1000: («100,300», «526,829» и т.д.) url не будет меняться, но фильтрация по уточнению стоимости будет работать.
Этот функционал в ближайшем обновлении поправлю.
А если имеете ввиду что-то другое, то напишите, как это должно работать)
Но это уже не важно)) На самом деле поле цена было не принципиальным, я думал оно мне будет ломать заголовки в других правилах если его выбрать, но нет, если выбрать, например, чекбоксы Повод: День рождения и Интересы: IT-шник + отфильтровать по цене, то все норм
УРЛ: dev.site.com/catalog/podarok-den-rozhdeniya/dlya-it-shnik?price=485,829
И красивый динамический заголовок: Подарок на день рождения для IT-Шника
Но все-таки было бы круто, если бы вы добавили в доки пример для слайдера.
Вообще, я считаю, чем лучше доки с примерами, тем больше интереса к дополнению, так как людям понятней и меньше с бубном придется танцевать думая «Или я что-то не так делаю или так нельзя в принципе».
Желаю вашему дополнению стремительного развития, а вам побольше продаж;)
А краткая инструкция, что описал, пригодится тем, кто не обновлялся и чтобы мне самому потом документацию дополнить, скоро доберусь до этого.
Когда поправлю, то можно будет создать такие страницы:
dev.site.com/catalog/podarok-den-rozhdeniya/dlya-it-shnik/nedorogie
И красивые заголовки: «Недорогие подарки на день рождения для IT-Шника» :)
Напишите в тех поддержку, разберёмся)
Подскажите, как можно настроить компонент для работу с несколькими выборами одного фильтра?
Например, часто упоминаемый пример сайтов строительной тематики и фильтр по полю «Материал стен». Пользователь выбирает кирпич и газобетон и хочется сформировать заголовок Дома из кирпича и газобетона…
Вот пример s9767.h8.modhost.pro/category/cvet-zelenyij-i-korichnevyij/
Но конкретных сроков нет. Как хотелось бы, чтобы выглядела подобная автоматизация?
prntscr.com/oympu7
В общем почемуто считает что ничего не вернулось, доработала, тогда заработало.
Может кому пригодится
P.s. ну и за свой код мне стыдно, ему уже больше двух лет.
Всё мечтаю переписать и выпустить SeoFilter2)
Может какой то гон именно в php версии, такое бывает.
P.S. лучше, конечно же, в телеграм
как пофиксить?
Буду рад если кто откликнется и поможет. Не бесплатно конечно же)
Все проблемы, связанные с компонентом, решаются, как правило, бесплатно.
Напишите туда с доступами, посмотрю в чём дело.
Выводится не 3 ссылки, а все ссылки из правила
Обновитесь до SeoFilter 1.7.2 — вернул там поддержку параметра urls.
Ещё теперь можно писать параметры rules, parents и urls через массив:
При выборе определенных фильтров не меняется заголовк и описание, если точнее, то не работает если в фильтре два слова, например «T5 Transporter», если фильтр содержит одно слово, то все работает. h1 выводится нормально при любом фильтре, проблема только с description и title. С чем может быть связано?