суббота, 20 ноября 2010 г.

[Blogger.com] Скрипт для отображения списка похожих статей — обновленная версия

Новая версия скрипта для отслеживания похожих сообщений блога. Основные изменения:

  • Основная часть скрипта вынесена во внешний файл. Теперь не нужно помещать в шаблон больше двух страниц (10 килобайт) текста скрипта.
  • Добавлен плоский режим без разделения выдачи по ярлыкам.
  • Добавлена возможность сортировать ярлыки по вручную задаваемому приоритету.
  • Реализована возможность игнорировать ярлыки низкого приоритета, если сообщению назначены ярлыки высокого приоритета.

Принцип работы

Скрипт имеет 2 режима работы: с группировкой ссылок на посты по ярлыкам и плоский (общим списком). Принцип работы скрипта в режиме группировки:

  • Берётся список ярлыков текущего поста, из него отбрасываются ярлыки, занесенные в настройках в список игнорируемых.
  • Запрашивается с блога информация о постах, соответствующих оставшимся ярлыкам. (Параметр relposts_queryPostsPerLabel указывает, по сколько постов запрашивать для каждого ярлыка).
  • Полученные посты группируются по ярлыкам с учётом настроек переименования ярлыков.
  • В каждой группе удаляются лишние посты, если их количество превышает указанное в параметре relposts_showPostsPerLabel
  • Каждой группе постов назначается приоритет, заданный в настройках.
  • Группы ссылок на посты показываются на странице. Группы отображаются в порядке их приоритета, заданного в настройках. (Если у двух групп приоритет одинаков, первым показывается группа, идущая раньше по алфавиту.)
  • При показе групп проверяются параметры relposts_showLabels и relposts_prioDelta, и при выполнении соответствующих условий, вывод прекращается. (Подробнее ниже, в описании настроек.)

В плоском режиме скрипт работает иначе:

  • Берётся список ярлыков текущего поста, из него отбрасываются ярлыки, занесенные в настройках в список игнорируемых.
  • Запрашивается с блога информация о постах, соответствующих оставшимся ярлыкам. (Параметр relposts_queryPostsPerLabel указывает, по сколько постов запрашивать для каждого ярлыка).
  • Каждому посту назначается приоритет, равный сумме приоритетов ярлыков, по которым он пересекается с текущим постом. (Т.е. если у текущего поста ярлыки А, Б и В, и некий пост имеет ярлыки А, В и Г, то этот пост получит приритет, равный сумме приоритетов для ярлыков А и В.)
  • Посты сортируются по приоритету.
  • На странице отображаются ссылки на посты. Количество задаётся параметром relposts_showPostsPlainMode.

Настройка и установка

Аналогично изначальной версии скрипта, находим в шаблоне место, куда будем вставлять код. Обычно оно после строки <data:post.body/>.

Пишем туда:

<!--[relposts]-->
<b:if cond='data:blog.pageType == &quot;item&quot;'>
<b:if cond='data:post.labels'>
<div class='relposts'>

 <div id='relpostsdataheader'></div>
 <div id='relpostsdatalisting'></div>

 <script type='text/javascript'>

 // Сюда будем вписывать настройки

 </script>

 <script type='text/javascript'>
 relposts_sourceLabels = []
 <b:loop values='data:posts' var='post'>
  <b:loop values='data:post.labels' var='label'>
   relposts_sourceLabels.push(&quot;<data:label.name/>&quot;);
  </b:loop>
 </b:loop>
 </script>

 <script type='text/javascript' src='http://izhurnalscripts.googlecode.com/svn/trunk/relposts.js'></script>
</div>
</b:if>
</b:if>
<!--[/relposts]-->

Внутри тега script, где написано «Сюда будем вписывать настройки», следует поместить настройки скрипта. Впрочем и без настроек по умолчанию всё работает — можете сохранить шаблон и проверить. :)

Настройки (общие для обоих режимов):

  • relposts_headerPlain — использовать плоский или обычный режим. Значения: true, false.
  • relposts_excludeLabels — список ярлыков, которые следует игнорировать. Значение: массив строк.
  • relposts_queryPostsPerLabel — Количество постов, запрашиваемых для каждого ярлыка с блога. Значение: число.
  • relposts_renameLabels — таблица для переименования ярлыков. Если при переименовании названия 2-х или более ярлыко совпадают, посты этих ярлыков объединяются в выдаче. Значение: ассоциативный массив.
  • relposts_labelPrio — таблица приоритетов ярлыков. Обратите внимание: имена ярлыков даются в таблице в уже переименованном виде. Ярлыки, для которых приоритет не указан в таблице, имеют приоритет 1. Значение: ассоциативный массив.

