<?php



add_filter('wpseo_breadcrumb_output_class', 'porto_wpseo_breadcrumb_output_class');



function porto_wpseo_breadcrumb_output_class($class) {

    if ($class)

        return $class . ' yoast-breadcrumbs';

    else

        return 'yoast-breadcrumbs';

}



function porto_breadcrumbs() {



    // use yoast breadcrumbs if enabled

    if ( function_exists( 'yoast_breadcrumb' ) ) {

        $yoast_breadcrumbs = yoast_breadcrumb('', '', false);

        if ($yoast_breadcrumbs) {

            return $yoast_breadcrumbs;

        }

    }



    global $porto_settings;



    $post = isset( $GLOBALS['post'] ) ? $GLOBALS['post'] : null;

    $output = '';



    // add breadcrumbs prefix

    if ( ! is_front_page() ) {

        if ( isset($porto_settings['breadcrumbs-prefix']) && $porto_settings['breadcrumbs-prefix'] ) {

            $output .= '<span class="breadcrumbs-prefix">' . $porto_settings['breadcrumbs-prefix'] . '</span>';

        }

    }



    // breadcrumbs start wrap

    $output .= '<ul class="breadcrumb">';



    // add home link

    if ( ! is_front_page() ) {

        $output .= porto_breadcrumbs_link( __('Home', 'porto'), apply_filters( 'woocommerce_breadcrumb_home_url', home_url() ) );

    } elseif ( is_home() ) {

        $output .= porto_breadcrumbs_link( $porto_settings['blog-title'] );

    }



    // add woocommerce shop page link

    if ( class_exists( 'WooCommerce' ) && ( ( is_woocommerce() && is_archive() && ! is_shop() ) || is_product() || is_cart() || is_checkout() || is_account_page() ) ) {

        $output .= porto_breadcrumbs_shop_link();

    }



    // add bbpress forums link

    if ( class_exists( 'bbPress' ) && is_bbpress() && ( bbp_is_topic_archive() || bbp_is_single_user() || bbp_is_search() || bbp_is_topic_tag()  || bbp_is_edit() ) ) {

        $output .= porto_breadcrumbs_link( bbp_get_forum_archive_title(), get_post_type_archive_link( 'forum' ) );

    }



    if ( is_singular() ) {

        if ( isset( $post->post_type ) && $post->post_type !== 'product' && get_post_type_archive_link( $post->post_type ) && (isset($porto_settings['breadcrumbs-archives-link']) && $porto_settings['breadcrumbs-archives-link']) ) {

            $output .= porto_breadcrumbs_archive_link();

        } elseif ( isset( $post->post_type ) && $post->post_type == 'post' && get_option( 'show_on_front' ) == 'page' && (isset($porto_settings['breadcrumbs-blog-link']) && $porto_settings['breadcrumbs-blog-link']) ) {

            $output .= porto_breadcrumbs_link( get_the_title( get_option('page_for_posts', true) ), get_permalink( get_option('page_for_posts' ) ) );

        }



        if ( isset( $post->post_parent ) && $post->post_parent == 0 ) {

            $output .= porto_breadcrumbs_terms_link();

        } else {

            $output .= porto_breadcrumbs_ancestors_link();

        }



        $output .= porto_breadcrumb_leaf();

    } else {

        if ( is_post_type_archive() ) {

            if ( is_search() ) {

                $output .= porto_breadcrumbs_archive_link();

                $output .= porto_breadcrumb_leaf( 'search' );

            } else {

                $output .= porto_breadcrumbs_archive_link( false );

            }

        } elseif ( is_tax() || is_tag() || is_category() ) {

            $html = porto_breadcrumbs_taxonomies_link();

            $html .= porto_breadcrumb_leaf( 'term' );



            if ( is_tag() ) {

                if ( get_option( 'show_on_front' ) == 'page' && (isset($porto_settings['breadcrumbs-blog-link']) && $porto_settings['breadcrumbs-blog-link']) ) {

                    $output .= porto_breadcrumbs_link( get_the_title( get_option('page_for_posts', true) ), get_permalink( get_option('page_for_posts' ) ) );

                }

                $output .= sprintf( __( 'Tag - %s', 'porto' ), $html );

            } elseif ( is_tax('product_tag') ) {

                $output .= sprintf( __( 'Product Tag - %s', 'porto' ), $html );

            } else {

                if ( is_category() && get_option( 'show_on_front' ) == 'page' && (isset($porto_settings['breadcrumbs-blog-link']) && $porto_settings['breadcrumbs-blog-link']) ) {

                    $output .= porto_breadcrumbs_link( get_the_title( get_option('page_for_posts', true) ), get_permalink( get_option('page_for_posts' ) ) );

                }

                if ( is_tax('portfolio_cat') || is_tax('portfolio_skills') ) {

                    $output .= porto_breadcrumbs_link( porto_breadcrumbs_archive_name('portfolio'), get_post_type_archive_link( 'portfolio' ) );

                }

                if ( is_tax('member_cat') ) {

                    $output .= porto_breadcrumbs_link( porto_breadcrumbs_archive_name('member'), get_post_type_archive_link( 'member' ) );

                }

                if ( is_tax('faq_cat') ) {

                    $output .= porto_breadcrumbs_link( porto_breadcrumbs_archive_name('faq'), get_post_type_archive_link( 'faq' ) );

                }

                $output .= $html;

            }

        } elseif ( is_date() ) {

            global $wp_locale;



            if ( get_option( 'show_on_front' ) == 'page' && (isset($porto_settings['breadcrumbs-blog-link']) && $porto_settings['breadcrumbs-blog-link']) ) {

                $output .= porto_breadcrumbs_link( get_the_title( get_option('page_for_posts', true) ), get_permalink( get_option('page_for_posts' ) ) );

            }



            $year = esc_html( get_query_var( 'year' ) );

            if ( is_month() || is_day() ) {

                $month = get_query_var( 'monthnum' );

                $month_name = $wp_locale->get_month( $month );

            }



            if ( is_year() ) {

                $output .= porto_breadcrumb_leaf( 'year' );

            } elseif ( is_month() ) {

                $output .= porto_breadcrumbs_link( $year, get_year_link( $year ) );

                $output .= porto_breadcrumb_leaf( 'month' );

            } elseif ( is_day() ) {

                $output .= porto_breadcrumbs_link( $year, get_year_link( $year ) );

                $output .= porto_breadcrumbs_link( $month_name, get_month_link( $year, $month ) );

                $output .= porto_breadcrumb_leaf( 'day' );

            }

        } elseif ( is_author() ) {

            $output .= porto_breadcrumb_leaf( 'author' );

        } elseif ( is_search() ) {

            $output .= porto_breadcrumb_leaf( 'search' );

        } elseif ( is_404() ) {

            $output .= porto_breadcrumb_leaf( '404' );

        } elseif ( class_exists( 'bbPress' ) && is_bbpress() ) {

            if ( bbp_is_search() ) {

                $output .= porto_breadcrumb_leaf( 'bbpress_search' );

            } elseif ( bbp_is_single_user() ) {

                $output .= porto_breadcrumb_leaf( 'bbpress_user' );

            } else {

                $output .= porto_breadcrumb_leaf();

            }

        } else {

            if ( is_home() && !is_front_page() ) {

                if ( get_option( 'show_on_front' ) == 'page' ) {

                    $output .= porto_breadcrumbs_link( get_the_title( get_option('page_for_posts', true) ) );

                } else {

                    $output .= porto_breadcrumbs_link( $porto_settings['blog-title'] );

                }

            }

        }

    }



    // breadcrumbs end wrap

    $output .= '</ul>';



    return apply_filters('porto_breadcrumbs', $output);

}



