He desarrollado un Plugin llamado Breadcrumbs Plus que puedes descargar libremente en el directorio de Wordpress.
En Internet es necesario que el usuario sepa en todo momento dónde se encuentra, cómo ha llegado hasta allí y tener la posibilidad de volver a una posición anterior de su camino en el momento que él lo deseé. El Breadcrumb ayuda al usuario a resolver estas cuestiones.
Tan solo hay que escribir la siguiente función en el archivo functions.php:
/**
* Muestra un Menú de navegación del tipo Breadcrumbs
*
* @param array $args
* @return string
*/
function breadcrumbs( $args = '' ) {
$defaults = array(
'prefix' => '<p id="breadcrumbs">Te encuentras en: ',
'suffix' => '</p>',
'home' => 'Inicio',
'sep' => '»',
'front_page' => false,
'bold' => true,
'blog' => 'Blog',
'echo' => true
);
$r = wp_parse_args( $args, $defaults );
if ( is_front_page() && !$['front_page'] )
return apply_filters( 'breadcrumbs', false );
global $wp_query, $post;
function bold( $input, $lastbold ) {
if ( $lastbold )
return '<strong>'. $input . '</strong>';
return $input;
}
function custom_get_category_parents( $id, $link = FALSE, $separator = '/', $nicename = FALSE, $bold ){
$chain = '';
$parent = &get_category( $id );
if ( is_wp_error( $parent ) )
return $parent;
if ( $nicename )
$name = $parent->slug;
else
$name = $parent->cat_name;
if ( $parent->parent && ( $parent->parent != $parent->term_id ) )
$chain .= get_category_parents( $parent->parent, true, $separator, $nicename );
$chain .= bold( $name, $bold );
return $chain;
}
$on_front = get_option( 'show_on_front' );
if ( $on_front == "page" ) {
$homelink = '<a href="' . get_permalink( get_option( 'page_on_front' ) ) . '">' . $r['home'] . '</a>';
$bloglink = $homelink . ' ' . $r['sep'] . ' <a href="' . get_permalink( get_option( 'page_for_posts' ) ).'">' . $r['blog'] . '</a>';
} else {
$homelink = '<a href="' . home_url( '/' ) . '" rel="home">' . $r['home'] . '</a>';
$bloglink = $homelink;
}
if ( ( $on_front == "page" && is_front_page() ) || ( $on_front == "posts" && is_home() ) )
$output = bold( $home, $r['bold'] );
elseif ( $on_front == "page" && is_home() )
$output = $homelink . ' ' . $r['sep'] . ' ' . bold( $r['blog'], $r['bold'] );
elseif ( !is_page() ) {
$output = $bloglink . ' ' . $r['sep'] . ' ';
if ( is_single() ) {
$cats = get_the_category();
$cat = $cats[0];
if ( is_object( $cat ) ) {
if ( $cat->parent != 0 )
$output .= get_category_parents( $cat->term_id, true, " " . $r['sep'] . " " );
else
$output .= '<a href="' . get_category_link( $cat->term_id ) . '">' . $cat->name . '</a> ' . $r['sep'] . ' ';
}
}
if ( is_archive() ) {
if ( is_category() ) {
$cat = intval( get_query_var( 'cat' ) );
$output .= custom_get_category_parents( $cat, false, " " . $r['sep'] . " ", false, $r['bold'] );
} elseif ( is_tag() || is_tax() ) {
$term = $wp_query->get_queried_object();
$output .= bold( "Archivos para " . $term->name, $r['bold'] );
} elseif ( is_date() ) {
$output .= bold( "Archivos para " . single_month_title( ' ', false ), $r['bold'] );
} elseif ( is_author() ) {
$output .= bold( "Archivos de " . get_the_author_meta( 'display_name', $wp_query->post->post_author ), $r['bold'] );
}
} elseif ( is_search() ) {
$output .= bold( 'Resultados de "' . stripslashes( strip_tags( get_search_query() ) ) . '"', $r['bold'] );
} elseif ( is_404() ) {
$output .= bold( 'Página no encontrada', $r['bold'] );
} else {
$output .= bold( get_the_title(), $r['bold'] );
}
} else {
$post = $wp_query->get_queried_object();
if ( 0 == $post->post_parent ) {
$output = $homelink. " " . $r['sep'] . " " . bold( get_the_title(), $r['bold'] );
} else {
if ( isset( $post->ancestors ) ) {
if ( is_array( $post->ancestors ) )
$ancestors = array_values( $post->ancestors );
else
$ancestors = array( $post->ancestors );
} else
$ancestors = array( $post->post_parent );
$ancestors = array_reverse( $ancestors );
$ancestors[] = $post->ID;
$links = array();
foreach ( ( array ) $ancestors as $ancestor ) {
$tmp = array();
$tmp['title'] = strip_tags( get_the_title( $ancestor ) );
$tmp['url'] = get_permalink( $ancestor );
$tmp['cur'] = false;
if ( $ancestor == $post->ID )
$tmp['cur'] = true;
$links[] = $tmp;
}
$output = $homelink;
foreach ( ( array ) $links as $link ) {
$output .= ' ' . $r['sep'] . ' ';
if ( !$link['cur'] )
$output .= '<a href="' . $link['url'] . '">' . $link['title'] . '</a>';
else
$output .= bold( $link['title'], $r['bold'] );
}
}
}
$breadcrumb = $r['prefix'] . $output . $r['suffix'];
$breadcrumb = apply_filters( 'breadcrumbs', $breadcrumb );
if ( !$r['echo'] )
return $breadcrumb;
echo $breadcrumb;
}
Para implementar la función solo hay que escribir:
<?php breadcrumbs(); ?>
Podemos personalizar la función de dos formas; para cambiar el nombre de la página de Inicio en nuestra Breadcrumb:
<?php breadcrumbs( 'home=Principal&bold=0' ); ?> <?php breadcrumbs( array( 'home' => 'Principal', 'bold' => false ) ); ?>
Este código lo he actualizado siguiendo algunas de las recomendaciones de Darío Ferrer.
2 responses to “Breadcrumbs para WordPress”
Bonito código Alberto. Te animo a convertirlo en un plugin, especialmente cuando la comunidad está escasa de breadcrumbs.
Sólo un par de sugerencias:
- Cuando aplicas el extract a $args no te recomiendo agregar el parámetro EXTR_SKIP. Mantén la sobrescritura activada y procura no repetir las variables existentes. Por otra parte yo en tu lugar no redefiniría $args (puede ser reutilizable en cualquier momento, nadie sabe) sino que crearía una nueva variable para tal fin.
- A partir de la línea 078 te sugiero reemplazar todas las condicionales con un solo switch, pues de esa manera simplificarás los pasos a la hora de ser interpretados por el servidor.
- En lugares donde lo ameriten sustituye las condicionales por ternarios, ejemplo:
if ( !$link['cur'] )$output .= $link['cur'] == true ? bold( $link['title'] ) : '' . $link['title'] . '';
Igualmente aplica ternarios donde la condicional no incluya un else. Con eso le darás más solidez al código.
Espero que no te molesten las sugerencias, van con toda cordialidad y buenas vibras. Siempre me alegra ver iniciativas de buen nivel en nuestro idioma, en especial cuando su autor tiene motivación a compartir conocimientos. Un saludo Alberto.
Que tal Darío!
Sabes? Te tomaré la palabra…
Me ha dado cuenta de que esta función requiere algunas modificación para mejorar como lo mencionas y después ira a la lista de WordPress Plugins.
Gracias por tus ánimos!
Saludos