Настройки, использущиеся в режиме группировки по ярлыкам:

  • relposts_excludeDups — исключать ли повторяющиеся ссылки в разных ярлыках. Значения: true, false.
  • relposts_showPostsPerLabel — сколько максимально постов отображать для каждого ярлыка. Если постов с блога запрошено больше, чем число relposts_showPostsPerLabel, посты выбираются случайным образом. Значение: число.
  • relposts_showLabels — сколько максимально ярлыков отображать. Ярлыки отображаются, начиная с более высокого приоритета, и до тех пор, пока не будет выведено relposts_showLabels ярлыков. Значение: число.
  • relposts_prioDelta — ограничение на разницу приоритетов между ярлыками. Берётся приоритет максимального ярлыка и ярлыки выводятся до тех пор, пока разница между приоритетом следующего ярлыка и приоритетом первого не превысит значение relposts_prioDelta. Значение: число.
  • relposts_header0 — Текст, который будет показан, если похожих постов не найдено. Значение: строка.
  • relposts_header1 — Текст, который будет показан, если найдёны похожие посты только по одному ярлыку. Если в строке есть фрагмент __LABEL__, он заменяется на название ярлыка. Значение: строка.
  • relposts_headerN — Текст, который будет показан, если похожие посты найдены более чем по одному ярлыку. Значение: строка.

Настройки, использущиеся в плоском режиме:

  • relposts_showPostsPlainMode — сколько максимально постов показывать. Посты показываются, начиная с самых приоритетных. Значение: строка.
  • relposts_headerPlain — текст заголовка. Значение: строка.

Значения опций по умолчанию:

relposts_headerN"Похожие статьи:"
relposts_header1"Еще статьи из категории «__LABEL__»:"
relposts_header0""
relposts_headerPlain"Похожие статьи:"
relposts_plainModefalse
relposts_showPostsPlainMode5
relposts_showPostsPerLabel5
relposts_queryPostsPerLabel10
relposts_excludeDupsfalse
relposts_showLabels1000
relposts_excludeLabels[]
relposts_renameLabels{}
relposts_labelPrio{}
relposts_prioDelta10000

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

Пример настройки. Допустим, у нас есть ярлыки, имеющие максимальный приоритет, и если сообщению назначен один из этих ярлыков, ярлыки более низкого приоритета следует игнорировать. Для определённости возьмём в качестве образца ярлыки из этого блога: javascript и перевод. Выставляем им приоритет, а значение relposts_prioDelta ставим равным 0. Тогда в случае, когда у поста есть какой-либо из этих ярлыков, остальные ярлыки будут игнорироваться:

<script type='text/javascript'>
 var relposts_prioDelta = 0;
 var relposts_labelPrio = {
  'javascript' : 2,
  'перевод' : 2
 };
</script>

31 комментарий

FUSESOUND
Этот комментарий был удален автором.
Clr

Это у меня в примере ощибка - приоритет надо ставить выше приоритета по умолчанию (больше 1), а у меня 0. Попробуйте так:

<!--[relposts]-->
<b:if cond='data:blog.pageType == &quot;item&quot;'>
<b:if cond='data:post.labels'>
<div class='relposts'>

<div id='relpostsdataheader'></div>
<div id='relpostsdatalisting'></div>

<script type='text/javascript'>

var relposts_prioDelta = 0;
var relposts_labelPrio = {
'ярлык' : 2,
'еще какой-то ярлык' : 2,
'и еще ярлык' : 2
};

</script>

<script type='text/javascript'>
relposts_sourceLabels = []
<b:loop values='data:posts' var='post'>
<b:loop values='data:post.labels' var='label'>
relposts_sourceLabels.push(&quot;<data:label.name/>&quot;);
</b:loop>
</b:loop>
</script>

<script type='text/javascript' src='http://izhurnalscripts.googlecode.com/svn/trunk/relposts.js'></script>
</div>
</b:if>
</b:if>
<!--[/relposts]-->

FUSESOUND
Этот комментарий был удален автором.
Clr

Количество и заголовок указываются в настройках, в статье перечислены соответствующие параметры.

Flee.lancer

