Blogger: Posts relacionados (3)
Vuelvo al primer hack de los Posts Relacionados porque es el que me parece que funciona mejor o, por lo menos, con el que consigo hacer lo que yo pretendo. Pero, en lugar de crear un elemento HTML y colocarlo en la sidebar o debajo del área de posts, voy a incluirlo directamente en la plantilla como otra línea del pie de página de los posts que se mostrará exclusivamente en las páginas individuales.
Para esto, sigo el procedimento explicado anteriormente: coloco el script en el encabezado de la plantilla y la llamada en la sección categorias pero, aquí me detengo y voy a la plantilla para buscar:
<p class='post-footer-line post-footer-line-3'/>
o el final de las líneas con los pie de página.
Lamento no poder se más claro porque esta parte suele tener demasiadas variaciones en las plantillas; el sector del que hablo es algo así:
Para esto, sigo el procedimento explicado anteriormente: coloco el script en el encabezado de la plantilla y la llamada en la sección categorias pero, aquí me detengo y voy a la plantilla para buscar:
<p class='post-footer-line post-footer-line-3'/>
o el final de las líneas con los pie de página.
Lamento no poder se más claro porque esta parte suele tener demasiadas variaciones en las plantillas; el sector del que hablo es algo así:
<b:includable id='post' var='post'>
<div class='post'>
.......
<div class='post-body'>
.......
</div>
<div class='post-footer'>
<p class='post-footer-line post-footer-line-1'>
....... generalmente el autor del post .......
</p>
<p class='post-footer-line post-footer-line-2'>
....... generalmente las etiquetas del post .......
</p>
<p class='post-footer-line post-footer-line-3'>
....... generalmente sin uso .......
</p>
y aquí agregaremos el nuevo código
</div>
</div>
</b:includable>
</b:widget>
Esa nueva línea tendrá el siguiente código:
<div class='post-footer-line post-footer-line-4'>
<b:if cond='data:blog.pageType == "item"'>
<script type="text/javascript">
removeRelatedDuplicates();
printRelatedLabels();
</script>
</b:if>
</div>
Ahora, intentaremos personalizarla gráficamente con CSS y antes de </head> colocaremos las propiedades de estilo necesarias que serán variadas pero muestro las que yo utilizo para que sirva de referencia:
<style type='text/css'>
.post-footer-line-4 {
margin: 0 0 10px 20px;
background: transparent url(URL_ImagenFondo) no-repeat 0% 10%;
}
.post-footer-line-4 ul {
margin: 0pt;
padding-left: 10px;
list-style-image: none;
list-style-position: outside;
list-style-type: none;
}
.post-footer-line-4 ul li {
margin: 0px 0pt 0px 50px;
font-size: 11px;
list-style-image: url(URL_ImagenFlecha);
list-style-position: outside;
list-style-type: none;
}
.post-footer-line-4 a, .post-footer-line-4 a:visited {
font-weight: normal !important;
}
.post-footer-line-4 a:hover {
padding-left: 5px;
text-decoration: none !important;
}
</style>
Personalmente, se me plante un último problema.
Si bien el hack permite establecer una cantidad de etiquetas a "evaluar" con el fin de seleccionar algunas de ellas para ser mostradas, esa cantidad no es la cantidad total a mostrar sino la cantidad máxima por cada etiqueta:
&max-results=3
Quiere decir que si hay varias etiquetas, es muy probable que la lista mostrada pueda contener muchos posts, a mi gusto, demasiados.
Así que, una posibilidad es modificar el script para limitar el número absoluto de posts relacionados. Esto lo hacemos cambiando una de las funciones:
Si bien el hack permite establecer una cantidad de etiquetas a "evaluar" con el fin de seleccionar algunas de ellas para ser mostradas, esa cantidad no es la cantidad total a mostrar sino la cantidad máxima por cada etiqueta:
&max-results=3
Quiere decir que si hay varias etiquetas, es muy probable que la lista mostrada pueda contener muchos posts, a mi gusto, demasiados.
Así que, una posibilidad es modificar el script para limitar el número absoluto de posts relacionados. Esto lo hacemos cambiando una de las funciones:
function printRelatedLabels() {
var cuantosPosts = 0;
var r = Math.floor((relatedTitles.length - 1) * Math.random());
var i = 0;
var dirURL = document.URL;
document.write('<ul>');
while (i < relatedTitles.length && i < 50) {
if (relatedUrls[r] != dirURL) {
document.write('<li><a href="' + relatedUrls[r] + '" title=" ' + relatedTitles[r] + '">'
+ relatedTitles[r] + '</a></li>');
}
if (r < relatedTitles.length - 1) {
r++;
} else {
r = 0;
}
i++;
cuantosPosts++;
if (cuantosPosts == 3) {
break;
}
}
document.write('</ul>');
}Simplemente, vamos contando los posts a medida que se escriben y le decimos que cuando llegue a cierto valor, no continúe. El agregado es lo marcado en color y el dato a personalizar es la cantidad máxima, en este caso 3.



















