Некоторое время назад я опубликовал обзор виджета “Related Posts”. Виджет неплохой, но, как водится, не всё в нём меня устраивало. А именно:
- установка виджета требует серьёзных манипуляций с шаблоном темы и состоит из значительного числа шагов установки
- виджет выдает ссылки на статьи в список случайным образом, что, может быть, хорошо для блога типа “отовсюду обо всём”, но никак для тематического блога.
- некоторые недоработки в самом виджете
В общем, как говорится, “если хочешь, что бы всё было “как надо” – сделай сам”. Я решил последовать этому совету и, вот, что у меня получилось:
- виджет Most Related Posts базируется на библиотеке JSON от Google и, следовательно, расположен на одном из самых быстрых серверов в мире
- выдача ссылок в список осуществляется по индексу соответствия на базе меток (тегов, labels): чем больше совпадающих меток, тем выше индекс соответствия, тем выше ссылка в списке
- ссылка на текущую статью не выводится (не пользуйтесь кавычками в названиях постов – этот глюк RSS может привести к выдаче ссылки на текущую статью в список)
- виджет устанавливается “одним кликом” (copy-paste)
Инструкция по установке
Скопируйте приведённый ниже код и вставьте его в шаблон темы непосредственно после кода <data:post.body/>. Если же Вы пользуетесь Fullpost, то после кода
1 2 3 4 |
<data:post.body /> <b:if cond="data:blog.pageType != "item""> <a expr:href="data:post.url">Read more!</a> </b:if> |
Код виджета:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
<!-- Most Related Posts by minimus START --> <div><b:if cond='data:blog.pageType == "item"'> <div class='widget-content'> <h3>Most Related Posts</h3> <script type="text/javascript" src="//www.google.com/jsapi"></script> <script type='text/javascript'> google.load("feeds", "1"); function initialize() { var aLabels = new Array(); var sLabel = ""; var postTitle = ""; <b:loop values='data:posts' var='post'> <b:loop values='data:post.labels' var='label'> sLabel = "<data:label.name/>"; aLabels.push(sLabel); </b:loop> postTitle = "<data:post.title/>" </b:loop> var num = 100; // глубина сканирования var maxList = 5; //максимальное количество постов в списке var feed = new google.feeds.Feed("YOUR_FEED_URL"); var maxRelIndex = 0; feed.setNumEntries(num); feed.load(function(result) { if (!result.error) { var aTitles = new Array(); var aHRefs = new Array(); var aRelIndex = new Array(); var relIndex = 0; var container = document.getElementById("mx-mrp"); var divFooter = document.createElement("div"); var aFooter = document.createElement("a"); var ul = document.createElement("ul"); divFooter.style.fontSize = "x-small"; aFooter.appendChild(document.createTextNode("minimusX")); aFooter.href = "//minimusx.blogspot.com"; divFooter.appendChild(document.createTextNode("Most Related Posts Widget by ")); divFooter.appendChild(aFooter); for (var i = 0; i < result.feed.entries.length; i++) { var entry = result.feed.entries[i]; relIndex = 0; if (entry.title != postTitle){ for (var j = 0; j < entry.categories.length; j++){ for (var k = 0; k < aLabels.length; k++){ if (entry.categories[j] == aLabels[k]){ relIndex++; } } } if (relIndex != 0){ aTitles.push(entry.title); aHRefs.push(entry.link); aRelIndex.push(relIndex); if (maxRelIndex < relIndex){ maxRelIndex = relIndex; } } } } var numList = 0; for (var i = maxRelIndex; i > 0; i--){ for (var j = 0; j < aRelIndex.length; j++){ if (aRelIndex[j] == i){ var br = document.createElement("br"); var a = document.createElement("a"); var il = document.createElement("il"); a.appendChild(document.createTextNode(aTitles[j])); a.href = aHRefs[j]; il.appendChild(a); ul.appendChild(il); ul.appendChild(br); numList++; } if (numList >= maxList){ break; } } if (numList >= maxList){ break; } } container.appendChild(ul); container.appendChild(divFooter); } }); } google.setOnLoadCallback(initialize); </script> <div id='mx-mrp'></div> </div> </b:if></div> <!-- Most Related Posts by minimus END --> |
Виджет настроен на сканирование последних 100 статей (var num = 100;) и вывода в список 5-ти ссылок (var maxList = 5;) на похожие статьи. Не забудьте изменить строку YOUR_FEED_URL на url feed’а Вашего блога.
© 2008 – 2015, minimus. Все права защищены. При копировании и републикации статьи, ссылка на первоисточник обязательна.
“Не удалось проанализировать ваш шаблон, так как он неправильно сформирован. Убедитесь, что все элементы XML правильно закрыты.
Сообщение об ошибке в XML: The content of elements must consist of well-formed character data or markup.”
2 Melnar Tilromen:
Это, я так понимаю, сообщение редактора шаблона при попытке сохранить оный. Ошибка связана с тем, что Blogger не совсем правильно анализирует шаблон, а именно: javascript. Замените все знаки “больше” и меньше, а также двойные кавычки на &_gt; &_lt; и &_quot; соответственно (уберите знак подчёркивания после амперсанда). Я сейчас пишу online конвертер под это дело, осталось немного … 😉
повозиться с кодом пришлось как следует, но результат отличный! спасибо!
Здравствуйте, Вот я столкнулась с такой же проблемой как Melnar Tilromen.
А есть ли более быстрый способ исправить эту ошибку, чем убирать все знаки <> и двойные кавычки?
Может быть у Вас уже готов “оnline конвертер под это дело”?
А может быть есть уже исправленный шаблон? (Чтобы не возиться так долго с кодом )
“Уберите знак подчёркивания после амперсанда” – знак подчеркивания заменить на пробел или убрать вовсе?
Что-то ничего не работает :(((
Как именно не работает?
Вообще ни как //kobarb.blogspot.com/
<!– Most Related Posts by minimus START –>
<div class=’toppost’ id=’toppost1′>
<b:if cond=’data:blog.pageType == "item"’>
<div class=’widget-content’>
<h3>Most Related Posts</h3>
<script type=’text/javascript’>
google.load("feeds", "1");
function initialize() {
var aLabels = new Array();
var sLabel = "";
var postTitle = "";
<b:loop values=’data:posts’ var=’post’>
<b:loop values=’data:post.labels’ var=’label’>
sLabel = "<data:label.name/>";
aLabels.push(sLabel);
</b:loop>
postTitle = "<data:post.title/>";
</b:loop>
var num = 100; // глубина сканирования
var maxList = 5; //максимальное количество постов в списке
var feed = new google.feeds.Feed("//kobarb.blogspot.com/");
var maxRelIndex = 0;
feed.setNumEntries(num);
feed.load(function(result) {
if (!result.error) {
var aTitles = new Array();
var aHRefs = new Array();
var aRelIndex = new Array();
var relIndex = 0;
var container = document.getElementById("mx-mrp");
var divFooter = document.createElement("div");
var aFooter = document.createElement("a");
var ul = document.createElement("ul");
divFooter.style.fontSize = "x-small";
aFooter.appendChild(document.createTextNode("minimusX"));
aFooter.href = "//blogcoding.ru/";
divFooter.appendChild(document.createTextNode("Most Related Posts Widget by"));
divFooter.appendChild(aFooter);
for (var i = 0; i < result.feed.entries.length; i++) {
var entry = result.feed.entries[i];
relIndex = 0;
if (entry.title != postTitle){
for (var j = 0; j < entry.categories.length; j++){
for (var k = 0; k < aLabels.length; k++){
if (entry.categories[j] == aLabels[k]){
relIndex++;
}
}
}
if (relIndex != 0){
aTitles.push(entry.title);
aHRefs.push(entry.link);
aRelIndex.push(relIndex);
if (maxRelIndex < relIndex){
maxRelIndex = relIndex;
}
}
}
}
var numList = 0;
for (var i = maxRelIndex; i &qt; 0; i–){
for (var j = 0; j < aRelIndex.length; j++){
if (aRelIndex[j] == i){
var br = document.createElement("br");
var a = document.createElement("a");
var il = document.createElement("il");
a.appendChild(document.createTextNode(aTitles[j]));
a.href = aHRefs[j];
il.appendChild(a);
ul.appendChild(il);
ul.appendChild(br);
numList++;
}
if (numList &qt;= maxList){ break; }
}
if (numList &qt;= maxList){ break; }
}
container.appendChild(ul);
container.appendChild(divFooter);
}
});
}
google.setOnLoadCallback(initialize);
</script>
<div id=’mx-mrp’></div>
</div>
</b:if></div>
<!– Most Related Posts by minimus END –>
Это НЕ URL фида, эта строка с URL фида должна выглядеть так:
Да я пробовал и так и так, но реакции ноль
Нашел ошибку короче
А у вас ошибка здесь
var il = document.createElement(“il”);
Правильнее будет var il = document.createElement(“li”);
Oops! Поскольку всё работало – это опечатка. Извиняюсь за причинённые неудобства … 🙁
Очень хотел сделать себе “похожие записи”, но сколько ни мучался код не принимается. Умоляю, помогите!
Вот текст ошибки: Open quote is expected for attribute “{1}” associated with an element type “type”.
А вот сам код:
<!– Начало кода для вывода похожих записей –>
<div><b:if cond=’data:blog.pageType == "item"’>
<div class=’widget-content’>
<br/><br/><h3>Most Related Posts</h3>
<script type="text/javascript" src="//www.google.com/jsapi"></script>
<script type=’text/javascript’>
google.load("feeds", "1");
function initialize() {
var aLabels = new Array();
var sLabel = "";
var postTitle = "";
<b:loop values=’data:posts’ var=’post’>
<b:loop values=’data:post.labels’ var=’label’>
sLabel = "<data:label.name/>";
aLabels.push(sLabel);
</b:loop>
postTitle = "<data:post.title/>"
</b:loop>
var num = 100; // глубина сканирования
var maxList = 5; //максимальное количество постов в списке
var feed = new google.feeds.Feed("//gladpage.blogspot.com/feeds/posts/default");
var maxRelIndex = 0;
feed.setNumEntries(num);
feed.load(function(result) {
if (!result.error) {
var aTitles = new Array();
var aHRefs = new Array();
var aRelIndex = new Array();
var relIndex = 0;
var container = document.getElementById("mx-mrp");
var divFooter = document.createElement("div");
var aFooter = document.createElement("a");
var ul = document.createElement("ul");
divFooter.style.fontSize = "x-small";
aFooter.appendChild(document.createTextNode("minimusX"));
aFooter.href = "//blogcoding.ru/";
divFooter.appendChild(document.createTextNode("Most Related Posts Widget by "));
divFooter.appendChild(aFooter);
for (var i = 0; i < result.feed.entries.length; i++) {
var entry = result.feed.entries[i];
relIndex = 0;
if (entry.title != postTitle){
for (var j = 0; j < entry.categories.length; j++){
for (var k = 0; k < aLabels.length; k++){
if (entry.categories[j] == aLabels[k]){
relIndex++;
}
}
}
if (relIndex != 0){
aTitles.push(entry.title);
aHRefs.push(entry.link);
aRelIndex.push(relIndex);
if (maxRelIndex < relIndex){
maxRelIndex = relIndex;
}
}
}
}
var numList = 0;
for (var i = maxRelIndex; i > 0; i–){
for (var j = 0; j < aRelIndex.length; j++){
if (aRelIndex[j] == i){
var br = document.createElement("br");
var a = document.createElement("a");
var il = document.createElement("li");
a.appendChild(document.createTextNode(aTitles[j]));
a.href = aHRefs[j];
il.appendChild(a);
ul.appendChild(il);
ul.appendChild(br);
numList++;
}
if (numList >= maxList){ break; }
}
if (numList >= maxList){ break; }
}
container.appendChild(ul);
container.appendChild(divFooter);
}
});
}
google.setOnLoadCallback(initialize);
</script>
<div id=’mx-mrp’></div>
</div>
</b:if></div>
<!– Most Related Posts by minimus END –>
не работает все символы перевел в кодовые названия этих символов, вставил там где надо урл своего фида. но похожие посты не отображает, или он старые не индексирует, а будет работать только при добавлении новых постов?
вот код посмотрите пожалуста…
<!– Most Related Posts by minimus START –>
<div><b:if cond='data:blog.pageType == "item"'>
<div class='widget-content'>
<br/><br/><h3>Most Related Posts</h3>
<script type="text/javascript" src="//www.google.com/jsapi"></script>
<script type='text/javascript'>
google.load("feeds", "1");
function initialize() {
var aLabels = new Array();
var sLabel = "";
var postTitle = "";
<b:loop values='data:posts' var='post'>
<b:loop values='data:post.labels' var='label'>
sLabel = "<data:label.name/>";
aLabels.push(sLabel);
</b:loop>
postTitle = "<data:post.title/>"
</b:loop>
var num = 100; // глубина сканирования
var maxList = 5; //максимальное количество постов в списке
var feed = new google.feeds.Feed("//i-elf.blogspot.com/feeds/posts/default");
var maxRelIndex = 0;
feed.setNumEntries(num);
feed.load(function(result) {
if (!result.error) {
var aTitles = new Array();
var aHRefs = new Array();
var aRelIndex = new Array();
var relIndex = 0;
var container = document.getElementById("mx-mrp");
var divFooter = document.createElement("div");
var aFooter = document.createElement("a");
var ul = document.createElement("ul");
divFooter.style.fontSize = "x-small";
aFooter.appendChild(document.createTextNode("minimusX"));
aFooter.href = "//blogcoding.ru/";
divFooter.appendChild(document.createTextNode("Most Related Posts Widget by "));
divFooter.appendChild(aFooter);
for (var i = 0; i < result.feed.entries.length; i++) {
var entry = result.feed.entries[i];
relIndex = 0;
if (entry.title != postTitle){
for (var j = 0; j < entry.categories.length; j++){
for (var k = 0; k < aLabels.length; k++){
if (entry.categories[j] == aLabels[k]){
relIndex++;
}
}
}
if (relIndex != 0){
aTitles.push(entry.title);
aHRefs.push(entry.link);
aRelIndex.push(relIndex);
if (maxRelIndex < relIndex){
maxRelIndex = relIndex;
}
}
}
}
var numList = 0;
for (var i = maxRelIndex; i > 0; i–){
for (var j = 0; j < aRelIndex.length; j++){
if (aRelIndex[j] == i){
var br = document.createElement("br");
var a = document.createElement("a");
var il = document.createElement("li");
a.appendChild(document.createTextNode(aTitles[j]));
a.href = aHRefs[j];
il.appendChild(a);
ul.appendChild(il);
ul.appendChild(br);
numList++;
}
if (numList >= maxList){ break; }
}
if (numList >= maxList){ break; }
}
container.appendChild(ul);
container.appendChild(divFooter);
}
});
}
google.setOnLoadCallback(initialize);
</script>
<div id='mx-mrp'></div>
</div>
</b:if></div>
<!– Most Related Posts by minimus END –>
Вроде всё Ok …
Собирался написать новую версию … Если интересует – подождите.
Вот люди постарались, сделали виджет googlecode.com – но у меня всё равно не работает. Использую linkwithin.com
Добрый день. У меня кроме текста “Похожие статьи” ничего не отображается. Почему так? Вот код:
<!– Most Related Posts by minimus START –>
<div><b:if cond='data:blog.pageType == "item"'>
<div class='widget-content'>
<h3>Похожие статьи</h3>
<script type="text/javascript" src="//www.google.com/jsapi"></script>
<script type='text/javascript'>
google.load("feeds", "1");
function initialize() {
var aLabels = new Array();
var sLabel = "";
var postTitle = "";
<b:loop values='data:posts' var='post'>
<b:loop values='data:post.labels' var='label'>
sLabel = "<data:label.name/>";
aLabels.push(sLabel);
</b:loop>
postTitle = "<data:post.title/>"
</b:loop>
var num = 100; // глубина сканирования
var maxList = 5; //максимальное количество постов в списке
var feed = new google.feeds.Feed("//methodicinfo.blogspot.com/feeds/posts/default");
var maxRelIndex = 0;
feed.setNumEntries(num);
feed.load(function(result) {
if (!result.error) {
var aTitles = new Array();
var aHRefs = new Array();
var aRelIndex = new Array();
var relIndex = 0;
var container = document.getElementById("mx-mrp");
var divFooter = document.createElement("div");
var aFooter = document.createElement("a");
var ul = document.createElement("ul");
divFooter.style.fontSize = "x-small";
aFooter.appendChild(document.createTextNode("minimusX"));
aFooter.href = "//minimusx.blogspot.com";
divFooter.appendChild(document.createTextNode("Похожие статьи"));
divFooter.appendChild(aFooter);
for (var i = 0; i < result.feed.entries.length; i++) {
var entry = result.feed.entries[i];
relIndex = 0;
if (entry.title != postTitle){
for (var j = 0; j < entry.categories.length; j++){
for (var k = 0; k < aLabels.length; k++){
if (entry.categories[j] == aLabels[k]){
relIndex++;
}
}
}
if (relIndex != 0){
aTitles.push(entry.title);
aHRefs.push(entry.link);
aRelIndex.push(relIndex);
if (maxRelIndex < relIndex){
maxRelIndex = relIndex;
}
}
}
}
var numList = 0;
for (var i = maxRelIndex; i > 0; i–){
for (var j = 0; j < aRelIndex.length; j++){
if (aRelIndex[j] == i){
var br = document.createElement("br");
var a = document.createElement("a");
var il = document.createElement("li");
a.appendChild(document.createTextNode(aTitles[j]));
a.href = aHRefs[j];
il.appendChild(a);
ul.appendChild(il);
ul.appendChild(br);
numList++;
}
if (numList >= maxList){ break; }
}
if (numList >= maxList){ break; }
}
container.appendChild(ul);
container.appendChild(divFooter);
}
});
}
google.setOnLoadCallback(initialize);
</script>
<div id='mx-mrp'></div>
</div>
</b:if></div>
<!– Most Related Posts by minimus END –>
Кажется, сейчас изменились шаблоны и такого кода, как Вы указали (после которого нужно вставить Ваш код), больше нет. Как теперь быть? Хочется такой виджет использовать…
Виджет с гуглокода у меня тоже не захотел работать: то есть при любых настройках он почему-то показывает последние посты, а не похожие.
Подскажите а online конвертер готов или нет?
Как нехорошо получилось – обещал, но не сделал. Спасибо за напоминание! Уже готов!
не работает, при всех ухищрениях, пора удалять статью, или допиливать