function porto_breadcrumbs_link($title, $link = '') {



    global $porto_settings;



    $microdata = (isset($porto_settings['rich-snippets']) && $porto_settings['rich-snippets']) ? true : false;



    $microdata_itemscope = $microdata_url = $microdata_title = $separator_markup = '';

	$microdata_itemscope = ( ! is_front_page() && $title == 'Home' ) ? 'class="home"' : '';

    if ( $microdata ) {

        $microdata_itemscope .= 'itemscope itemtype="http://schema.org/BreadcrumbList"';

        $microdata_url = 'itemprop="url"';

        $microdata_title = 'itemprop="title"';

    }



    $output = sprintf( '<span %s>%s</span>', $microdata_title, $title );

    $delimiter = '';

    if ( $link ) {

        $output = sprintf( '<a %s href="%s"%s>%s</a>', $microdata_url, $link, ( $title == 'Home' ) ? ' title="'.__('Go to Home Page').'"' : '', $output );

        $delimiter = '<i class="delimiter' . ($porto_settings['breadcrumbs-delimiter'] ? ' ' . $porto_settings['breadcrumbs-delimiter'] : '') . '"></i>';

        $before = sprintf( '<li %s>', $microdata_itemscope );

    } else {

        $before = '<li>';

    }

    $after = '</li>';



    return $before . $output . $delimiter . $after;

}