33 comentarios:
Muy bien hecho, ahora solo falta que encontremos una forma de crear esa idea interesante del comentario anterior.
Navegación con nombres de las entradas.
Joder no me aclaro. Primero dejo el Post Relacionados (2), porque no me aparece lo que me comentabas de: CONFIGURACION / FEEDS (no debe estar en none). Ésto a mí no me aparece o no lo busco bien, claro está.
Segundo, ahora voy a intentarlo con el Post Relacionados (3). Sigo los pasos. Pego el script que has puesto y depués antes de /HEAD pego el style correspondiente que pones, cambiando las URL por las mías.
Hasta aquí todo bien. Lo que no sé, es donde poner el tercer paso que empieza por function printRelatedLabels() {. Yo lo coloco en la línea script creada que empieza por el mismo nombre que ésta, guardo la plantilla y a mí no me aparece absolutamente nada.
Perdona mi ignorancia, pero es que tengo muchas ganas de colocar un post relacionados de éstos en mi blog.
Saludos.
Kurodesu
Allí vamos, es la tarea que me he impuesto para el fin de semana, veremos si llego a alguna parte o al menos encuentro una solución parcial ;)
Neo:
Estás haciendo todo correctamente, así que me inclino por creer que el problema es la configuraciòn de los feeds. Esta es la CAPTURA de pantalla de la configuración de Blogger para que tengas una idea de dónde buscar.
Con respecto al hack, sugiero dos cosas. Primero, si lo que te falta es colocar la última parte y no encuentras donde hacerlo, el lugar, podría ser debajo de esto:
<p class='post-footer-line post-footer-line-3'></p>
Si aún así no los muestra, podrías podrías probar esa última parte utilizando la solución del primer post: AQUI que es igual a este excepto que los coloca en la sidebar. La diferencia es el último paso.
Voy a ver cómo hago para RELACIONAR este Post conmigo :D
Cata:
Preguntas metafísicas, al fondo del pasillo, la segunda puerta a la derecha :)
Oops! me envió al baño a las preguntas metafísicas (al fondo a la derecha)...uhmm (así lo hará el :$ )
No, el baño está para el otro lado pero no importa, también es un buen lugar para despejar dudas metafísicas :)
Me gustaria implementar los posts relacionados,pero,me parece que es mucho "circo" colocar todos los códigos en la plantilla..... me marea,jeje :)
Un saludo!
Ya los tengo en mi blog, he suprimido la imagen porque mi footer está demasiado florido :)
Acabo de ir a verlo y está perfecto :D
Lo de la imagen de fondo es un chiche personal y claro, en tu caso sería una locura ponerla y así como lo has hecho queda mucho más prolijo.
Al fin encontré como hacer esto. Lo había estado buscando, pero solo había encontrado como hacerlo en el antiguo blogger. Ya comencé a utilizarlo en mi blog, aunque aún hace falta estilizarlo
Me alegro que te sirviera.
Q tal J, todo bien?
Intenté el metodo 2 y no me funciono, aora itente el metodo 3 y tampoco y no se que rayso sera, lo dle fed ya lo tengo bien, podrias pegarle una ojeada a ver que podria estar mal?
el lkink es http://television.ticovago.com
Gracias!
Aparentemente, te faltaría esta parte:
<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>
No la copies de aquí que es un lio escriirla:D
Fijate en el post anterior AQUI
Es lo que dice que va antes de </b:loop>
J que buen soporte das! Ya me ha servido, y se ve genial solo por una cosita: No me sale un titulo que diga 'Post Relacionados'
que podra ser?
Muchas Gracias!
El título al que hace referencia el post es el atributo title del enlace, el texto que se muestra cuando dejas el cursor encima de él.
Para agregar un título visible, simplemente lo escribes en el mismo lugar donde se muestra la lista; por ejemplo, antes del script.
LISTO!!
Muchas gracias!
JMiur, quiero agradecerte por todos los consejos que has publicado, los que he podido agregar a mi blog sin problemas.
Te envío como aporte una modificación que apliqué en mi blog: como la extracción desde feeds toma solo las publicaciones más recientes, al cortar a cierta cantidad de posts siempre tenía los mismos resultados.
Aumenté el valor "max-result" a 50 para que leyera posts más antiguos por etiqueta y agregué una función que los revuelve en forma aleatoria. Así cuando presento los posts, tengo más posibilidades de mostrar artículos más viejos en una lista corta de 15 o 20 resultados. Además, la lista siempre es diferentes entre recargas de página.
La función es:
function mixRelatedLabels() {
for(var i = 0; i < relatedTitles.length; i++){
var indice = Math.floor((relatedTitles.length - 1) * Math.random());
var tempTitle = relatedTitles[i];
var tempUrls = relatedUrls[i];
relatedTitles[i] = relatedTitles[indice];
relatedUrls[i] = relatedUrls[indice];
relatedTitles[indice] = tempTitle;
relatedUrls[indice] = tempUrls;
}
}
y se invoca dentro del elemento HTML:
removeRelatedDuplicates();
mixRelatedLabels();
printRelatedLabels();
Muy buena idea :D
Ya la estoy probando y funciona perfectamente. La incluiré en un post porque realmente mejora mucho la cantidad y tipo de resultados.
¡Excelente aporte!
Mi estimado, muy buenas explicaciones de los 3 códigos. Sin embargo, he querido hacerle una modificación pero hoy en particular estoy con el santo de espaldas y hasta lo más básico de javascript se me va de la mente, así que con un poco de vergüenza por admitir mi derrota temporal, recurro a tí para hacerte la siguiente consulta.
Tú usas Math.random() para obtener cada vez una lista distintas de temas relacionados. Me parece genial la idea, pero le encuentro un pequeño "pero"..... verás, hay veces en que en el listado resultante, aparece el mismo post en que estamos, por decirte, si estoy en el post "el tema del día", hay momentos en que aparece en la lista de "temas relacionados" el link hacia "el tema del día".
Ahora bien, esto se hará más evidente cuando existan pocos posts en una categoría dada.
Cuando inicias la funcion related_results_labels(json), almacenas en la matriz relatedTitles los títulos y es aquí donde quería hacer una modificación pero me he bloqueado.
La cosa sería colocar una rutina para que determine si relatedTitles es igual al título del post en que se encuentran ahora. Para esto habría que capturar el valor correspondiente del widget de blooger, el cual no estoy aún seguro cual puede ser.
¿Crees que podrías orientarme o de plano modificar el código para que se muestren sólo links sin incluir el link activo?
Espero no haber sido muy cargoso con mi consulta.
Un abrazo desde Lima, Perú
La pregunta es interesante y estuve mirando porque nunca había visto que ocurriera eso.
Se supone que en la función printRelatedLabels() se chequea que la URL del post relacionado no sea la del post actual:
var dirURL = document.URL;
.............
if (relatedUrls[r] != dirURL) {
document.write(...........);
}
sólo se escribe una línea si la dirección URL no es la del post actual.
Ahora bien, eso se complica o en realidad, no funciona, si se coloca el script para que funcione en una página que no sea una página de posts individuales porque la URL es otra ¿Será este el problema?
No había reparado en ese detalle, sobre el URL de la página principal, y parece que es ese el problema... en todo caso habría que modificar la llamada de la función en
< s c r i p t e x p r : s r c = ' " / f e e d s / p o s t s / d e f a u l t / - / "
(lo pongo así separado porque si no no me acepta el comentario)
porque tú función llama, lo cual es lógico, al RSS para poder capturar las direcciones, pero efectivamente no se pueden hacer si se trata de la página principal, salvo que se cree una variable que controle si estamos en un item o no algo como
i f i t e m = t r u e t h e n
.. la rutina normal que has creado
e l s e
.. se trata de la página principal
e n d i f
eso o simplemente buscar la forma de comparar el nombre de los archivos html que se cargan y no ya la ruta completa o URL
Como te dije en mi mensaje, estoy con el cerebro exprimido porque estoy con el apremio de terminar un sistema contable web y entre ASP, PHP, Ajax, javascript y CSS estoy molido, tanto así que mañana me tomo unos días de vacaciones para blogear tranquilo y no ver nada de programación.... jejeje....
Bueno, si se me ocurre algo en estas horas para modificar tu script lo hago y si resulta te aviso al toque, ahora, si tu me ganas por puesta de mano igual estaré agradecido porque no había reparado este tipo de programación que has hecho, porque lo mio esta enfocado a otro campo.
Un saludo desde Lima, Perú
Bueno, estoy muerto pero tengo una idea de como poder hacer lo que te comentaba en mi anterior mensaje.
Sería tal vez posible usar match para determinar si en la dirección URL que capturas con
d o c u m e n t . U R L
esta presente la palabra feed, cosa que de esta forma, de estar presente, nos asegurariamos de que esta en una página individual ya que usas la raíz
/feeds/posts/default/-/
para invocar a tu script..... al menos creo que por ahí va la idea, porque sería intereante poder tener los artículos relacionados también en la página principal. Es una idea en bruto, pero reitero, estoy vacio ahora...... bueno, me retiro, es hora de dormir y recuperar energias e ideas durante los próximos 4 dias de vagancia.
Un saludo cordial desde Lima,Perú
Gracias por tus artículos sobre plantillas Blogger. Con tu inmensa sabiduría y paciencia consigues que los que sabemos poquito de HTML podamos tener un blog en condiciones.
Ya he incluido algunos de tus trucos en mi blog y empieza a tener buena pinta.
¡¡¡Saludos!!!
Rómulo:
Espero que tengas suerte y que las ideas fluyan. Es una muy buena idea :)
Electrotécnica:
Gracias por el comentario, me alegro que te sea útil.
Gracias lo implemente en mi blog, una cosa que tuve que hacer porque sino me quedaba arriba de los comentarios es ponerlo antes del
< - p class='post-footer-line post-footer-line-3'/ ->
y no despues por ahi a alguien le sirve ;)
Como la ubicación depende mucho de cada plantilla tu aclaración está perfecta.
Implemente el código y funciona super pero quisiera saber si este mismo código pudiera implementarse para que los ‘post relacionados’ aparezcan debajo de cada post en la página principal y no en la pagina del post. Ojal me haya hecho entender.
Se comprende. El mismo me parece que no y no aconsejaría hacerlo porque el script se ejecutaría muchas veces y cada ejecución lleva mucho tiempo. La carga del blog se resentiría mucho.
Mi estikado amigo, bueno creo que es la primera vez que escribo aca en tu blog, pero al leer muchos post que hay aca, concuerdo con todos......eres un genio en esto, esta entrada la vi en otro lado pero no me resultó, pero lo hice como tu lo describes y me resultó de una.....
Gracias por la ayuda que das....
ya estas enlazado en mi blog..
Gracias por el comentario, Patán :)
Me alegro que te haya servido.
Funciona de diez el hack, pero me gustaría saber si es posible que no muestre alguna de las etiquetas del post. Seria como anular alguna palabra para que no la tome como parámetro de búsqueda en las etiquetas, y así no muestre los items relacionados.
Gracias
César.
César, en principio, podría hacerse pero habría que modificar el script.
¿Quiere dejar un comentario?
Utilice el formulario adjunto para comunicarse.
Enlaces