• I wanted to share a solution for a problem I had with getting breadcrumbs to fully propagate on my WooCommerce site using the Mystile theme. I think I found a solution for the issue of providing breadcrumbs on the product page that incorporates the categories and sub-categories that the product belongs to. The breadcrumb should look as follows:

    Home / Products / Category / Sub Category / Product

    With all but the final Product crumb being a link to their respective pages (Products links to Shop). My solution was to take a piece of code that from the WooCommerce Codex, and make a couple small alterations so that the subcategories would also show. The final code is pasted below:

    // Add product categories to the "Product" breadcrumb in WooCommerce.
    // Get breadcrumbs on product pages that read: Home > Shop > Product category > Product Name
    add_filter( 'woo_breadcrumbs_trail', 'woo_custom_breadcrumbs_trail_add_product_categories', 20 );
    function woo_custom_breadcrumbs_trail_add_product_categories ( $trail ) {
    if ( ( get_post_type() === 'product' ) && is_singular() ) {
    global $post;
    $taxonomy = 'product_cat';
    $terms = get_the_terms( $post->ID, $taxonomy );
    $links = array();
    if ( $terms && ! is_wp_error( $terms ) ) {
    $count = 0;
    foreach ( $terms as $c ) {
    $count++;
    //if ( $count > 1 ) { continue; }
    $parents = woo_get_term_parents( $c->term_id, $taxonomy, true, ', ', $c->name, array() );
    if ( $parents != '' && ! is_wp_error( $parents ) ) {
    $parents_arr = explode( ', ', $parents );
    foreach ( $parents_arr as $p ) {
    if ( $p != '' ) { $links[] = $p; }
    }
    }
    }
    // Add the trail back on to the end.
    // $links[] = $trail['trail_end'];
    $trail_end = get_the_title($post->ID);
    // Add the new links, and the original trail's end, back into the trail.
    array_splice( $trail, 2, count( $trail ) - 1, $links );
    $trail['trail_end'] = $trail_end;
    //remove any duplicate breadcrumbs
    $trail = array_unique($trail);
    }
    }
    return $trail;
    } // End woo_custom_breadcrumbs_trail_add_product_categories()
    /**
    * Retrieve term parents with separator.
    *
    * @param int $id Term ID.
    * @param string $taxonomy.
    * @param bool $link Optional, default is false. Whether to format with link.
    * @param string $separator Optional, default is '/'. How to separate terms.
    * @param bool $nicename Optional, default is false. Whether to use nice name for display.
    * @param array $visited Optional. Already linked to terms to prevent duplicates.
    * @return string
    */
    if ( ! function_exists( 'woo_get_term_parents' ) ) {
    function woo_get_term_parents( $id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array() ) {
    $chain = '';
    $parent = &get_term( $id, $taxonomy );
    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 .= woo_get_term_parents( $parent->parent, $taxonomy, $link, $separator, $nicename, $visited );
    }
    if ( $link ) {
    $chain .= '<a href="' . get_term_link( $parent, $taxonomy ) . '" title="' . esc_attr( sprintf( __( "View all posts in %s" ), $parent->name ) ) . '">'.$parent->name.'</a>' . $separator;
    } else {
    $chain .= $name.$separator;
    }
    return $chain;
    } // End woo_get_term_parents()
    }

    In addition, I use the following code to change the word “Products” to “Shop”. You can easily alter the code to change the word Products to whatever you like.

    /*
     * Change "Products" to "Shop" in WooCommerce breadcrumbs
     */
    function woo_custom_product_breadcrumbs_trail ( $trail ) {
    
      $my_word = 'Shop';  //Change 'Shop' to whatever you want.
    
      foreach ( $trail as $k => $v ) {
        if ( strtolower( strip_tags( $v ) ) === 'products' ) {
          $trail[$k] = '<a href="' . home_url( '/shop' ) . '">' . $my_word . '</a>';
          break;
        }
      }
    
      return $trail;
    }
    
    add_filter( 'woo_breadcrumbs_trail', 'woo_custom_product_breadcrumbs_trail', 10 );

    I hope this helps somebody out because I was looking around for this for quite a while. It works for me, but my site is still on my local computer, so I can’t show you the results.

    If you want the breadcrumbs to fully appear on category pages, add whatever you used as $my_word in the code above to the “Shop category base” field in your WordPress Settings->permalinks page. More info here.

    In case it’s not obvious, all code should be put in your theme’s function.php file. Or even better yet, your child theme’s function.php file.

