Loading

По запросам «похожие статьи blogger», «похожие посты blogger», «похожие сообщения blogger» Яндекс не особо порадовал выдачей. Есть кое-какие скрипты, которыми пользуется большинство, но меня они не особо устроили. Схожесть ссылки определяется только её принадлежностью к метке.


Плюсы скрипта:
1. Отсутствие ссылок на сторонние ресурсы;
2. Возможность исключать из выдачи метки, не имеющие ни одной ссылки;
3. Возможность переименовывать метки в выдаче и объединять разные метки под одним названием;
4. Возможность отдельно указать, какие метки следует всегда исключать из выдачи;
5. Возможность встроить название метки в заголовок;
6. Возможность указать заголовок, который отображается, когда нет ни единой релевантной ссылки;
7. Простота настройки.

Установка скрипта «Похожие статьи»:
1. Заходим в панель управления блогом и переходим на вкладку Дизайн->Изменить HTML. Ставим галочку напротив Расширить шаблоны виджета.
2. Находим строчку <data:post.body/> и вставляем после неё следующий код:

<b:if cond=’data:blog.pageType == &quot;item&quot;’>
<div class=’similiar’>
<div class=’widget-content’>
<br/>
<div id=’data2007840981’/>
<div id=’data2007840980’/><br/>
<script type=’text/javascript’>
var headerN = «Похожие статьи:»; /* Заголовок виджета, когда в нём отображается более чем одна метка. */
var header1 = «Еще статьи из категории \»__LABEL__\»:»; /* Заголовок виджета, когда в нём отображается одна метка. Если в заголовке есть слово __LABEL__, то вместо него будет подставлено имя метки. */
var header0 = «»; /* Текст, выводимый, если нет ни одной метки и ссылки. */
var homeUrl3 = &quot;<data:blog.homepageUrl/>&quot;; /* Адрес блога, откуда берём список постов. */
var maxNumberOfPostsPerLabel = 5; /* Максимальное число постов, отображаемых для каждой метки. */
var maxNumberOfLabels = 4; /* Максимальное число отображаемых меток. */
var excludeEmptyLabels = true; /* Скрывать ли метки, для которых нет подходящих постов. true — скрывать, false — отображать. */
var excludeLabels = []; /* Метки, которые не следует отображать. */

/* Смена отображаемых имён.
Здесь перечисляем соответствия реального имени метки и названия, которое будет показано на странице.
Если для двух меток указать одно название, они при отображении склеятся в одну метку.
Если метка здесь не перечисляется, то отображается под своим настоящим названием.
*/
var renameLabels = {};
function is_in(item, array) {
for (k in array)
if (array[k] == item) return true;
return false;
}
function label_title(label) {
if (renameLabels[label])
return renameLabels[label];
return label;
}
totalLabels = 0;
receivedReplies = 0;
var receivedItems = [];
var k_label;
function labelReceived() {
receivedReplies++;
if (receivedReplies != totalLabels)
return;
var labelCount = 0;
for (k_label in receivedItems) {
var items = receivedItems[k_label];
if (items.length == 0 &amp;&amp; excludeEmptyLabels)
continue;
labelCount++;
}
var labelCount1 = 0;
for (k_label in receivedItems) {
var items = receivedItems[k_label];
if (items.length == 0 &amp;&amp; excludeEmptyLabels)
continue;
var ul = document.createElement(&#39;ul&#39;);
var itemsCount = 0;
for (var k_item in items) {
item = items[k_item];
var li = document.createElement(&#39;li&#39;);
var a = document.createElement(&#39;a&#39;);
a.href = item.href;
var txt = document.createTextNode(item.title);
a.appendChild(txt);
li.appendChild(a);
ul.appendChild(li);
itemsCount++;
if (itemsCount == maxNumberOfPostsPerLabel)
break;
}
var txt = document.createTextNode(k_label);
var h = document.createElement(&#39;b&#39;);
h.appendChild(txt);
var div1 = document.createElement(&#39;div&#39;);
if (!(labelCount == 1 &amp;&amp; header1.search &amp;&amp; header1.search(/(LABEL)/) != -1))
div1.appendChild(h);
div1.appendChild(ul);
document.getElementById(&#39;data2007840980&#39;).appendChild(div1);
labelCount1++;
if (labelCount1 == maxNumberOfLabels)
break;
}
var txt;
if (labelCount == 1 &amp;&amp; header1)
txt = document.createTextNode(header1.replace(«__LABEL__», k_label));
else if (labelCount)
txt = document.createTextNode(headerN);
else if (header0)
txt = document.createTextNode(headerN);
if (txt)
{
var h = document.createElement(«h4»);
h.appendChild(txt);
document.getElementById(&#39;data2007840981&#39;).appendChild(h);
}
}
function receiveReply_123(json) {
var label = «»;
for (var l = 0; l &lt; json.feed.link.length; l++) {
if (json.feed.link[l].rel == &#39;alternate&#39;) {
var raw = json.feed.link[l].href;
var label = raw.substr(homeUrl3.length+13);
var k;
for (k=0; k&lt;20; k++)
label = label.replace(&quot;%20&quot;, &quot; &quot;);
label = decodeURI(label);
break;
}
}
var labelTitle = label_title(label);
if (typeof receivedItems[labelTitle] != «object»)
receivedItems[labelTitle] = [];
for (var k in json.feed.entry) {
var entry = json.feed.entry[k];
var href = «»;
for (var kl in entry.link) {
if (entry.link[kl].rel == «alternate») {
href = entry.link[kl].href;
break;
}
}
if(href != «» &amp;&amp; href != location.href) {
var item = { «href» : href, «title» : entry.title.$t};
receivedItems[labelTitle].push(item);
}
}
labelReceived();
}
function sendQueryForLabel(query, label) {
var script = document.createElement(&#39;script&#39;);
script.setAttribute(&#39;src&#39;, query + &#39;feeds/posts/default/-/&#39;
+ label +
&#39;?alt=json-in-script&amp;callback=receiveReply_123&#39;);
script.setAttribute(&#39;type&#39;, &#39;text/javascript&#39;);
document.documentElement.firstChild.appendChild(script);
}
var parsedlabels = [];
var labelsCount = 0;
function list_items(textLabel) {
if (labelsCount &gt;= maxNumberOfLabels ||
is_in(textLabel, excludeLabels) ||
is_in(textLabel, parsedlabels)) {
labelReceived();
return;
}
labelsCount++;
parsedlabels.push(textLabel);
sendQueryForLabel(homeUrl3, textLabel);
}
<b:loop values=’data:posts’ var=’post’>
<b:loop values=’data:post.labels’ var=’label’>
totalLabels++;
</b:loop>
</b:loop>
<b:loop values=’data:posts’ var=’post’>
<b:loop values=’data:post.labels’ var=’label’>
list_items(&quot;<data:label.name/>&quot;);
</b:loop>
</b:loop>
</script>
</div>
</div>
</b:if>



3. Изменяем настройки виджета на свой вкус.
4. Пользуемся!