Tutoriales para Diseño/Desarrollo Web y Social Media
Tutoriales para Diseño/Desarrollo Web y Social Media
Cómo agregar BreadCrumb sin utilizar un plugin en WordPress
4/01/2010 | Categoría: Diseño Web, How to | Tags: Wordpress, Wordpress-Themes | Por: Rene Silva
Los BreadCrumbs son esenciales en cualquier sitio ya que el usuario puede saber fácilmente donde se encuentra. Existen varias opciones para poder implementar los BreadCrumbs en WordPress, ya sea con plugins (Yoast BreadCrumbs) o sin ellos; pero el uso de plugins tiende a volver a WordPress mucho más lento (excluyendo a plugins de caché) es por eso que se debe tratar de utilizar la menor cantidad posible de plugins.
En EGRACE CREATIVE nos dieron un ejemplo claro de cómo crear BreadCrumbs sin utilizar un plugin. Este script utiliza la variable $_SERVER["REQUEST_URI"] (que nos devuelve algo parecido a “/categoria/nombre-del-post/”), la separa por los “/” que contiene. Al utilizarlo solemos tener algunas fallas cómo por ejemplo:
- No funciona correctamente al ser utilizado en una instalación WordPress dentro de una carpeta del tipo “www.example.com/blog”
- Problemas con los links en los comentarios del tipo “www.example.com/post-name/comment-page-1/#comment-1″
- El script está optimizado para permalinks del tipo “/%year%/%monthnum%/%day%/%postname%/”
- Este script no soporta las subcategorías produciendo links a páginas inexistentes “www.example.com/cat_1/sub_cat_1″
Por lo que modifiqué el código para una instalación de WordPress con los permalinks de tipo “/%category%/%post-name%/” (que es uno de los más utilizados).
Paso 1: Crear breadcrumbs.php
Para poder utilizar este script debes crear un archivo llamado breadcrumbs.php en el directorio de tu theme y colocar el siguiente código en el archivo.
<div class="breadcrumbs">
<?php
function breadcrumbs()
{
$url = get_bloginfo('url');
$a = explode("/",$url);
$b = explode("/",$_SERVER["REQUEST_URI"]);
//intersección de arrays para poder quitar la base después
$c = array_intersect($a, $b);
$url_array = array_diff($b, $c);
//sacamos el nombre del post del array o si tiene
//comentarios los quitamos del array
array_pop($url_array);
//para quitar los comentarios del array o algún pedido (parecido a ?utm...)
if(preg_match('/comment-page-/',$_SERVER["REQUEST_URI"]) || preg_match('/\?/',$_SERVER["REQUEST_URI"]))
{
//sacamos el post ya que ya sacamos el comentario
array_pop($url_array);
}
echo 'Estás en <a href="'.$url.'/">Inicio</a>';
$dir = $url.'/';
if(is_single())
{
//para posts
foreach($url_array as $folder)
{
//del tipo www.example.com/categoria
$dir = $url.'/'.$folder.'/';
echo ' » <a href="'.$dir.'">'.ucwords(str_replace("-", " ", $folder) ). '</a>';
}
} else
{
//para paginas
foreach($url_array as $folder)
{
//los folders se van acoplando
$dir = $dir.$folder.'/';
echo ' » <a href="'.$dir.'">'.ucwords(str_replace("-", " ", $folder)) . '</a>';
}
}
echo wp_title();
}
breadcrumbs();
?>
</div>
Paso 2: Modificar el código en Single.php y Page.php
Después de haber creado el archivo debemos llamarlo desde los archivos single.php y page.php para que estos desplieguen el breadcumb. Debemos colocar el código preferentemente antes de que se despliegue el título dentro del Loop
<?php if(have_posts()) : while(have_posts()) : the_post(); ?> <?php include ( TEMPLATEPATH . '/breadcrumbs.php'); ?> <h1><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h1>
Paso 3: Estilizando al Breadcumb
Que puede ir bien con el siguiente código CSS:
.breadcrumbs {
background:#f7f6ed;
padding:10px;
}
.breadcrumbs a {
/*También podemos utilizar uppercase*/
text-transform:capitalize;
color:#666;
font-weight:700;
}
Notas
Las tildes de los títulos se perderán y todo dependerá del slug que utilicemos en las categorías.
Update
Estoy utilizando la función “ucwords” en el código. Básicamente el código agarra el URL y lo secciona con el criterio “/”. El resultado es un array con caracteres en minúscula. Este problema lo solucionaba con CSS (text-transform:capitalize), pero olvidé que a Google no le importa el código CSS, así que lo indexaba en minúscula.



