DLSiblings: кольцевая перелинковка для Evo



DLSiblings — сниппет вывода соседних ресурсов для Evolution CMS (MODx Evo). Предназначен для организации множественной кольцевой перелинковки страниц сайта. Основан на сниппете DocLister, поэтому можно использовать все возможности ДокЛистера.

Немного теории
Что такое множественная кольцевая перелинковка? Сеошники наверняка знают о ней. А для тех, кто не знает — это схема перелинковкистраниц сайта, позволяющая неплохо поднять сайт по низкочастотным и СНЧ запросам.

*** Подробнее о кольцевой перелинковке читайте в моей статье: Схема перелинковки сайта под НЧ

Параметры сниппета
  • &renderSnippet ( DocLister | sgController ) сниппет, используемый для вывода, default DocLister
  • &prevQty — Кол-во выводимых соседей-предшественников, default 2
  • &nextQty — Кол-во выводимых соседей-последователей, default 2
  • все остальные параметры и шаблоны как в DocLister

Можно использовать унаследованные от DocLister (такие же, как у него): условия выборки &addWhereList и &filters, условия сортировки &orderBy, глубину выборки &depth, prepare-сниппеты и многие другие параметры и все шаблоны.

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

Шаблоны сниппета
Все шаблоны — точно такие же, как у DocLister. Плейсхолдеры в шаблонах — тоже точно такие же, как в DocLister. Если в качестве сниппета вывода указан sgController, то шаблоны и плейсхолдеры — точно такие же, как в sgController.

Установка
  • Сниппет находится на Гитхабе
  • Архив нужно скачать и установить через Extras («Установка из архива»).

Пример
[[DLSiblings?
   &idType=`parents`
   &parents=`[*parent*]`
   &ownerTPL=`@CODE:<ul>[+dl.wrap+]</ul>`
   &tpl=`@CODE:<li><a href="[+url+]">[+tv.h1+]</a></li>`
   &prevQty=`2`
   &nextQty=`2`
   &tvList=`h1`
]]


*** Больше примеров с кодом и пояснениями в моей статье: Примеры применения DLSiblings

Результат работы
В этом примере параметром &parents мы задаем выборку, в которой будем искать соседей — все документы, находящиеся в той же папке, что и текущий.

Результатом работы будет список ссылок на статьи, соседние по ИД для текущей.



Подробнее о сниппете DLSiblings читайте на моем сайте: Сниппет DLSiblings

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

UPD:
04.01.2019 Добавлена возможность выбирать сниппет для вывода — DocLister или sgController, добавлен соответствующий параметр &renderSnippet.

22 комментария

avatar
Если можно использовать все возможности ДокЛистер, то и filters можно? Что выведется, если надо вывести 4 соседних, а filters найдет всего пару документов?
avatar
Да, можно применять и filters, и addWhereList. и все остальное.

Если в итоговой выборке документов меньше, чем нужно вывести соседей, например соседей надо 4, а документов в выборке всего 2 — то выведутся эти 2 документа.

Скоро выберу время и напишу статейку с реальными примерами.
avatar
Добавлена возможность выбирать сниппет для вывода — DocLister или sgController, добавлен соответствующий параметр &renderSnippet.
avatar
А можно ли сделать так, что если выводится самый последний по времени документ, то в качестве последователей не брались бы документы из начала списка? В новостях не очень удобно. Публикуешь новость, а сниппет цепляет новости прошлых лет.
avatar
Дело в том, что тогда перелинковка перестанет быть кольцевой, и потеряется большая часть SEO-эффекта. Там вся соль как раз в кольце. Но в принципе я подумаю, может быть и сделаю параметр, разрешающий так делать.
avatar
С новостями временный выход был найден через фильтр по дате создания. Но за этим придется следить. Да и выход так себе… Т.е. возможность отключения кольца все же напрашивается.
avatar
А не проще ли тогда выводить обычным вызовом ДокЛистера, например, выводить 4 новости, более старших, чем текущая? типа
&addWhereList=`c.createdon < [*createdon*]`
&display=`4`
avatar
И что будет выводиться у последних 4 новостей?
Комментарий отредактирован 2019-01-06 15:57:07 пользователем tiptop
avatar
Не совсем понял вопрос. Смотря что запишете в шаблоне, то и будет выводиться.