Спасибо огромное за скрипт, все стоит и все нравится. НО. Может подскажите нелюбителю копаться в кодах, как проще сгруппировать посты.

Например, у меня есть рубрики: А, В, С, D. и есть рубрика 111. Рубрика 111 прикрепляется ко всем постам в рубриках А, В, С и D. Дело в том, что мне нужно выводить похожие посты не только со схожей темы, но и по той теме, которая поверхностно объединяет все темы. (Если заглянете ко мне, то все поймете.) Далее, похожие статьи выводятся хорошо, и очень, но они дублируются в обеих рубриках.

Как сделать их недублируемыми? Ну может, что бы выводились более старые посты из рубрики 111 или наоборот из А В С D. Подскажете что-нибудь?

FUSESOUND
Этот комментарий был удален автором.
Clr

@Flee.lancer:
Как вариант, можно пока использовать плоский режим. Все ссылки будут выводиться одним списком, отсортированным по степени совпадения ярлыков. Т.е. если у вас есть пост с ярлыками А и 111, сначала будут показаны ссылки на посты с такими же ярлыками, а затем на другие посты с 111.
Если нужно именно убрать дублирование в режиме разделения на категории, попробую добавить такую возможность в скрипт.

Clr

@FUSESOUND:
Скажите адрес страницы, потестируем.

Анонимный

Это F.S. не могу войти в свой аккаунт у меня глюкнули 3 броузера - пишу как аноним.
Любую внутреннею страницу можно открыть через http://www. и посмотреть....

FUSESOUND
Этот комментарий был удален автором.
Clr

«Любую внутреннею страницу»
Действительно, воспроизводится ошибка. Посмотрю, что можно сделать.

«есть просьба доработать»
1. Заголовок виджета задаётся в настройках.
2. Отключить показ ярлыков можно через CSS: вписывайте правило для .relpostsdatalisting b. Либо использовать плоский режим.

FUSESOUND
Этот комментарий был удален автором.
Clr

Заголовок виджета задаётся в настройках.

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

Flee.lancer

Clr, была бы очень благодарна за доработку, если не лень, конечно. А пока и действительно лучше на плоский, просто больше сообщений вывести в настройках

Flee.lancer

Только у Вас настройки обоих режимов под одним названием в статье))

Настройки, использущиеся в режиме группировки по ярлыкам:
relposts_showPostsPerLabel
и
Настройки, использущиеся в режиме группировки по ярлыкам:

* relposts_showPostsPlainMode

какой из них все-таки плоский?))

Clr

Спасибо, исправил.

Добавлю в скрипт опцию для исключения дублирования.

Clr

@Flee.lancer:
Добавил опцию relposts_excludeDups

Flee.lancer

Ну Вы просто чудо ж!! Спасибо огромное, все работает отлично))

FUSESOUND
Этот комментарий был удален автором.
Flee.lancer

FUSESOUND, если Вы о дублирующих постах, то просто там, где настройки скрипта указываются
<.script type='text/javascript'>

// Сюда будем вписывать настройки



прописать: var relposts_excludeDups = true (не дублировать) или false (дублировать - стоит по умолчанию)

точки убрать, а то комменты не принимают

FUSESOUND
Этот комментарий был удален автором.
Flee.lancer

Доброе утро всем! Вадиму вопрос, раз уж речь идет о скриптах..

Скажите, а существуют ли скрипты для блоспот, защищающие от ctrl+C?

Подобный помощник мог бы защитить блоггера от плагиатчиков, заранее спасибо.

SpectrosKop

CLR, Огромное спасибо за скрипт!

Vlad

Подскажите.Позволяет ли данный скрипт отображать похожие статьи с картинками статей?

Иван

http://get.2leep.com/ Вот нормальный скрипт с картинками и простой настройкой

Vlad

Иван,

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

Иван

Vlad я отписался разработчикам и по другим минусам. Обещали что дальше ещё будет лучше и кое что исправили уже... Но картинки пока да... Ждёмси)))

Василий Шульга

Почему у меня на некоторое время появляются ссылки, а потом бац, и исчезают? Ставил основной код без каких-либо изменений

Marina Varzhainova

У меня таже проблема, через раз отображается список.

Ильнур Карымов

С расширением для браузера огнелиса noscript не работает, хотя все разрешил в настройках

Артем Трошин

У меня не работает не первый не второй пример, и у меня в шаблоне 3 . под коким ставить .

Отправить комментарий