Woocommerce dynamic breadcrumbs for products on multiple categories

Viewed 183

I have been searching for hours and the closest I got is overriding breadcrumb.php with the following. It works perfectly on "archive" but on "single_product" depending on the referrer it returns plenty of delimiters ">" (see photo below). Any php savvies that could give me a hand with this please? Thank you so much!

single_product breadcrumb

<?php

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

if (!empty($breadcrumb)) {

    echo $wrap_before;

    if (is_single() && get_post_type() == 'product') {
        $breadcrumb_diff = [];
        $breadcrumb_diff[] = $breadcrumb[0];
        if ($terms = get_the_terms($post->ID, 'product_cat')) {
            $referer = wp_get_referer();
            $site_url = site_url();
            $referer = str_replace($site_url . '', '', $referer);
            $referer_array = explode('/', $referer);
            foreach ($referer_array as $term_slug) {
                $get_term_by_slug = get_term_by('slug', $term_slug, 'product_cat');
                $breadcrumb_diff[] = [$get_term_by_slug->name, get_term_link($term_slug, 'product_cat')];
            }
            $breadcrumb_diff[]= $breadcrumb[count($breadcrumb) - 1];

            foreach ($breadcrumb_diff as $key => $crumb) {

                echo $before;

                if (!empty($crumb[1]) && sizeof($breadcrumb_diff) !== $key + 1) {
                    echo '<a href="' . esc_url($crumb[1]) . '">' . esc_html($crumb[0]) . '</a>';
                } else {
                    echo esc_html($crumb[0]);
                }

                echo $after;

                if (sizeof($breadcrumb) !== $key + 1) {
                    echo $delimiter;
                }

            }
        }
    } else {

        foreach ($breadcrumb as $key => $crumb) {

            echo $before;

            if (!empty($crumb[1]) && sizeof($breadcrumb) !== $key + 1) {
                echo '<a href="' . esc_url($crumb[1]) . '">' . esc_html($crumb[0]) . '</a>';
            } else {
                echo esc_html($crumb[0]);
            }

            echo $after;

            if (sizeof($breadcrumb) !== $key + 1) {
                echo $delimiter;
            }

        }
    }

    echo $wrap_after;

}
0 Answers
Related