Crear una Tabla de Contenidos en PHP
Fecha Publicación:
10 de Junio de 2020
Fecha Modificación:
14 de Julio de 2020
Estructura de nuestro contenido
Primero definimos la estructura, los títulos de nuestro contenido tendrán la etiqueta HTML h2, los subtítulos con h3, y si queremos otro nivel más con h4, por ejemplo:
<h2>titulo contenido</h2>
<p>poner texto</p>
<h3>subtítulo contenido</h3>
<p>poner texto</p>
<div class="rel_posts">
<h3>Artículos Relacionados</h3>
</div>
Agregando el código usando Jquery
<script>
(function($){
$.noConflict();
//NOTA los iconos se definen en D:\Google Drive\Web\Wampserver64\www\desarrollounidadvirtualphp7.com\templates\2modelo>
//inicializar-valores-font-awesome.php
//alert('test');
//Comprobación para que se ejecute sólo al ver el detalle de una entrada
//Plantillas para la tabla
var icono_articulos_flecha_derecha = "<?=$icono_articulos_flecha_derecha?>";
var tmplwrap ="<div id='tabla-contenido'>\n<p class='titulo'>Tabla de Contenido</p>\n{contenido}</div>";
//var tmpllink = "<p {clase}><i class='fa fa-caret-right'></i> <a href={link}>{texto}</a></p>\n";
var tmpllink = "<p {clase}> "+icono_articulos_flecha_derecha+" <a href={link}>{texto}</a></p>\n";
var cadena = "";
var v_articulo = document.querySelector('article');
var xnumeroconsecutivo_h1=0;
var xnumeroconsecutivo_h2=0;
//Preparamos el segundo y tercer nivel para que tenga una clase
$('article h2').siblings('h3').addClass('n2');
$('article h2').siblings('h4').addClass('n3'); // Agregado
if ( $('article h2').length >= 2 ){ // Si hay etiquetas h2 mas de 3 o igual comienza el buble
//Bucle, recorremos elementos para construir la tabla usando Jquery
$('article h2, article h3, article h4').each(function(index, element){
// Evitar que se liste Artículos Relacionados porque tienela etiqueta h3 pero
//como lo estamos poniendo abajo ya no es necesario
if ( $(this).text()!="Artículos Relacionados" ){
//alert($(this).text());
clase = "";
if ($(this).hasClass('n2'))
clase = 'class="n2"';
else if($(this).hasClass('n3'))
clase = 'class="n3"';
texto = $(this).text(); //Original
enlace_id = texto.replace(/\d-\s|\?|¿/g,'');
enlace_id = enlace_id.replace(/\s+/g, '_');
$(this).attr('id',enlace_id);
/*--------------INICIO Agregando Numeral -------------------*/
if ($(this).hasClass('')){ // Es un H1
xnumeroconsecutivo_h1++; //Agregado alex
texto = xnumeroconsecutivo_h1 +") "+ $(this).text();
//$(this).append('your text'); agrega al texto
$(this).text(texto);
}
if ($(this).hasClass('n2')){ //Es un H2
xnumeroconsecutivo_h2++; //Agregado alex
texto = xnumeroconsecutivo_h1+"."+xnumeroconsecutivo_h2 +") "+ $(this).text();
$(this).text(texto);
} else {
xnumeroconsecutivo_h2=0; // si ya es otro titulo lo vuelve a 0
}
/*--------------FIN Agregando Numeral -------------------*/
//Agregamos en una variable cadena
cadena += tmpllink.replace('{link}',"'#" + enlace_id + "'");
cadena = cadena.replace('{texto}',texto);
cadena = cadena.replace('{clase}',clase);
//alert(cadena);
} //Fin Artículos Relacionados
});
/*---------------INICIO articulos Relacionados------------------------------------*/
//Ejemplo de link adicional articulo relacionado, descomentar
//$('div.rel_posts h3').attr('id','relacionados');
//cadena +="<p><i class='fa fa-link'></i> <a href='#relacionados'>- Artículos relacionados</a></p>\n";
var icono_articulos_relacionados = "<?php echo $icono_articulos_relacionados;?>";
// Formato del HTML
//<div class="rel_posts"> // Este es el contenedor del articulo relacionado
//El Titulo articulo relacionado deve estar entre etiqueta H3
//<h3>Artículos Relacionados</h3> aqui se agrega al h3 id="relacionados" quedando asi
//<h3 id="relacionados">Artículos Relacionados</h3>
$('div.rel_posts h3').attr('id','relacionados');
//cadena +="<p><i class='fas fa-link'></i> <a href='#relacionados'>- Artículos relacionados</a></p>\n";
var icono_articulos_relacionados = "<?=$icono_articulos_relacionados?>";
cadena +="<p> " +icono_articulos_relacionados+" <a href='#relacionados'>- Artículos relacionados</a></p>\n";
/*---------------FIN articulos Relacionados------------------------------------*/
cadena = tmplwrap.replace('{contenido}',cadena);
//alert(cadena);
//Finalmente insertamos la cadena (.contenido_articulo es una clase para un div )
//$(cadena).insertBefore( $('article .fecha_publicacion').first() );
$(cadena).insertBefore( $('article .contenido_articulo'));
} // Fin contador h2
})(jQuery);
</script>
Nota tambien podemos usar variables php por ejemplo en los iconos:
Codigo PHP
$icono_articulos_relacionados="<i class='fas fa-link'></i>   ";
$icono_articulos_flecha_derecha="<i class='fa fa-caret-right'></i>   ";
Código Javascript
var icono_articulos_flecha_derecha = "<?=$icono_articulos_flecha_derecha?>";
var tmpllink = "<p {clase}> "+icono_articulos_flecha_derecha+" <a href={link}>{texto}</a></p>\n";
Agregando código CSS
#tabla-contenido{background-color: #EDEDED;width: 80%;
padding:10px 20px 20px;margin: 10px auto 30px;border-radius: 5px;}
#tabla-contenido p{margin:0;}
#tabla-contenido p.n2{margin-left: 20px;}
#tabla-contenido p.n3{margin-left: 40px;}
#tabla-contenido .titulo{background-color: #D8D8D8;
padding: 2px;margin-bottom: 10px;border-radius: 5px;width: 100%;
text-align: center;font-size: 16px;font-weight: bold;}
Fuente:
Tabla de Contenidos en WordPress sin plugins
https://github.com/jmarreros/Genera-Tabla-de-contenidos
Articulo : 1929 - Veces Leidas