settings['labels'] = [ 'homepage-title' => get_theme_mod( 'breadcrumb_home_text', __('Home', 'blocksy') ), 'blogpage-title' => __('Blog', 'blocksy'), '404-title' => __('404 Not found', 'blocksy'), ]; } /** * Determine if the page has parents and in case it has, adds all page parents hierarchy * * @param $id , page id * * @return array */ private function get_page_hierarchy($id) { $page = get_post($id); if (empty($page) || is_wp_error($page)) { return []; } $return = []; $page_obj = []; $page_obj['type'] = 'post'; $page_obj['post_type'] = $page->post_type; $page_obj['name'] = $page->post_title; $page_obj['id'] = $id; $page_obj['url'] = get_permalink($id); $return[] = $page_obj; if ($page->post_parent > 0) { $return = array_merge($return, $this->get_page_hierarchy($page->post_parent)); } return $return; } /** * Determine if the term has parents and in case it has, adds all term parents hierarchy * * @param $id , term id * @param $taxonomy , term taxonomy name * * @return array */ private function get_term_hierarchy($id, $taxonomy) { $term = get_term($id, $taxonomy); if (empty($term) || is_wp_error($term)) { return []; } $return = []; $term_obj = []; $term_obj['type'] = 'taxonomy'; $term_obj['name'] = $term->name; $term_obj['id'] = $id; $term_obj['url'] = get_term_link($id, $taxonomy); $term_obj['taxonomy'] = $taxonomy; $return[] = $term_obj; if ($term->parent > 0) { $return = array_merge( $return, $this->get_term_hierarchy($term->parent, $taxonomy) ); } return $return; } /** * Determine the current frontend page location, in creates the breadcrumbs array * @return array */ private function build_breadcrumbs() { if (is_admin()) { return []; } if (did_action('wp') === 0) { return array(); } $home_icon = ''; if (get_theme_mod('breadcrumb_home_item', 'text') === 'icon') { $home_icon = ''; } $return = [ 0 => [ 'name' => $this->settings['labels']['homepage-title'], 'url' => esc_url( home_url('/') ), 'type' => 'front_page', 'icon' => $home_icon ] ]; $has_single = get_theme_mod('breadcrumb_page_title', 'yes') === 'yes'; $custom_page = []; if (is_array($custom_page) && !empty($custom_page)) { $return[] = $custom_page; return $return; } if (is_404()) { $page = []; $page['type'] = '404'; $page['name'] = $this->settings['labels']['404-title']; $page['url'] = blocksy_current_url(); $return[] = $page; } elseif (is_search()) { $search = []; $search['type'] = 'search'; $search['name'] = __('Searching for:', 'blocksy') . ' ' . get_search_query(); $s = '?s=' . get_search_query(); $search['url'] = home_url('/') . $s; $return[] = $search; } elseif (is_front_page()) { } elseif (is_home()) { $blog = [ 'name' => $this->settings['labels']['blogpage-title'], 'url' => blocksy_current_url(), 'type' => 'front_page', 'icon' => $home_icon ]; $return[] = $blog; } elseif ($blocksy_is_page = blocksy_is_page()) { if ($has_single) { $return = array_merge( $return, array_reverse($this->get_page_hierarchy($blocksy_is_page)) ); } } elseif (is_single()) { global $post; $taxonomies = get_object_taxonomies($post->post_type, 'objects'); $slugs = array(); if (! empty($taxonomies)) { foreach ($taxonomies as $key => $tax) { if ( $tax->show_ui === true && $tax->public === true && $tax->hierarchical !== false ) { array_push($slugs, $tax->name); } } $terms = wp_get_post_terms($post->ID, $slugs); if (! empty($terms)) { $lowest_term = $this->get_lowest_taxonomy_terms($terms); $term = $lowest_term[0]; $return = array_merge( $return, array_reverse( $this->get_term_hierarchy( $term->term_id, $term->taxonomy ) ) ); } } if ($has_single) { $return = array_merge( $return, array_reverse( $this->get_page_hierarchy( $post->ID ) ) ); } } elseif (is_category()) { $term_id = get_query_var('cat'); $return = array_merge( $return, array_reverse($this->get_term_hierarchy($term_id, 'category')) ); } elseif (is_tag()) { $term_id = get_query_var('tag'); $term = get_term_by('slug', $term_id, 'post_tag'); if (empty($term) || is_wp_error($term)) { return []; } $tag = []; $tag['type'] = 'taxonomy'; $tag['name'] = $term->name; $tag['url'] = get_term_link($term_id, 'post_tag'); $tag['taxonomy'] = 'post_tag'; $return[] = $tag; } elseif (is_tax()) { $term_id = get_queried_object()->term_id; $taxonomy = get_query_var('taxonomy'); $return = array_merge( $return, array_reverse($this->get_term_hierarchy($term_id, $taxonomy)) ); } elseif (is_author()) { $author = []; $author['name'] = get_queried_object()->data->display_name; $author['id'] = get_queried_object()->data->ID; $author['url'] = get_author_posts_url( $author['id'], get_queried_object()->data->user_nicename ); $author['type'] = 'author'; $return[] = $author; } elseif (is_date()) { $date = []; if (get_option('permalink_structure')) { $day = get_query_var('day'); $month = get_query_var('monthnum'); $year = get_query_var('year'); } else { $m = get_query_var('m'); $year = substr($m, 0, 4); $month = substr($m, 4, 2); $day = substr($m, 6, 2); } if (is_day()) { $date['name'] = mysql2date( 'd F Y', $day . '-' . $month . '-' . $year ); $date['url'] = get_day_link($year, $month, $day); $date['date_type'] = 'daily'; $date['day'] = $day; $date['month'] = $month; $date['year'] = $year; } elseif (is_month()) { $date['name'] = mysql2date( 'F Y', '01.' . $month . '.' . $year ); $date['url'] = get_month_link($year, $month); $date['date_type'] = 'monthly'; $date['month'] = $month; $date['year'] = $year; } else { $date['name'] = mysql2date( 'Y', '01.01.' . $year ); $date['url'] = get_year_link($year); $date['date_type'] = 'yearly'; $date['year'] = $year; } $return[] = $date; } elseif (is_archive()) { $post_type = get_query_var('post_type'); if ($post_type) { $post_type_obj = get_post_type_object($post_type); $archive = []; $archive['name'] = $post_type_obj->labels->name; $archive['url'] = get_post_type_archive_link($post_type); $return[] = $archive; } } foreach ($return as $key => $item) { if (empty($item['name'])) { $return[$key]['name'] = __('No title', 'blocksy'); } } return $return; } /** * Returns the lowest hierarchical term * @return array */ private function get_lowest_taxonomy_terms($terms) { // if terms is not array or its empty don't proceed if (! is_array($terms) || empty($terms)) { return false; } return $this->filter_terms($terms); } private function filter_terms($terms) { $return_terms = array(); $term_ids = array(); foreach ($terms as $t) { $term_ids[] = $t->term_id; } foreach ($terms as $t) { if ($t->parent == false || !in_array($t->parent,$term_ids)) { // remove this term } else { $return_terms[] = $t; } } if (count($return_terms)) { return $this->filter_terms($return_terms); } else { return $terms; } } /** * Returns the breadcrumbs array * @return string */ public function get_breadcrumbs() { return $this->build_breadcrumbs(); } public function render() { $items = $this->get_breadcrumbs(); $separators = [ 'type-1' => ' ', 'type-2' => ' ', 'type-3' => '/' ]; $separator = $separators[ get_theme_mod('breadcrumb_separator', 'type-1') ]; if (count($items) < 1) { return ''; } ob_start(); ?>