[[DocLister?
&idType=`parents`
&parents=`[*parent*]`
&tpl=`<a href="[+url+]">[+pagetitle+]</a>`
&addWhereList=`c.createdon < [*createdon*]`
&display=`4`
]]


В данном примере будет выводиться ссылка на новость с анкором из pagetitle.
Комментарий отредактирован 2019-01-06 17:13:42 пользователем Aharito
avatar
Вот так (исправил) более универсально, и еще @CODE в шаблоне забыл в прошлом примере.

[[DocLister?
&idType=`parents`
&parents=`[*parent*]`
&tpl=`@CODE:<a href=[+url+]>[+pagetitle+] от [+date+]</a><br>`
&addWhereList=`c.createdon < [*createdon*]`
&dateSource=`createdon`
&dateFormat=`%d-%m-%Y`
&display=`4`
]]


Блин, 5 раз не мог нормально код сюда вставить ))
Комментарий отредактирован 2019-01-06 17:58:54 пользователем Aharito
avatar
Это если вы не используете отложенную публикацию. А если используете, то можно попробовать включить «Включить фильтры» (в конфиге) и использовать такую страшную конструкцию в addWhereList :)

[[DocLister?
&idType=`parents`
&parents=`[*parent*]`
&tpl=`@CODE:<p><a href=[+url+]>[+pagetitle+]</a> от [+date+]</p>`
&addWhereList=`if(pub_date=0,createdon,pub_date) < [*pub_date:ifempty=[*createdon*]*]`
&dateSource=`pub_date`
&dateFormat=`%d-%m-%Y`
&display=`4`
]]


Или же вместо этого просто написать обертку для вызова ДокЛистера.
avatar
Т.е. у самой свежей новости ничего не выведется.
avatar
У самой старой ничего не выведется. У самой свежей выведется 4 прошлых. Но ведь вы так и хотели.
avatar
Т.е. у всех будут выводиться только предшественники.
Нет, я не так хотел )) Мне нравится, что выводятся именно и предшественники и последователи. Просто у самой свежей новости при закольцовывании начинают цепляться старые новости. Для блога это хорошо, для новостной ленты нет.
Задача в принципе решается установкой временного интервала, чтобы дата создания/публикации была в пределах установленного интервала и вычислялась автоматически от текущей даты.
avatar
Но тогда все остальные новости, выпавшие за этот интервал так же выпадают из перелинковки.
Т.е. самый разумный вариант — это именно отмена цикла.
avatar
Тогда давайте все-таки определимся с четким ТЗ. Представим, что у нас в вызове DLSiblings установлены след. параметры:

&prevQty=`2`
&nextQty=`2`
&noRing=`1` // Отмена кольца


Куда будут идти ссылки для таких новостей?

— самая свежая новость (1-я): на 4 последующих (более старых),
— 2-я по свежести: на 1-ю (предыдущую) и на 3 последующих,
— 3-я по свежести: на 2 предыдущих и на 2 последующих.

Так вы хотели сделать? Если нет, напишите, как именно.
avatar
Или еще вариант:
— самая свежая новость (1-я): на 2 последующих (более старых),
— 2-я по свежести: на 1-ю (предыдущую) и на 2 последующих,
— 3-я по свежести: на 2 предыдущих и на 2 последующих.
avatar
Хороший вопрос )) Тоже над этим думал.
С точки зрения верстки/дизайна/продвижения, лучше первый вариант, т.е. если место отведено под 4 ссылки, то вынь да положь 4.
Но с точки зрения реализации, второй вариант мне кажется гораздо проще сделать.
Решение за автором.
avatar
А можно ввести еще параметр
&fill=`0` &fill=`1`
1 — при отсутствии нужного количества предшественников или последователей у крайних документов, добирать с противоположной стороны.
0 — не добирать

Но это уже совсем заморочки ))
avatar
Там уже пара пожеланий есть, главное не перегрузить, не переусложнить параметрами простой сниппет, а то человек сразу и не поймет, что к чему :)

Как руки дойдут — сделаю отключение кольца.
avatar
prevnextpage тоже справляется с этой задачей на ура )) Но следующий раз попробую это решение, в идеале бы в extraz его
avatar
Prev-next не делает кольцо, насколько я помню. То есть он не связывает последний и первый документы. Кроме того, там не задать кол-во колец, и он не умеет шаблонизировать.

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

А за отзыв — благодарю, но в Экстрас Дмитрий вносит, если сочтет нужным — внесёт :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.