PHPwordpressintermediate

WordPress Custom Breadcrumbs

Create SEO-friendly breadcrumb navigation without plugins

#wordpress#breadcrumbs#navigation#seo#schema
Share this snippet:

Code

php
1// Display breadcrumbs
2function 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   = ' &raquo; ';
    $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> &raquo; ';

        if (is_category() || is_single()) {
            the_category(' &raquo; ');

            if (is_single()) {
                echo ' &raquo; ';
                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'   => ' &raquo; ',
            '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