There are a lot of plugins that offer a breadcrumb, but you can also create your own.
To create a simple breadcrumb, you’ll need 2 functions. One to create a chain of categories, and one to generate the breadcrumb itself.
Create a Chain of Categories
This function will generate a list of clickable categories, for when you are on a single post, page or category. We will use this in the breadcrumb later.
function wpse_get_category_parents( $id, $link = false, $separator="https://wordpress.stackexchange.com/", $nicename = false, $visited = array(), $iscrumb=false ) {
$chain = '';
$parent = get_term( $id, 'category' );
if ( is_wp_error( $parent ) ) {
return $parent;
}
if ( $nicename ) {
$name = $parent->slug;
} else {
$name = $parent->name;
}
if ( $parent->parent && ( $parent->parent != $parent->term_id ) && !in_array( $parent->parent, $visited ) ) {
$visited[] = $parent->parent;
$chain .= wpse_get_category_parents( $parent->parent, $link, $separator, $nicename, $visited , $iscrumb);
}
if (is_rtl()){
$sep_direction ='\\';
} else {
$sep_direction ="https://wordpress.stackexchange.com/";
}
if ($iscrumb){
$chain .= '<li><span class="sep">'.$sep_direction.'</span><a href="' . esc_url( get_category_link( $parent->term_id ) ) . '"><span>'.$name.'</span></a></li>' . $separator ;
} elseif ( $link && !$iscrumb) {
$chain .= '<a href="' . esc_url( get_category_link( $parent->term_id ) ) . '">'.$name.'</a>' . $separator ;
} else {
$chain .= $name.$separator;
}
return $chain;
}
Generate a Breadcrumb
We’ll write a function and use conditionals to generate different outputs based on different locations. We will use the above function here.
function wpse_get_breadcrumbs() {
global $wp_query;
if (is_rtl()){
$sep_direction ='\\';
} else {
$sep_direction ="https://wordpress.stackexchange.com/";
}?>
<ul><?php
// Adding the Home Page ?>
<li><a href="https://wordpress.stackexchange.com/questions/279755/<?php echo esc_url( home_url() ); ?>"><span> <?php bloginfo('name'); ?></span></a></li><?php
if ( ! is_front_page() ) {
// Check for categories, archives, search page, single posts, pages, the 404 page, and attachments
if ( is_category() ) {
$cat_obj = $wp_query->get_queried_object();
$thisCat = get_category( $cat_obj->term_id );
$parentCat = get_category( $thisCat->parent );
if($thisCat->parent != 0) {
$cat_parents = wpse_get_category_parents( $parentCat, true, '', false, array(), true );
}
if ( $thisCat->parent != 0 && ! is_wp_error( $cat_parents ) ) {
echo $cat_parents;
}
echo '<li><span class="sep">'.$sep_direction.'</span><a href="'.get_category_link($thisCat).'"><span>'.single_cat_title( '', false ).'</span></a></li>';
} elseif ( is_archive() && ! is_category() ) { ?>
<li><span class="sep"><?php echo $sep_direction;?></span> <?php _e( 'Archives' ); ?></li><?php
} elseif ( is_search() ) { ?>
<li><span class="sep"><?php echo $sep_direction;?></span> <?php _e( 'Search Results' ); ?></li><?php
} elseif ( is_404() ) { ?>
<li><span class="sep"><?php echo $sep_direction;?></span> <?php _e( '404 Not Found' ); ?></li><?php
} elseif ( is_singular() ) {
$category = get_the_category();
$category_id = get_cat_ID( $category[0]->cat_name );
$cat_parents = wpse_get_category_parents( $category_id, true, '',false, array(), true );
if ( ! is_wp_error( $cat_parents ) ) {
echo $cat_parents;
}?>
<li>
<a href="<?php the_permalink();?>"><span class="sep"><?php echo $sep_direction;?></span><?php the_title();?></a>
</li><?php
} elseif ( is_singular( 'attachment' ) ) { ?>
<li>
<span class="sep"><?php echo $sep_direction;?></span> <?php the_title(); ?>
</li><?php
} elseif ( is_page() ) {
$post = $wp_query->get_queried_object();
if ( $post->post_parent == 0 ) { ?>
<li><?php _e( '<span class="sep">/</span>' ); the_title(); ?></li><?php
} else {
$title = the_title( '','', false );
$ancestors = array_reverse( get_post_ancestors( $post->ID ) );
array_push( $ancestors, $post->ID );
foreach ( $ancestors as $ancestor ) {
if ( $ancestor != end( $ancestors ) ) { ?>
<li>
<span class="sep"><?php echo $sep_direction;?></span><a href="<?php echo esc_url( get_permalink( $ancestor ) ); ?>"> <span><?php echo strip_tags( apply_filters( 'single_post_title', get_the_title( $ancestor ) ) ); ?></span></a>
</li><?php
} else { ?>
<li>
<span class="sep"><?php echo $sep_direction;?></span><?php echo strip_tags( apply_filters( 'single_post_title', get_the_title( $ancestor ) ) ); ?>
</li><?php
}
}
}
}
} ?>
</ul><?php
}
Output the Breadcrumb
After including both of above functions in your theme’s functions.php
file, you should use the below code in your theme’s header to output the breadcrumb:
if( ! is_home() ) {
wpse_get_breadcrumbs();
}
This will hide the breadcrumb on homepage, since it’s not really required.