Blogger: Posts relacionados (1)
En Blogger no hay una herramienta específica para esto pero podemos valernos de las que existen, por ejemplo, las etiquetas o categorías.
Primero que nada, vamos a la plantilla y buscamos la etiqueta </b:skin> y justo debajo de esta, agregamos el script. Esto es así ya que debe estar ANTES que cualquier otro script que hayamos definido:
<script type='text/javascript'>
//<![CDATA[
var relatedTitles = new Array();
var relatedTitlesNum = 0;
var relatedUrls = new Array();
function related_results_labels(json) {
for (var i = 0; i < json.feed.entry.length; i++) {
var entry = json.feed.entry[i];
relatedTitles[relatedTitlesNum] = entry.title.$t;
for (var k = 0; k < entry.link.length; k++) {
if (entry.link[k].rel == 'alternate') {
relatedUrls[relatedTitlesNum] = entry.link[k].href;
relatedTitlesNum++;
break;
}
}
}
}
function removeRelatedDuplicates() {
var tmp = new Array(0);
var tmp2 = new Array(0);
for(var i = 0; i < relatedUrls.length; i++) {
if(!contains(tmp, relatedUrls[i])) {
tmp.length += 1;
tmp[tmp.length - 1] = relatedUrls[i];
tmp2.length += 1;
tmp2[tmp2.length - 1] = relatedTitles[i];
}
}
relatedTitles = tmp2;
relatedUrls = tmp;
}
function contains(a, e) {
for(var j = 0; j < a.length; j++) if (a[j]==e) return true;
return false;
}
function printRelatedLabels() {
var r = Math.floor((relatedTitles.length - 1) * Math.random());
var i = 0;
var dirURL = document.URL;
document.write('<ul>');
while (i < relatedTitles.length && i < 20) {
if (relatedUrls[r] != dirURL) {
document.write('<li><a href="' + relatedUrls[r] + '" title="Post relacionado: '
+ relatedTitles[r] + '">' + relatedTitles[r] + '</a></li>');
}
if (r < relatedTitles.length - 1) {
r++;
} else {
r = 0;
}
i++;
}
document.write('</ul>');
}
//]]>
</script>
Guardamos la plantilla y marcamos Expandir elementos.
Ahora, debemos buscar la siguiente sección de código:
<b:if cond='data:post.labels'>
<data:postLabelsLabel/>
<b:loop values='data:post.labels' var='label'>
<a expr:href='data:label.url' rel='tag'>
<data:label.name/>
</a>
<b:if cond='data:label.isLast != "true"'>,</b:if>
aquí agregaremos el código del script
</b:loop>
</b:if>
<b:if cond='data:blog.pageType == "item"'>
<script expr:src='"/feeds/posts/default/-/" + data:label.name +
"?alt=json-in-script&callback=related_results_labels&max-results=10"'
type='text/javascript'/>
</b:if>
Hasta aquí lo que estamos haciendo es decirle que, si estamos en una página individual, se ejecute el script. Por el momento, no veremos resultados de ninguna clase así que nuevamente guardamos la plantilla.
Lo más sencillo sería mostrar todo en un elemento HTML que agregaremos a la sidebar. Le ponemos un título, por ejemplo POSTS RELACIONADOS y escribimos el siguiente código:
<script type="text/javascript">
removeRelatedDuplicates();
printRelatedLabels();
</script>
<b:widget id='HTMLXX' locked='false' title='POSTS RELACIONADOS' type='HTML'>
<b:includable id='main'>
<b:if cond='data:blog.pageType == "item"'>
<b:if cond='data:blog.pageType == "item"'>
<!-- only display title if it's non-empty -->
<b:if cond='data:title != ""'>
<h2 class='title'><data:title/></h2>
</b:if>
<div class='widget-content'>
<data:content/>
</div>
<b:include name='quickedit'/>
</b:if>
</b:if>
</b:includable>
</b:widget>
Ahora sí, todo está listo para probarlo así que guardamos la plantilla por última vez pero, tengamos en cuenta que este hack sólo será visible cuando estemos en una página individual y siempre y cuando haya etiquetas.
Una alternativa sería colocar este elemento debajo de los posts. Sin duda, esa sería la forma perfecta de mostrarlos.
Una vez creado, podemos ir a Elementos de la página, arrastrarlo y moverlo hasta colocarlo debajo del elemento Blog pero, probablemente deberemos personalizarlo para que se adapte a la estética general.

