Hace mucho tiempo había puesto algo parecido que requería de la librería Prototype y que terminé quitando porque ... no me acuerdo por qué pero seguro que era una buena razón o no.
Ahora repito la experiencia y veremos qué pasa pero, sin librerías extras ya que luego de un par de años y doscientos mil quinientos treinta y dos errores, más o menos he logrado comprender como funciona esto de Json que es, claro, lo que debe usarse en cualquiera de estos casos porque no hay otra manera de filtrar y acceder a los datos de Blogger que no sea leyendo los feeds.

http://miblog.blogspot.com/search/label/NOMBRE_etiqueta
La idea es reemplazar esos enlaces para que, en lugar de abrir una página, se puedan ver sin salirse de la página y navegar por ellas, avanzando o retrocediendo por todas las entradas que existan con esa etiqueta, sin importar si son veinte o cientos ya que intentaremos no colapsar el sitio, cargando los scripts uno por uno y borrándolos de la memoria una vez que ya no se usan.
El criterio básico es utilizar el mismo esquema que en esta otra entrada y como no puedo pensar en abstracto y no existe un esquema idéntico en todas las plantillas, me limito a mostrar qué hice y las variaciones deberán ser investigadas ya que son casi infinitas.
Primero, expando la plantilla y busco el lugar donde tengo agregados los posts relacionados y allí, haré dos cosas, indicaré la altura del DIV que los contiene y debajo, agregaré una serie de etiquetas con IDs específicos que son en aquellas donde el script escribirá los datos:
<div class='post-footer-line post-footer-line-4'>
<div id='postsrelacionados' style='height:190px;'>
<script type='text/javascript'>mostrarrelacionados();</script>
</div>
<div style='clear:both;'/>
</div>
<div class='post-footer-line post-footer-line-5'>
<div id='etiquetasbajopost' style='height:0px;'>
<div id='navetiquetas'/>
<div id='navetiquetassel'/>
<div id='navetiquetasfooter'/>
</div>
</div>
Busco ahora el LOOP donde Blogger escribe las etiquetas y por las dudas, condiciono los enlaces porque sólo quiero que esto funcione en las páginas individuales:
<b:loop values='data:post.labels' var='label'> ....... <b:if cond='data:blog.pageType == "item"'> <a expr:onclick='"setnavetiquetas(\"" + data:label.name + "\");return false;"' href='javascript:void(0);' rel='tag'><data:label.name/></a> <b:else/> <a expr:href='data:label.url' rel='tag'><data:label.name/></a> </b:if> ....... </b:loop>
<b:if cond='data:blog.pageType == "item"'>
<script type='text/javascript'>
//<![CDATA[
var laetiqueta; // es la etiqueta que se mostrará
var navetiquetasflagfirst = 0; // al inicio es cero
var labelsporpagina = 4; // definir cuántas entradas queremos ver
var labelanterior, labelsiguiente;
// esta es la función genérica que elimina las etiquetas y crea el resumen
// si ya la o usamos alguna similar no hace falta repetirla
function eliminartags(cual,longitud){
var resumen = cual.split("<");
for(var i=0;i<resumen.length;i++){
if(resumen[i].indexOf(">")!=-1){
resumen[i] = resumen[i].substring(resumen[i].indexOf(">")+1,resumen[i].length);
}
}
resumen = resumen.join("");
resumen = resumen.substring(0,longitud-1);
return resumen;
}
// inicializamos la etiqueta a mostrar porque un post puede tener varias
function setnavetiquetas(cual) {
navetiquetasflagfirst = 0;
laetiqueta = cual;
navetiquetas(0);
return false;
}
// es la función muestra las etiquetas y nos permite navegar por ellas
function navetiquetas(direccion){
var p, parametros;
if(direccion==-1) {
// si navegamos hacia atrás
p = labelanterior.indexOf("?");
parametros = labelanterior.substring(p);
} else if (direccion==1) {
// si navegamos hacia adelante
p = labelsiguiente.indexOf("?");
parametros = labelsiguiente.substring(p);
} else {
// si es la primera vez que se ejecuta ocultamos los posts relacionados
document.getElementById("postsrelacionados").style.height = "0px"; // ocultar
// y mostramos este sistema
document.getElementById("etiquetasbajopost").style.height = "270px"; // la altura
// los parámetros para leer Json
parametros = "?start-index=1&max-results=" + labelsporpagina + "&orderby=published&alt=json-in-script"
}
parametros += "&callback=shownavetiquetas";
incluirscriptlabels(parametros);
}
// esta es la funcion que carga el script de manera dinámica
function incluirscriptlabels(parametros) {
// si no es la primera vez, borramos el script anterior
if(navetiquetasflagfirst==1) {removerscriptlabels();}
// borramos todo y ponemos un texto o una imagen de carga
document.getElementById("navetiquetas").innerHTML = "<div id='navetiquetasloading'></div>";
document.getElementById("navetiquetassel").innerHTML = "";
// este es el archivo con los feeds
var archivofeeds = "/feeds/posts/default/-/" + laetiqueta + parametros;
// lo cargamos y ejecutamos
var nuevo = document.createElement('script');
nuevo.setAttribute('type', 'text/javascript');
nuevo.setAttribute('src', archivofeeds);
nuevo.setAttribute('id', 'NAVLABELTEMPORAL');
document.getElementsByTagName('head')[0].appendChild(nuevo);
navetiquetasflagfirst = 1;
}
// esta es la función que remueve el script cargado previamente
function removerscriptlabels() {
var el = document.getElementById("NAVLABELTEMPORAL");
var padre = el.parentNode;
padre.removeChild(el);
}
// esta es la función que cierra este sector y restaura los posts relacionados
function cerrarnavetiquetas() {
document.getElementById("etiquetasbajopost").style.height = "0px"; // ocultar
document.getElementById("postsrelacionados").style.height = "190px"; // la altura deende del diseño
}
// esta es la misma función de siempre que nos permite leer el feed
function shownavetiquetas(json) {
var entry, posttitle, posturl, postimg, postcontent;
var salida = "";
labelanterior = "";
labelsiguiente = "";
// vamos a buscar las direcciones para navegar la lista
for (var k = 0; k < json.feed.link.length; k++) {
if (json.feed.link[k].rel == 'previous') {
// esta es la página anterior
labelanterior = json.feed.link[k].href;
}
if (json.feed.link[k].rel == 'next') {
// esta es la página siguinte
labelsiguiente = json.feed.link[k].href;
}
}
// leemos tantas entradas como definimos
for (var i = 0; i < labelsporpagina; i++) {
// si no hay más, terminamos el bucle
if (i == json.feed.entry.length) { break; }
entry = json.feed.entry[i];
// este es título de cada entrada
posttitle = entry.title.$t;
// buscamos la URL de la entrada
for (var k = 0; k < entry.link.length; k++) {
if (entry.link[k].rel == 'alternate') {
posturl = entry.link[k].href;
break;
}
}
// buscamos el contendio de la entrada y lo guardamos
if ("content" in entry) {
postcontent = entry.content.$t;
} else if ("summary" in entry) {
postcontent = entry.summary.$t;
} else {
postcontent = "";
}
// buscamos la imagen o usamos una imagen por defecto
if ("media$thumbnail" in entry) {
postimg = entry.media$thumbnail.url;
} else {
postimg = "URL_imagen_por_defecto"; // colocar dirección de la imagen
}
// terminada la lectura, vamos creando el código HTML
// que en este caso tienen la misma clase CSS que los posts relacionados
salida += "<div class='relsposts'>";
salida += "<a href='" + posturl + "' target='_blank'><img src='" + postimg + "' /></a>";
salida += "<h6><a href='" + posturl + "' target='_blank'>" + posttitle + "</a></h6>";
salida += "<p>" + eliminartags(postcontent,75) + " ...</p>";
salida += "</div>";
}
document.getElementById("navetiquetas").innerHTML = salida;
// creo el HTML de la barra de navegación inferior
salida = "<a href='javascript:cerrarnavetiquetas()' class='close'></a>"
if(labelanterior) {
salida += "<a href='javascript:navetiquetas(-1);' class='anterior'></a>";
} else {
salida += "<span class='deshabilitado anterior'></span>";
}
if(labelsiguiente) {
salida += "<a href='javascript:navetiquetas(1);' class='siguiente'></a>";
} else {
salida += "<span class='deshabilitado siguiente'></span>";
}
salida += "<a href='javascript:navetiquetas(0);' class='inicio'>inicio</a>";
document.getElementById("navetiquetassel").innerHTML = salida;
// creo una línea más para dar la opcion de usar las páginas "normales"
// y agrego un enlace para suscripciones
salida = "<a href='/search/label/" + laetiqueta + "' target='_blank'>ver página de etiquetas</a>
salida += "<a style='float: right;' href='/feeds/posts/summary/-/" + laetiqueta + "' target='_blank'>Suscribirse a " + laetiqueta + "</a>";
document.getElementById("navetiquetasfooter").innerHTML = salida;
}
//]]>
</script>
</b:if>
<style> /* el div contenedor */ #etiquetasbajopost { height:0px; overflow:hidden; } /* el div con las entradas */ #navetiquetas { height: 190px; /* la altura dependerá de los detalles personales */ width: 100%; } /* cada una de las entradas */ .relsposts { float: left; height: 180px; margin: 0 5px; overflow: hidden; padding: 5px; text-align: center; width: 130px; } .relsposts:hover { /* si se quiere algún efecto */ } .relsposts a { color: #EEE; display: inline; font-family: Helvetica; font-size: 11px; line-height: 1; } .relsposts img { height: 72px; padding: 5px; width: 72px; } .relsposts h6 { display: table-cell; height: 5em; margin: 5px 0 0; overflow: hidden; padding-bottom: 2px; vertical-align: middle; width: 130px; } .relsposts p { color: #AAA; font-size: 10px; height: 4em; line-height: 1.2; margin: 5px 0 0; overflow: hidden; padding: 5px 0; text-align: left; } /* la navegación inferior */ #navetiquetassel { height: 24px; line-height: 24px; margin: 20px auto 0; padding: 1px 10px; text-align: center; width: 500px; } /* las medidas dependerán de las imágenes */ #navetiquetassel .anterior { background: transparent url(IMAGEN_ATRAS) no-repeat right 50%; float: left; height: 24px; width: 17px; } #navetiquetassel .siguiente { background: transparent url(IMAGEN_ADELANTE) no-repeat left 50%; float: right; height: 24px; width: 17px; } #navetiquetassel .close { background: transparent url(IMAGEN_CERRAR) no-repeat scroll left 4px; float: right; height: 24px; margin-left: 100px; width: 17px; } #navetiquetassel a { opacity: 0.8; filter:alpha(opacity=80); } #navetiquetassel a:hover { opacity:1;filter:alpha(opacity=100); } #navetiquetassel .deshabilitado { opacity:.3;filter:alpha(opacity=30); } /* la linea inferior */ #navetiquetasfooter { height: 36px; line-height: 36px; margin: 0 auto; width: 500px; } #navetiquetasfooter a { /* propiedades de los textos */ } #navetiquetasfooter a:hover { /* si se quiere algún enlace */ } #navetiquetasfooter a.enlacefeed { float: right; } /* una imagen de carga temporal */ #navetiquetasloading { background: transparent url(URL_IMAGEN) no-repeat 50% 50%; height: 190px; width: 100%; } </style>