function porto_breadcrumbs_simple_link($title, $link = '') {

    global $porto_settings;



    $microdata = (isset($porto_settings['rich-snippets']) && $porto_settings['rich-snippets']) ? true : false;



    $microdata_itemscope = $microdata_url = $microdata_title = $separator_markup = '';



    if ( $microdata ) {

        $microdata_itemscope = 'itemscope itemtype="http://schema.org/BreadcrumbList"';

        $microdata_url = 'itemprop="url"';

        $microdata_title = 'itemprop="title"';

    }



    $output = sprintf( '<span %s>%s</span>', $microdata_title, $title );



    if ( $link ) {

        $output = sprintf( '<a %s href="%s" >%s</a>', $microdata_url, $link, $output );

    }



    $before = sprintf( '<span %s>', $microdata_itemscope );

    $after = '</span>';



    return $before . $output . $after;

}



function porto_breadcrumb_leaf( $object_type = '' ) {

    global $wp_query, $wp_locale;



    $post = isset( $GLOBALS['post'] ) ? $GLOBALS['post'] : null;



    switch( $object_type ) {

        case 'term':

            $term = $wp_query->get_queried_object();

            $title = $term->name;

            break;

        case 'year':

            $title = esc_html( get_query_var( 'year' ) );

            break;

        case 'month':

            $title = $wp_locale->get_month( get_query_var( 'monthnum' ) );

            break;

        case 'day':

            $title = get_query_var( 'day' );

            break;

        case 'author':

            $user = $wp_query->get_queried_object();

            $title = $user->display_name;

            break;

        case 'search':

            $search = esc_html( get_search_query() );

            if ( $product_cat = get_query_var('product_cat') ) {

                $product_cat = get_term_by('slug', $product_cat, 'product_cat');

                $search = '<a href="' . get_term_link($product_cat, 'product_cat') . '">' . esc_html( $product_cat->name ) . '</a>' . ( $search ? ' / ' : '' ) . $search;

            }

            $title = sprintf( __( 'Search - %s', 'porto' ), $search );

            break;

        case '404':

            $title = __( '404', 'porto' );

            break;

        case 'bbpress_search':

            $title = sprintf( __( 'Search - %s', 'porto' ), esc_html( get_query_var( 'bbp_search' ) ) );

            break;

        case 'bbpress_user':

            $current_user = wp_get_current_user();

            $title = $current_user->user_nicename;

            break;

        default:

            $title = get_the_title( $post->ID );

            break;

    }



    $before = '<li>';

    $after = '</li>';



    return $before . $title . $after;

}