Viewing 5 replies - 1 through 5 (of 5 total)
  • remyl

    (@remyl)

    Hi bace135,

    That’s exactly what I’m trying to do on my actual project.

    Where did you put that code exactly?

    I tried in functions.php file but nothing changed, and also in breadcrumbs.php but the breadcrumb disappeared.

    Thank you in advance!

    Thread Starter brybott

    (@bace135)

    remyl,

    I put the above code directly in the functions.php file of my child theme.

    The path looks like this:

    wordpress > wp-content > themes > mystile-child > functions.php

    It might be possible that Woo Commerce has been updated and this code no longer works with the updated version.

    Sorry I can’t be of more help.

    remyl

    (@remyl)

    It finally worked!

    Thank you ??

    cookieloop

    (@cookieloop)

    doesnt work for me too ?? , wordpress 4.1, theme x, woocommerce ….

    cookieloop

    (@cookieloop)

    This code work for me! dustdevilfx.com

    https://theme.co/x/member/forums/topic/how-to-feature-product-category-in-breadcrumbs/

    // Breadcrumbs Display Category Name
    // =============================================================================
    
    function get_breadcrumb_category( $cat ) {
       $post = get_post( $post->ID );
       $post_type = $post->post_type;
       $taxonomy = $cat;
    
       $f_categories = wp_get_post_terms( $post->ID, $taxonomy );
       $f_category = $f_categories[0];
    
       if ( $f_category->parent != 0 ) {
          $f_category_id    = $f_category->parent;
          $parent_array     = get_term_by('id', $f_category_id, $taxonomy, 'ARRAY_A');
          $f_category_name  = $parent_array["name"];
          $term_link        = get_term_link( $f_category_id, $taxonomy );
       } else {
          $f_category_id    = $f_category->term_id;
          $f_category_name  = $f_category->name;
          $term_link        = get_term_link( $f_category_id, $taxonomy );
       }
    
       if ( $f_categories && ! is_wp_error($f_categories) ) {
          return '<a href="' . $term_link . '">' . $f_category_name . '</a>';
       } else {
          return '';
       }
    }
    
    function x_breadcrumbs() {
    
        if ( x_get_option( 'x_breadcrumb_display', '1' ) ) {
    
          GLOBAL $post;
    
          $is_ltr         = ! is_rtl();
          $stack          = x_get_stack();
          $delimiter      = x_get_breadcrumb_delimiter();
          $home_text      = x_get_breadcrumb_home_text();
          $home_link      = home_url();
          $current_before = x_get_breadcrumb_current_before();
          $current_after  = x_get_breadcrumb_current_after();
          $page_title     = get_the_title();
          $blog_title     = get_the_title( get_option( 'page_for_posts', true ) );
          $post_parent    = $post->post_parent;
    
          if ( X_WOOCOMMERCE_IS_ACTIVE ) {
            $shop_url   = x_get_shop_link();
            $shop_title = x_get_option( 'x_' . $stack . '_shop_title', __( 'The Shop', '__x__' ) );
            $shop_link  = '<a href="'. $shop_url .'">' . $shop_title . '</a>';
          }
    
          echo '<div class="x-breadcrumbs"><a href="' . $home_link . '">' . $home_text . '</a>' . $delimiter;
    
            if ( is_home() ) {
    
              echo $current_before . $blog_title . $current_after;
    
            } elseif ( is_category() ) {
    
              $the_cat = get_category( get_query_var( 'cat' ), false );
              if ( $the_cat->parent != 0 ) echo '<a href="'.get_permalink(102).'">'.get_the_title(102) .'</a>';
              echo $current_before . single_cat_title( '', false ) . $current_after;
    
            } elseif ( x_is_product_category() ) {
    
              if ( $is_ltr ) {
                echo $shop_link . $delimiter . $current_before . single_cat_title( '', false ) . $current_after;
              } else {
                echo $current_before . single_cat_title( '', false ) . $current_after . $delimiter . $shop_link;
              }
    
            } elseif ( x_is_product_tag() ) {
    
              if ( $is_ltr ) {
                echo $shop_link . $delimiter . $current_before . single_tag_title( '', false ) . $current_after;
              } else {
                echo $current_before . single_tag_title( '', false ) . $current_after . $delimiter . $shop_link;
              }
    
            } elseif ( is_search() ) {
    
              echo $current_before . __( 'Search Results for ', '__x__' ) . '“' . get_search_query() . '”' . $current_after;
    
            } elseif ( is_singular( 'post' ) ) {
    
              if ( get_option( 'page_for_posts' ) == is_front_page() ) {
                echo $current_before . $page_title . $current_after;
              } else {
                if ( $is_ltr ) {
    
                  $f_category = get_the_category();
    
                  if ( $f_category[0]->parent != 0 ) {
                     $f_category_id = $f_category[0]->parent;
                     $f_category_name = get_cat_name( $f_category_id );
                  } else {
                     $f_category_id = $f_category[0]->term_id;
                     $f_category_name = $f_category[0]->name;
                  }
    
                  echo '<a href="' . get_category_link( $f_category_id ) . '">' . $f_category_name . '</a>' . $delimiter . $current_before . $page_title . $current_after;
                } else {
                  echo $current_before . $page_title . $current_after . $delimiter . '<a href="' . get_permalink( get_option( 'page_for_posts' ) ) . '">' . $blog_title . '</a>';
                }
              }
    
            } elseif ( x_is_portfolio() ) {
    
              echo $current_before . get_the_title() . $current_after;
    
            } elseif ( x_is_portfolio_item() ) {
    
              $link  = x_get_parent_portfolio_link();
              $title = x_get_parent_portfolio_title();
    
              if ( $v = get_breadcrumb_category('portfolio-category') ) {
                $portfolio_category = $delimiter . $v;
              } else {
                $portfolio_category = '';
              }
    
              if ( $is_ltr ) {
                echo '<a href="' . $link . '">' . $title . '</a>' . $portfolio_category . $delimiter . $current_before . $page_title . $current_after;
              } else {
                echo $current_before . $page_title . $current_after . $portfolio_category . $delimiter . '<a href="' . $link . '">' . $title . '</a>';
              }
    
            } elseif ( x_is_product() ) {
    
             if ( $v = get_breadcrumb_category('product_cat') ) {
               $product_category = $delimiter . $v;
             } else {
               $product_category = '';
             }
    
              if ( $is_ltr ) {
                echo $shop_link . $product_category . $delimiter . $current_before . $page_title . $current_after;
              } else {
                echo $current_before . $page_title . $current_after . $product_category . $delimiter . $shop_link;
              }
    
            } elseif ( x_is_buddypress() ) {
    
              if ( bp_is_group() ) {
                echo '<a href="' . bp_get_groups_directory_permalink() . '">' . x_get_option( 'x_buddypress_groups_title', __( 'Groups', '__x__' ) ) . '</a>' . $delimiter . $current_before . x_buddypress_get_the_title() . $current_after;
              } elseif ( bp_is_user() ) {
                echo '<a href="' . bp_get_members_directory_permalink() . '">' . x_get_option( 'x_buddypress_members_title', __( 'Members', '__x__' ) ) . '</a>' . $delimiter . $current_before . x_buddypress_get_the_title() . $current_after;
              } else {
                echo $current_before . x_buddypress_get_the_title() . $current_after;
              }
    
            } elseif ( x_is_bbpress() ) {
    
              remove_filter( 'bbp_no_breadcrumb', '__return_true' );
    
              if ( bbp_is_forum_archive() ) {
                echo $current_before . bbp_get_forum_archive_title() . $current_after;
              } else {
                echo bbp_get_breadcrumb();
              }
    
              add_filter( 'bbp_no_breadcrumb', '__return_true' );
    
            } elseif ( is_page() && ! $post_parent ) {
    
              echo $current_before . $page_title . $current_after;
    
            } elseif ( is_page() && $post_parent ) {
    
              $parent_id   = $post_parent;
              $breadcrumbs = array();
    
              if ( is_rtl() ) {
                echo $current_before . $page_title . $current_after . $delimiter;
              }
    
              while ( $parent_id ) {
                $page          = get_page( $parent_id );
                $breadcrumbs[] = '<a href="' . get_permalink( $page->ID ) . '">' . get_the_title( $page->ID ) . '</a>';
                $parent_id     = $page->post_parent;
              }
    
              if ( $is_ltr ) {
                $breadcrumbs = array_reverse( $breadcrumbs );
              }
    
              for ( $i = 0; $i < count( $breadcrumbs ); $i++ ) {
                echo $breadcrumbs[$i];
                if ( $i != count( $breadcrumbs ) -1 ) echo $delimiter;
              }
    
              if ( $is_ltr ) {
                echo $delimiter . $current_before . $page_title . $current_after;
              }
    
            } elseif ( is_tag() ) {
    
              echo $current_before . single_tag_title( '', false ) . $current_after;
    
            } elseif ( is_author() ) {
    
              GLOBAL $author;
              $userdata = get_userdata( $author );
              echo $current_before . __( 'Posts by ', '__x__' ) . '“' . $userdata->display_name . $current_after . '”';
    
            } elseif ( is_404() ) {
    
              echo $current_before . __( '404 (Page Not Found)', '__x__' ) . $current_after;
    
            } elseif ( is_archive() ) {
    
              if ( x_is_shop() ) {
                echo $current_before . $shop_title . $current_after;
              } else {
                echo $current_before . __( 'Archives ', '__x__' ) . $current_after;
              }
    
            }
    
          echo '</div>';
    
        }
    
    }
Viewing 5 replies - 1 through 5 (of 5 total)
  • The topic ‘WooCommerce Product Page Bread Crumbs Solution’ is closed to new replies.