REFERENCIAS:

Corregido el problema de la transcripción del código.
También he modificado el script para que en la lista no se muestre el propio post.
Gracias Solrac, excelente




















24 comentarios:
Me encantó este truco, ahora gran master del Blogger, tengo una duda...
Conoces alguna forma de poner algo similar a los links de "Anterior y Siguiente" que tiene Blogger, pero en lugar de eso que muestre los titulos de las entradas... así como:
↑ Siguiente: "Blogger: Posts relacionados (1)"
↓ Anterior: "Blogger: Posts relacionados"
¡Ojalá lo supiera, Joseph! :)
La verdad, no lo he visto nunca, sólo en WordPress. Esa parte de Blogger, la forma en que maneja eso es casi misteriosa y no tengo ninguna información al respecto.
Si alguien sabe algo o si lo vió, espero que avise a ver si descubrimos el truco. Sería genial :D
Aunque, pensándolo bien, tal vez sería posible ... no estoy seguro, podría leerle la URL pero el problema es leer el título ... déjame estudiar el asunto ;)
Yo creo que sería cuestión de por medio de Javascript dividir el link a partir de los "-" y deshacerse de lo demas.
blogger-posts-relacionados-1.html
↓
Blogger posts relacionados
Sí, en eso mismo estaba pensando, Kurodesu.
No debería ser tan difícil separar la dirección para quedarse con el nombre del archivo y luego, como bien dices, quitarle los guiones.
No sería el título exacto porque hay caracteres que no se incluyen (por ejemplo la ñ) pero estaríamos bastante cerca.
Si mal no recuerdo, creo que hay que utilizar una función Split de Java.
No recuerdo bien, sin embargo creo que necesitaremos REGEXP
Como siempre, estupendo hack JMiur ;)
Hace tiempo estuve buscando para poner precisamente este hack en mi blog. Encontré este post en el blog Hoctro, pero no conseguí que funcionase como yo quería.
Eso me lleva a preguntarte si el hack que has publicado muestra los artículos relacionados que compartan las mismas etiquetas?
Hola, me pregunto si usando JavaScrip t no se podrá hacer algo más sencillo que vengo buscando...
un listado alfabético de TODOS los post de un blog.
O sea que por medio de un enlace o dentro de un post especial se genere dinámicamente un listado de todos los post del blog.
¿Se puede eso?
Bueno, estoy probando el hack.
Informarte que el código referente a "&callback=" y "&max-results=" tiene un problema con el '&' y debe cambiarse por "&callback=" y "&max-results=" respectivamente.
Bueno, he visto otra cosita y es que en la lista de posts se muestra el propio post.
Como ya sabes JMiur no soy muy bueno 'todavía' con el JavaScript pero he tenido buen maestro (gracias por tus enseñanzas ;) ) y he conseguido el código para hacer que no muestre y el comprobando a la hora de escribir los títulos del post (function "printRelatedLabels") que no sea igual a la url del post como tal.
El código añadido en negrita es:
function printRelatedLabels() {
var r = Math.floor((relatedTitles.length - 1) * Math.random());
var i = 0;
var dirURL = document.URL;
document.write('<ul>');
while (i < relatedTitles.length && i < 40) {
if (relatedUrls[r] != dirURL) {
document.write('<li><a href="' + relatedUrls[r] + '" title="Post relacionado: ' + relatedTitles[r] + '">' + relatedTitles[r] + '</a></li>');
}
if (r < relatedTitles.length - 1) {
r++;
} else {
r = 0;
}
i++;
}
document.write('</ul>');
}
PD: también le he añadido el 'title' en el link del post.
¡Apabullado por tanta información! Me parece extraordinario :D
Kurodesu:
Sí, la cosa viene por ese lado. Ahora no las tengo presentes pero seguramente en la web hay decenas de scripts que permiten separar una URL en partes.
Don Atealgo:
Lo del listado alfabético es interesante.
solrac:
Sí, he visto que hay un problema al transcribir el código en el post. Estoy tratando de corregirlo.
El hack de Hoctro es similar a este, es más, pensaba publicarlo hoy para seguir con el tema aunque el resultado es un poco diferente.
Lo del post "repetido" no lo había visto, eso me pasa por usar un blog de pruebas. De cualquier manera, como pensaba poner el hack en este blog y mostrar cómo personalizarlo gráficamente, tu código me viene perfecto.
Espero tener todo en orden en un par de días, cualquier otra sugerencia será bienvenida.
Ah, y gracias a todo, esto ha sido muy valioso :D
He estado leyendo los comentarios..
Hace tiempo Beautiful añadió la forma de aplicar una tabla de contenido de manera que mediante un enlace en la sidebar mostraba hasta 100 entradas del blog por orden alfabético.
(pueden probar si acceden a su blog en Table of Contents)
Con el tiempo lo vi aplicado en el blog de Rosa y en Epílogo quien tuvo la genial idea de modificar para que aparecieran todas las entradas.
Esto es otra cosa que no encontraba, es una tabla de contenidos por categorías
Gracias Gem@, me has dado tarea para investigar este fin de semana :D
Pues a mi no me salen los post relacionados, ni en la página principal ni las individuales, ya sea aplicando este hack como el otro que has dado. Bueno, con este sí me aparece el título del widget pero no los enlaces.
Un saludo
Este en particular está implementado aquí, los detalles los publicaré hoy.
Aparte de algún posible error en la sintaxis, deberías verificar si están habilitados los feeds de tu blog.
Si no encuentras el problema envíame un mail para ver si lo resolvemos.
Si, los tengo habilitados. Y sobre el error de sintaxis, lo que hice fue un "copy&paste" así que si a ti te funcionan a mi deben de funcionarme también, ¿no?.
¿No será que los scripts me tienen manía? Jeje
Volveré a intentarlo cuando esté menos agobiado de trabajo. Ahora no estoy centrado como para experimentos.
Un saludo.
En este momento, los scripts están verificados, pudo haber errores previos pero en esos casos Blogger los señalaba.
Como alternativa, AQUI está la versión exacta del que ya está funcionando ene este blog. Es igual que este excepto por la última parte.
Antes de todo, felicitaciones por tu excelente blog. Te escribo para algo no tan relacionado con el post, pero sí con el código.
Lo que pasa es que podemos utilizar <b:if cond='data:blog.pageType == "item"'> para señalar que el widget se muestre sólo cuando estemos en un post, pero existe un código inverso?, que permita hacer que muestre el widget sólo cuando esté en portada?.
Supongo que hay que cambiar "item" por el identificador de la portada, pero desconozco cual es.
Saludos desde Concepción, Chile!
Saludos, Crisneda:
Se me ocurren dos posibilidades para que beas qué te conviene utilizar.
Esta es la condición inversa ya que != significa "NO ES" una pagina de items:
<b:if cond='data:blog.pageType != "item"'>
esta otra condición es verdadera si estamos en la página principal:
<b:if cond='data:blog.url == data:blog.homepageUrl'>
A mi me funciono el problema es que aparece a un lado es decir, encima de una imagen que tengo en el sidebar. miralo y me ayudas por favro es muy bueno el truco y lo quisiera implementar en mi blog.
montogeek.blogspot.com
En la sidebar, lo veo a la derecha, al lado del buscador. No veo otra imagen superpuesta.
¡Me encanto este truco! Yo tengo ClickComments y sale una cosa parecida, pero este truco es infinitamente mejor. Por cierto ¿que te parece ClickComments? A mi me da fallos y a veces no carga, pero me gustaría saber tu opinión. Gracias
Sancocho:
Nunca lo utilicé pero recuerdo el servicio. Incluso hay un post al respecto.
Ahora que fui a verlo para recordar un poco el tema, veo que los comentarios de los que lo probaron no fueron muy buenos que digamos. El problema principal parece que es ese mismo del que hablas: la lentitud en la carga.
¿Quiere dejar un comentario?
Utilice el formulario adjunto para comunicarse.
Enlaces