function porto_breadcrumbs_links( $output ) {

    $delimiter = '<i class="delimiter"></i>';

    $before = '<li>';

    $after = '</li>';

    return $before . $output . $delimiter . $after;

}



function porto_breadcrumbs_shop_link( $linked = true ) {

    $post_type = 'product';

    $post_type_object = get_post_type_object( $post_type );

    $link = '';



    $output = '';

    if ( is_object( $post_type_object ) && class_exists( 'WooCommerce' ) && ( is_woocommerce() || is_cart() || is_checkout() || is_account_page() ) ) {

        $shop_page_id = wc_get_page_id( 'shop' );

        $shop_page_name = $shop_page_id ? get_the_title( $shop_page_id ) : '';



        if ( ! $shop_page_name ) {

            $shop_page_name = $post_type_object->labels->name;

        }

        if ($linked ) {

            $link = $shop_page_id !== -1 ? get_permalink($shop_page_id) : get_post_type_archive_link( $post_type );

        }

        $output .= porto_breadcrumbs_link( $shop_page_name, $link );

    }



    return $output;

}



function porto_breadcrumbs_archive_link( $linked = true ) {

    global $wp_query;



    $post_type = $wp_query->query_vars['post_type'];

    $post_type_object = get_post_type_object( $post_type );

    $link = '';

    $archive_title = '';



    if ( is_object( $post_type_object ) ) {



        // woocommerce

        if ( $post_type == 'product' && $shop_link = porto_breadcrumbs_shop_link( $linked ) ) {

            return $shop_link;

        }



        // bbpress

        if ( class_exists( 'bbPress' ) && $post_type == 'topic' ) {

            if ( $linked ) {

                $archive_title = bbp_get_forum_archive_title();

                $link = get_post_type_archive_link( bbp_get_forum_post_type() );

            } else {

                $archive_title = bbp_get_topic_archive_title();

            }



            return porto_breadcrumbs_link( $archive_title, $link );

        }



        // default

        $archive_title = porto_breadcrumbs_archive_name( $post_type );

    }



    if ( $linked ) {

        $link = get_post_type_archive_link( $post_type );

    }



    if ( $archive_title ) {

        return porto_breadcrumbs_link( $archive_title, $link );

    }



    return '';

}



function porto_breadcrumbs_archive_name( $post_type ) {

    global $porto_settings;



    $page_id = 0;

    switch ($post_type) {

        case 'portfolio':

            $page_id = (int) ((isset($porto_settings) && isset($porto_settings['portfolio-archive-page']) && $porto_settings['portfolio-archive-page']) ? esc_attr($porto_settings['portfolio-archive-page']) : 0);

            break;

        case 'member':

            $page_id = (int) ((isset($porto_settings) && isset($porto_settings['member-archive-page']) && $porto_settings['member-archive-page']) ? esc_attr($porto_settings['member-archive-page']) : 0);

            break;

        case 'faq':

            $page_id = (int) ((isset($porto_settings) && isset($porto_settings['faq-archive-page']) && $porto_settings['faq-archive-page']) ? esc_attr($porto_settings['faq-archive-page']) : 0);

            break;

    }



    $archive_title = '';



    if ($page_id && ($post = get_post( $page_id ) )) {

        $archive_title = $post->post_title;

    } else {

        $post_type_object = get_post_type_object( $post_type );



        if ( is_object( $post_type_object ) ) {



            if ( isset( $post_type_object->label ) && $post_type_object->label !== '' ) {

                $archive_title = $post_type_object->label;

            } elseif ( isset( $post_type_object->labels->menu_name ) && $post_type_object->labels->menu_name !== '' ) {

                $archive_title = $post_type_object->labels->menu_name;

            } else {

                $archive_title = $post_type_object->name;

            }

        }

    }



    return $archive_title;

}



