PHPwordpressintermediate
WordPress Custom Breadcrumbs
Create SEO-friendly breadcrumb navigation without plugins
Faisal Yaqoob
November 15, 2025
#wordpress#breadcrumbs#navigation#seo#schema
Code
php
1 // Display breadcrumbs 2 function custom_breadcrumbs() { 3 // Settings 4 $separator = ' » '; 5 $home_title = 'Home'; 6 $breadcrumb_id = 'breadcrumbs'; 7 $breadcrumb_class = 'breadcrumbs'; 8
9 // Get the query & post information 10 global $post; 11
12 // Don't display on homepage 13 if (!is_front_page()) { 14
15 // Build the breadcrumbs 16 echo '<div id="' . $breadcrumb_id . '" class="' . $breadcrumb_class . '" vocab="https://schema.org/" typeof="BreadcrumbList">'; 17
18 // Home page 19 echo '<span property="itemListElement" typeof="ListItem">'; 20 echo '<a property="item" typeof="WebPage" href="' . home_url() . '" title="' . $home_title . '">'; 21 echo '<span property="name">' . $home_title . '</span></a>'; 22 echo '<meta property="position" content="1">'; 23 echo '</span>' . $separator; 24
25 $position = 2; 26
27 if (is_category()) { 28 // Category page 29 $cat_obj = get_queried_object(); 30 $this_cat = $cat_obj->term_id; 31 $this_cat = get_category($this_cat); 32 $parent_cat = $this_cat->parent; 33
34 if ($parent_cat != 0) { 35 $parent_cats = array(); 36 while ($parent_cat != 0) { 37 $parent_cat_obj = get_category($parent_cat); 38 $parent_cats[] = '<span property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" href="' . get_category_link($parent_cat_obj->term_id) . '" title="' . $parent_cat_obj->name . '"><span property="name">' . $parent_cat_obj->name . '</span></a><meta property="position" content="' . $position . '"></span>'; 39 $parent_cat = $parent_cat_obj->parent; 40 $position++; 41 } 42
43 $parent_cats = array_reverse($parent_cats); 44 echo implode($separator, $parent_cats) . $separator; 45 } 46
47 echo '<span property="itemListElement" typeof="ListItem">'; 48 echo '<span property="name">' . single_cat_title('', false) . '</span>'; 49 echo '<meta property="position" content="' . $position . '">'; 50 echo '</span>'; 51
52 } elseif (is_single()) { 53 // Post page 54 $category = get_the_category(); 55
56 if ($category) { 57 $category_id = $category[0]->cat_ID; 58 $category_parents = array(); 59
60 while ($category_id) { 61 $cat = get_category($category_id); 62 $category_parents[] = '<span property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" href="' . get_category_link($cat->term_id) . '" title="' . $cat->name . '"><span property="name">' . $cat->name . '</span></a><meta property="position" content="' . $position . '"></span>'; 63 $category_id = $cat->parent; 64 $position++; 65 } 66
67 $category_parents = array_reverse($category_parents); 68 echo implode($separator, $category_parents) . $separator; 69 } 70
71 echo '<span property="itemListElement" typeof="ListItem">'; 72 echo '<span property="name">' . get_the_title() . '</span>'; 73 echo '<meta property="position" content="' . $position . '">'; 74 echo '</span>'; 75
76 } elseif (is_page()) { 77 // Page 78 if ($post->post_parent) { 79 $parent_id = $post->post_parent; 80 $breadcrumbs = array(); 81
82 while ($parent_id) { 83 $page = get_page($parent_id); 84 $breadcrumbs[] = '<span property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" href="' . get_permalink($page->ID) . '"><span property="name">' . get_the_title($page->ID) . '</span></a><meta property="position" content="' . $position . '"></span>'; 85 $parent_id = $page->post_parent; 86 $position++; 87 } 88
89 $breadcrumbs = array_reverse($breadcrumbs); 90 echo implode($separator, $breadcrumbs) . $separator; 91 } 92
93 echo '<span property="itemListElement" typeof="ListItem">'; 94 echo '<span property="name">' . get_the_title() . '</span>'; 95 echo '<meta property="position" content="' . $position . '">'; 96 echo '</span>'; 97
98 } elseif (is_tag()) { 99 // Tag page 100 echo '<span property="itemListElement" typeof="ListItem">'; 101 echo '<span property="name">Tag: ' . single_tag_title('', false) . '</span>'; 102 echo '<meta property="position" content="' . $position . '">'; 103 echo '</span>'; 104
105 } elseif (is_author()) { 106 // Author page 107 global $author; 108 $user_info = get_userdata($author); 109
110 echo '<span property="itemListElement" typeof="ListItem">'; 111 echo '<span property="name">Author: ' . $user_info->display_name . '</span>'; 112 echo '<meta property="position" content="' . $position . '">'; 113 echo '</span>'; 114
115 } elseif (is_404()) { 116 // 404 page 117 echo '<span property="itemListElement" typeof="ListItem">'; 118 echo '<span property="name">Error 404</span>'; 119 echo '<meta property="position" content="' . $position . '">'; 120 echo '</span>'; 121
122 } elseif (is_search()) { 123 // Search page 124 echo '<span property="itemListElement" typeof="ListItem">'; 125 echo '<span property="name">Search results for: ' . get_search_query() . '</span>'; 126 echo '<meta property="position" content="' . $position . '">'; 127 echo '</span>'; 128
129 } elseif (is_archive()) { 130 // Archive page 131 echo '<span property="itemListElement" typeof="ListItem">'; 132 echo '<span property="name">' . post_type_archive_title('', false) . '</span>'; 133 echo '<meta property="position" content="' . $position . '">'; 134 echo '</span>'; 135 } 136
137 echo '</div>'; 138 } 139 }
WordPress Custom Breadcrumbs
Create custom breadcrumb navigation with Schema.org structured data for improved SEO and user experience.
// Display breadcrumbs
function custom_breadcrumbs() {
// Settings
$separator = ' » ';
$home_title = 'Home';
$breadcrumb_id = 'breadcrumbs';
$breadcrumb_class = 'breadcrumbs';
// Get the query & post information
global $post;
// Don't display on homepage
if (!is_front_page()) {
// Build the breadcrumbs
echo '<div id="' . $breadcrumb_id . '" class="' . $breadcrumb_class . '" vocab="https://schema.org/" typeof="BreadcrumbList">';
// Home page
echo '<span property="itemListElement" typeof="ListItem">';
echo '<a property="item" typeof="WebPage" href="' . home_url() . '" title="' . $home_title . '">';
echo '<span property="name">' . $home_title . '</span></a>';
echo '<meta property="position" content="1">';
echo '</span>' . $separator;
$position = 2;
if (is_category()) {
// Category page
$cat_obj = get_queried_object();
$this_cat = $cat_obj->term_id;
$this_cat = get_category($this_cat);
$parent_cat = $this_cat->parent;
if ($parent_cat != 0) {
$parent_cats = array();
while ($parent_cat != 0) {
$parent_cat_obj = get_category($parent_cat);
$parent_cats[] = '<span property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" href="' . get_category_link($parent_cat_obj->term_id) . '" title="' . $parent_cat_obj->name . '"><span property="name">' . $parent_cat_obj->name . '</span></a><meta property="position" content="' . $position . '"></span>';
$parent_cat = $parent_cat_obj->parent;
$position++;
}
$parent_cats = array_reverse($parent_cats);
echo implode($separator, $parent_cats) . $separator;
}
echo '<span property="itemListElement" typeof="ListItem">';
echo '<span property="name">' . single_cat_title('', false) . '</span>';
echo '<meta property="position" content="' . $position . '">';
echo '</span>';
} elseif (is_single()) {
// Post page
$category = get_the_category();
if ($category) {
$category_id = $category[0]->cat_ID;
$category_parents = array();
while ($category_id) {
$cat = get_category($category_id);
$category_parents[] = '<span property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" href="' . get_category_link($cat->term_id) . '" title="' . $cat->name . '"><span property="name">' . $cat->name . '</span></a><meta property="position" content="' . $position . '"></span>';
$category_id = $cat->parent;
$position++;
}
$category_parents = array_reverse($category_parents);
echo implode($separator, $category_parents) . $separator;
}
echo '<span property="itemListElement" typeof="ListItem">';
echo '<span property="name">' . get_the_title() . '</span>';
echo '<meta property="position" content="' . $position . '">';
echo '</span>';
} elseif (is_page()) {
// Page
if ($post->post_parent) {
$parent_id = $post->post_parent;
$breadcrumbs = array();
while ($parent_id) {
$page = get_page($parent_id);
$breadcrumbs[] = '<span property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" href="' . get_permalink($page->ID) . '"><span property="name">' . get_the_title($page->ID) . '</span></a><meta property="position" content="' . $position . '"></span>';
$parent_id = $page->post_parent;
$position++;
}
$breadcrumbs = array_reverse($breadcrumbs);
echo implode($separator, $breadcrumbs) . $separator;
}
echo '<span property="itemListElement" typeof="ListItem">';
echo '<span property="name">' . get_the_title() . '</span>';
echo '<meta property="position" content="' . $position . '">';
echo '</span>';
} elseif (is_tag()) {
// Tag page
echo '<span property="itemListElement" typeof="ListItem">';
echo '<span property="name">Tag: ' . single_tag_title('', false) . '</span>';
echo '<meta property="position" content="' . $position . '">';
echo '</span>';
} elseif (is_author()) {
// Author page
global $author;
$user_info = get_userdata($author);
echo '<span property="itemListElement" typeof="ListItem">';
echo '<span property="name">Author: ' . $user_info->display_name . '</span>';
echo '<meta property="position" content="' . $position . '">';
echo '</span>';
} elseif (is_404()) {
// 404 page
echo '<span property="itemListElement" typeof="ListItem">';
echo '<span property="name">Error 404</span>';
echo '<meta property="position" content="' . $position . '">';
echo '</span>';
} elseif (is_search()) {
// Search page
echo '<span property="itemListElement" typeof="ListItem">';
echo '<span property="name">Search results for: ' . get_search_query() . '</span>';
echo '<meta property="position" content="' . $position . '">';
echo '</span>';
} elseif (is_archive()) {
// Archive page
echo '<span property="itemListElement" typeof="ListItem">';
echo '<span property="name">' . post_type_archive_title('', false) . '</span>';
echo '<meta property="position" content="' . $position . '">';
echo '</span>';
}
echo '</div>';
}
}
Usage in Template
// In your theme template (single.php, page.php, etc.)
<?php custom_breadcrumbs(); ?>
Styling
/* Breadcrumb styles */
.breadcrumbs {
padding: 15px 0;
margin-bottom: 20px;
font-size: 14px;
color: #666;
background: #f5f5f5;
border-radius: 4px;
padding: 10px 15px;
}
.breadcrumbs a {
color: #0073aa;
text-decoration: none;
transition: color 0.3s ease;
}
.breadcrumbs a:hover {
color: #005a87;
text-decoration: underline;
}
.breadcrumbs span:last-child {
color: #333;
font-weight: 500;
}
Simplified Version
// Simple breadcrumbs without Schema
function simple_breadcrumbs() {
global $post;
if (!is_front_page()) {
echo '<div class="breadcrumbs">';
echo '<a href="' . home_url() . '">Home</a> » ';
if (is_category() || is_single()) {
the_category(' » ');
if (is_single()) {
echo ' » ';
the_title();
}
} elseif (is_page()) {
echo get_the_title();
} elseif (is_search()) {
echo 'Search Results for: ' . get_search_query();
} elseif (is_404()) {
echo '404 Not Found';
}
echo '</div>';
}
}
WooCommerce Support
// Breadcrumbs with WooCommerce support
function breadcrumbs_with_woocommerce() {
if (class_exists('WooCommerce') && (is_shop() || is_product_category() || is_product())) {
woocommerce_breadcrumb(array(
'delimiter' => ' » ',
'wrap_before' => '<div class="breadcrumbs">',
'wrap_after' => '</div>',
'home' => 'Home',
));
} else {
custom_breadcrumbs();
}
}
JSON-LD Schema Alternative
// Output breadcrumbs as JSON-LD
function breadcrumbs_json_ld() {
if (is_front_page()) {
return;
}
$breadcrumbs = array();
$breadcrumbs[] = array(
'@type' => 'ListItem',
'position' => 1,
'name' => 'Home',
'item' => home_url()
);
$position = 2;
if (is_single()) {
$category = get_the_category();
if ($category) {
$breadcrumbs[] = array(
'@type' => 'ListItem',
'position' => $position++,
'name' => $category[0]->name,
'item' => get_category_link($category[0]->term_id)
);
}
$breadcrumbs[] = array(
'@type' => 'ListItem',
'position' => $position,
'name' => get_the_title(),
'item' => get_permalink()
);
}
$schema = array(
'@context' => 'https://schema.org',
'@type' => 'BreadcrumbList',
'itemListElement' => $breadcrumbs
);
echo '<script type="application/ld+json">' . json_encode($schema, JSON_UNESCAPED_SLASHES) . '</script>';
}
add_action('wp_head', 'breadcrumbs_json_ld');
Features
- SEO Optimized: Schema.org structured data
- Hierarchical: Shows full page/category hierarchy
- Customizable: Easy to modify separator and styling
- WooCommerce Ready: Optional WooCommerce support
- Responsive: Works on all device sizes
- Accessible: Proper semantic HTML
Related Snippets
WordPress Custom Menu Walker
Create custom navigation menu HTML structure with a custom walker class
PHPwordpressadvanced
phpPreview
// Custom Walker Class for Bootstrap 5
class Bootstrap_5_Walker_Nav_Menu extends Walker_Nav_Menu {
/**
...#wordpress#menu#navigation+2
11/13/2025
View
Create Custom WordPress REST API Endpoint
Add custom REST API endpoints to extend WordPress functionality
PHPwordpressintermediate
phpPreview
// Register custom REST API endpoint
function register_custom_api_endpoint() {
register_rest_route('custom/v1', '/posts', array(
'methods' => 'GET',
...#wordpress#rest-api#api+2
11/14/2025
View
Configure WordPress SMTP Email
Set up SMTP for reliable WordPress email delivery using PHPMailer
PHPwordpressintermediate
phpPreview
// Configure SMTP settings for WordPress
function configure_smtp_settings($phpmailer) {
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.gmail.com'; // Your SMTP server
...#wordpress#email#smtp+2
11/12/2025
View