function porto_breadcrumbs_terms_link() {



    global $porto_settings;



    $output = '';

    $post = isset( $GLOBALS['post'] ) ? $GLOBALS['post'] : null;



    if ( ! (isset($porto_settings['breadcrumbs-categories']) && $porto_settings['breadcrumbs-categories']) ) {

        return $output;

    }



    if ( $post->post_type == 'post' ) {

        $taxonomy = 'category';

    } elseif ( $post->post_type == 'portfolio' ) {

        $taxonomy = 'portfolio_cat';

    } elseif ( $post->post_type == 'member' ) {

        $taxonomy = 'member_cat';

    } elseif ( $post->post_type == 'faq' ) {

        $taxonomy = 'faq_cat';

    } elseif ( $post->post_type == 'product' && class_exists( 'WooCommerce' ) && is_woocommerce() ) {

        $taxonomy = 'product_cat';

    } else {

        return $output;

    }



    $terms = wp_get_object_terms( $post->ID, $taxonomy, array('orderby' => 'term_id') );



    if ( empty( $terms ) ) {

        return $output;

    }



    $terms_by_id = array();

    foreach ( $terms as $term ) {

        $terms_by_id[ $term->term_id ] = $term;

    }



    foreach ( $terms as $term ) {

        unset( $terms_by_id[ $term->parent ] );

    }



    if ( count( $terms_by_id ) == 1 ) {

        unset( $terms );

        $terms[0] = array_shift( $terms_by_id );

    }



    if ( count( $terms ) == 1 ) {

        $term_parent = $terms[0]->parent;



        if ( $term_parent ) {

            $term_tree = get_ancestors( $terms[0]->term_id, $taxonomy );

            $term_tree = array_reverse( $term_tree );

            $term_tree[] = get_term( $terms[0]->term_id, $taxonomy );



            $i = 0;

            foreach ( $term_tree as $term_id ) {

                $term_object = get_term( $term_id, $taxonomy );

                if ( $i++ == 0 ) {

                    $output .= porto_breadcrumbs_simple_link( $term_object->name, get_term_link( $term_object ) );

                } else {

                    $output .= ', ' . porto_breadcrumbs_simple_link( $term_object->name, get_term_link( $term_object ) );

                }

            }

            $output = porto_breadcrumbs_links($output);

        } else {

            $output = porto_breadcrumbs_link( $terms[0]->name, get_term_link( $terms[0] ) );

        }

    } else {

        $output = porto_breadcrumbs_simple_link( $terms[0]->name, get_term_link( $terms[0] ) );

        array_shift( $terms );

        foreach ( $terms as $term ) {

            $output .= ', ' . porto_breadcrumbs_simple_link( $term->name, get_term_link( $term ) );

        }

        $output = porto_breadcrumbs_links($output);

    }



    return $output;

}



function porto_breadcrumbs_ancestors_link() {

    $output = '';



    $post = isset( $GLOBALS['post'] ) ? $GLOBALS['post'] : null;

    $post_ancestor_ids = array_reverse( get_post_ancestors( $post ) );



    foreach ( $post_ancestor_ids as $post_ancestor_id ) {

        $post_ancestor = get_post( $post_ancestor_id );

        $output .= porto_breadcrumbs_link( $post_ancestor->post_title, get_permalink( $post_ancestor->ID ) );

    }



    return $output;

}



function porto_breadcrumbs_taxonomies_link() {

    global $wp_query;

    $term = $wp_query->get_queried_object();

    $output = '';



    if ( $term && $term->parent != 0 && isset($term->taxonomy) && isset($term->term_id) && is_taxonomy_hierarchical( $term->taxonomy ) ) {

        $term_ancestors = get_ancestors( $term->term_id, $term->taxonomy );

        $term_ancestors = array_reverse( $term_ancestors );



        foreach ( $term_ancestors as $term_ancestor ) {

            $term_object = get_term( $term_ancestor, $term->taxonomy );

            $output .= porto_breadcrumbs_link( $term_object->name, get_term_link( $term_object->term_id, $term->taxonomy ) );

        }

    }



    return $output;

}

