| @@ -1,141 +1,173 @@ | ||
| 1 | 1 | <?php |
| 2 | - if ( is_front_page() ) { | |
| 3 | - return; | |
| 4 | - } | |
| 2 | +// phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound -- view template receives variables via extract(); prefixing is impractical. | |
| 5 | 3 | |
| 6 | - $home_text = betterdocs()->settings->get( 'breadcrumb_home_text', 'Home' ); | |
| 7 | - $home_url = betterdocs()->settings->get( 'breadcrumb_home_url' ); | |
| 8 | - $enable_breadcrumb_category = betterdocs()->settings->get( 'enable_breadcrumb_category' ); | |
| 9 | - $enable_breadcrumb_title = betterdocs()->settings->get( 'enable_breadcrumb_title' ); | |
| 10 | - $builtin_doc_page = betterdocs()->settings->get( 'builtin_doc_page', true ); | |
| 11 | - $docs_page = betterdocs()->settings->get( 'docs_page' ); | |
| 12 | - $taxanomy = betterdocs()->query->get_taxonomy(); | |
| 13 | - $post_type = 'docs'; | |
| 14 | - $docs_page_title = __( 'Docs', 'betterdocs' ); | |
| 15 | - $li_classes = ['item-cat', 'item-custom-post-type-docs']; | |
| 4 | +if ( ! defined( 'ABSPATH' ) ) { | |
| 5 | + exit; | |
| 6 | +} | |
| 7 | +if ( is_front_page() ) { | |
| 8 | + return; | |
| 9 | +} | |
| 10 | + $breadcrumbs_layout = isset( $breadcrumbs_layout ) ? $breadcrumbs_layout : 'layout-1'; | |
| 11 | + $home_text = betterdocs()->settings->get( 'breadcrumb_home_text', 'Home' ); | |
| 12 | + $home_url = betterdocs()->settings->get( 'breadcrumb_home_url' ); | |
| 13 | + $enable_breadcrumb_category = betterdocs()->settings->get( 'enable_breadcrumb_category' ); | |
| 14 | + $enable_breadcrumb_title = betterdocs()->settings->get( 'enable_breadcrumb_title' ); | |
| 15 | + $builtin_doc_page = betterdocs()->settings->get( 'builtin_doc_page', true ); | |
| 16 | + $docs_page = betterdocs()->settings->get( 'docs_page' ); | |
| 17 | + $taxanomy = betterdocs()->query->get_taxonomy(); | |
| 18 | + $post_type = 'docs'; | |
| 19 | + $docs_page_title = __( 'Docs', 'betterdocs' ); | |
| 20 | + $li_classes = [ 'item-cat', 'item-custom-post-type-docs' ]; | |
| 21 | + $enable_breadcrumb_home_text = betterdocs()->settings->get('enable_breadcrumb_home_text', true); | |
| 16 | 22 | |
| 17 | - if ( $builtin_doc_page || ( ! $builtin_doc_page && $docs_page <= 0 ) ) { | |
| 18 | - $post_type_object = get_post_type_object( $post_type ); | |
| 19 | - $li_classes = ['item-cat', 'item-custom-post-type-' . esc_attr( $post_type )]; | |
| 23 | +if ( $builtin_doc_page || ( ! $builtin_doc_page && $docs_page <= 0 ) ) { | |
| 24 | + $post_type_object = get_post_type_object( $post_type ); | |
| 25 | + $li_classes = [ 'item-cat', 'item-custom-post-type-' . esc_attr( $post_type ) ]; | |
| 20 | 26 | |
| 21 | - $docs_page_url = get_post_type_archive_link( $post_type ); | |
| 22 | - $docs_page_title = $post_type_object->labels->name; | |
| 23 | - } elseif ( $docs_page ) { | |
| 24 | - $li_classes = ['item-cat item-custom-docs-page']; | |
| 25 | - $docs_page_url = get_page_link( $docs_page ); | |
| 26 | - $docs_page_title = get_the_title( $docs_page ); | |
| 27 | - } | |
| 27 | + $docs_page_url = get_post_type_archive_link( $post_type ); | |
| 28 | + $docs_page_title = $post_type_object->labels->name; | |
| 29 | +} elseif ( $docs_page ) { | |
| 30 | + $li_classes = [ 'item-cat item-custom-docs-page' ]; | |
| 31 | + $docs_page_url = get_page_link( $docs_page ); | |
| 32 | + $docs_page_title = get_the_title( $docs_page ); | |
| 33 | +} | |
| 28 | 34 | |
| 29 | - $breadcrumbs = [ | |
| 30 | - [ | |
| 31 | - 'li_classes' => ['item-home'], | |
| 32 | - 'url' => $home_url, | |
| 33 | - 'text' => stripslashes( $home_text ) | |
| 34 | - ], | |
| 35 | - [ | |
| 36 | - 'li_classes' => $li_classes, | |
| 37 | - 'url' => $docs_page_url, | |
| 38 | - 'text' => $docs_page_title | |
| 39 | - ] | |
| 40 | - ]; | |
| 35 | + $breadcrumbs = [ | |
| 36 | + [ | |
| 37 | + 'li_classes' => [ 'item-home' ], | |
| 38 | + 'url' => $home_url, | |
| 39 | + 'text' => stripslashes( $home_text ) | |
| 40 | + ], | |
| 41 | + [ | |
| 42 | + 'li_classes' => $li_classes, | |
| 43 | + 'url' => $docs_page_url, | |
| 44 | + 'text' => $docs_page_title | |
| 45 | + ] | |
| 46 | + ]; | |
| 41 | 47 | |
| 42 | - $breadcrumbs = apply_filters( 'betterdocs_breadcrumb_before_archives', $breadcrumbs ); | |
| 43 | - if ( $taxanomy == 'doc_category' || is_tax( 'doc_tag' ) ) { | |
| 44 | - if ( $enable_breadcrumb_category ) { | |
| 45 | - $query_obj = get_queried_object(); | |
| 46 | - $term_id = $query_obj->term_id; | |
| 48 | + if( ! $enable_breadcrumb_home_text ) { | |
| 49 | + unset($breadcrumbs[0]); | |
| 50 | + } | |
| 47 | 51 | |
| 48 | - $term_parents = betterdocs()->query->get_term_parents( $term_id ); | |
| 49 | - $breadcrumbs = apply_filters( 'betterdocs_breadcrumb_after_archives', array_merge( $breadcrumbs, $term_parents ) ); | |
| 50 | - } | |
| 51 | - } elseif ( is_single() ) { | |
| 52 | - global $wp_query, $post; | |
| 52 | + $breadcrumbs = apply_filters( 'betterdocs_breadcrumb_before_archives', $breadcrumbs ); | |
| 53 | 53 | |
| 54 | - if ( $enable_breadcrumb_category ) { | |
| 55 | - $cat_terms = []; | |
| 56 | - if ( isset( $wp_query->query_vars['doc_category'] ) ) { | |
| 57 | - $term = get_term_by( 'slug', $wp_query->query_vars['doc_category'], 'doc_category' ); | |
| 58 | - if ( ! empty( $term ) ) { | |
| 59 | - $cat_terms[] = $term; | |
| 60 | - } | |
| 61 | - } | |
| 54 | + // Detect the current archive taxonomy via the queried object (reliable in Elementor theme builder context) | |
| 55 | + $_queried_obj = get_queried_object(); | |
| 56 | + $_is_doc_tag = $_queried_obj instanceof \WP_Term && $_queried_obj->taxonomy === 'doc_tag'; | |
| 62 | 57 | |
| 63 | - if ( empty( $cat_terms ) ) { | |
| 64 | - $cat_terms = wp_get_post_terms( $post->ID, 'doc_category' ); | |
| 65 | - } | |
| 58 | + if ( $taxanomy == 'doc_category' ) { | |
| 59 | + if ( $enable_breadcrumb_category ) { | |
| 60 | + $query_obj = get_queried_object(); | |
| 61 | + $term_id = $query_obj->term_id; | |
| 66 | 62 | |
| 67 | - $breadcrumbs = apply_filters( 'betterdocs_breadcrumb_before_single_category', $breadcrumbs ); | |
| 63 | + $term_parents = betterdocs()->query->get_term_parents( $term_id ); | |
| 64 | + if ( ! is_wp_error( $term_parents ) && is_array( $term_parents ) ) { | |
| 65 | + $breadcrumbs = apply_filters( 'betterdocs_breadcrumb_after_archives', array_merge( $breadcrumbs, $term_parents ) ); | |
| 66 | + } | |
| 67 | + } | |
| 68 | + } elseif ( $_is_doc_tag ) { | |
| 69 | + // Always append the current tag name: Home > Docs > Tag Title | |
| 70 | + $tag_crumb = [ | |
| 71 | + [ | |
| 72 | + 'li_classes' => [ 'item-current', 'item-tag-' . esc_attr( $_queried_obj->term_id ), 'current' ], | |
| 73 | + 'url' => '', | |
| 74 | + 'text' => $_queried_obj->name, | |
| 75 | + ], | |
| 76 | + ]; | |
| 77 | + $breadcrumbs = apply_filters( 'betterdocs_breadcrumb_after_archives', array_merge( $breadcrumbs, $tag_crumb ) ); | |
| 78 | + } elseif ( is_single() ) { | |
| 79 | + global $wp_query, $post; | |
| 68 | 80 | |
| 69 | - if ( $cat_terms ) { | |
| 70 | - $term_parents = betterdocs()->query->get_term_parents( $cat_terms[0]->term_id ); | |
| 71 | - $breadcrumbs = array_merge( $breadcrumbs, $term_parents ); | |
| 72 | - } | |
| 73 | - } | |
| 81 | + if ( $enable_breadcrumb_category ) { | |
| 82 | + $cat_terms = []; | |
| 83 | + if ( isset( $wp_query->query_vars['doc_category'] ) ) { | |
| 84 | + $term = get_term_by( 'slug', $wp_query->query_vars['doc_category'], 'doc_category' ); | |
| 85 | + if ( ! empty( $term ) ) { | |
| 86 | + $cat_terms[] = $term; | |
| 87 | + } | |
| 88 | + } | |
| 74 | 89 | |
| 75 | - // Check if the post is in a category | |
| 76 | - if ( $enable_breadcrumb_title ) { | |
| 77 | - $breadcrumbs[] = [ | |
| 78 | - 'li_classes' => ['item-current', 'item-' . $post->ID, 'current'], | |
| 79 | - 'url' => '', | |
| 80 | - 'text' => betterdocs()->template_helper->kses( get_the_title() ) | |
| 81 | - ]; | |
| 82 | - } | |
| 83 | - } | |
| 90 | + if ( empty( $cat_terms ) ) { | |
| 91 | + $cat_terms = wp_get_post_terms( $post->ID, 'doc_category' ); | |
| 92 | + } | |
| 84 | 93 | |
| 85 | - if ( empty( $breadcrumbs ) ) { | |
| 86 | - return; | |
| 87 | - } | |
| 94 | + $breadcrumbs = apply_filters( 'betterdocs_breadcrumb_before_single_category', $breadcrumbs ); | |
| 88 | 95 | |
| 89 | - $_wrapper_attr_array = [ | |
| 90 | - 'class' => ['betterdocs-breadcrumb'], | |
| 91 | - 'id' => ['betterdocs-breadcrumb'] | |
| 92 | - ]; | |
| 96 | + if ( $cat_terms ) { | |
| 97 | + $term_parents = betterdocs()->query->get_term_parents( $cat_terms[0]->term_id ); | |
| 98 | + if ( ! is_wp_error( $term_parents ) && is_array( $term_parents ) ) { | |
| 99 | + $breadcrumbs = array_merge( $breadcrumbs, $term_parents ); | |
| 100 | + } | |
| 101 | + } | |
| 102 | + } | |
| 93 | 103 | |
| 94 | - if ( ! empty( $wrapper_attr_array ) && isset( $widget_type ) && $widget_type === 'betterdocs-breadcrumb' ) { | |
| 95 | - $wrapper_attr_array['class'][] = 'betterdocs-breadcrumb'; | |
| 96 | - $wrapper_attr_array['id'][] = 'betterdocs-breadcrumb'; | |
| 97 | - } else { | |
| 98 | - $wrapper_attr_array = $_wrapper_attr_array; | |
| 99 | - } | |
| 104 | + // Check if the post is in a category | |
| 105 | + if ( $enable_breadcrumb_title ) { | |
| 106 | + $breadcrumbs[] = [ | |
| 107 | + 'li_classes' => [ 'item-current', 'item-' . ( $post->ID != null ? $post->ID : '' ), 'current' ], | |
| 108 | + 'url' => '', | |
| 109 | + 'text' => betterdocs()->template_helper->kses( get_the_title() ) | |
| 110 | + ]; | |
| 111 | + } | |
| 112 | + } | |
| 100 | 113 | |
| 101 | - if ( $widget instanceof \WPDeveloper\BetterDocs\Editors\BlockEditor\Block ) { | |
| 102 | - $wrapper_attr_array['class'][] = $blockId; | |
| 103 | - } | |
| 114 | + if ( empty( $breadcrumbs ) ) { | |
| 115 | + return; | |
| 116 | + } | |
| 104 | 117 | |
| 105 | - $wrapper_attr = betterdocs()->template_helper->get_html_attributes( $wrapper_attr_array ); | |
| 106 | -?> | |
| 118 | + $_wrapper_attr_array = [ | |
| 119 | + 'class' => [ 'betterdocs-breadcrumb' ], | |
| 120 | + 'id' => [ 'betterdocs-breadcrumb' ] | |
| 121 | + ]; | |
| 107 | 122 | |
| 123 | + if ( isset( $breadcrumbs_layout ) && ! empty( $breadcrumbs_layout ) ) { | |
| 124 | + $br_wrapper_attr_array['class'][] = 'betterdocs-breadcrumb ' . $breadcrumbs_layout; | |
| 125 | + $br_wrapper_attr_array['id'][] = 'betterdocs-breadcrumb'; | |
| 126 | + } else { | |
| 127 | + $br_wrapper_attr_array = $_wrapper_attr_array; | |
| 128 | + } | |
| 129 | + | |
| 130 | + | |
| 131 | + if ( isset( $widget ) && $widget instanceof \WPDeveloper\BetterDocs\Editors\BlockEditor\Block ) { | |
| 132 | + $br_wrapper_attr_array['class'][] = $blockId; | |
| 133 | + } | |
| 134 | + | |
| 135 | + $wrapper_attr = betterdocs()->template_helper->get_html_attributes( $br_wrapper_attr_array ); | |
| 136 | + ?> | |
| 137 | + | |
| 108 | 138 | <nav |
| 109 | - <?php echo $wrapper_attr; ?>> | |
| 110 | - <ul class="betterdocs-breadcrumb-list"> | |
| 111 | - <?php | |
| 112 | - foreach ( $breadcrumbs as $breadcrumb ): | |
| 113 | - $li_classes = ['betterdocs-breadcrumb-item']; | |
| 114 | - $li_classes = ! empty( $breadcrumb['li_classes'] ) ? array_merge( $li_classes, $breadcrumb['li_classes'] ) : $li_classes; | |
| 115 | - ?> | |
| 116 | - <li class="<?php esc_attr_e( implode( ' ', $li_classes ), 'betterdocs' );?>"> | |
| 117 | - <?php | |
| 118 | - if ( empty( $breadcrumb['url'] ) ) { | |
| 119 | - echo wp_kses_post( '<span>' . $breadcrumb['text'] . '</span>' ); | |
| 120 | - } else { | |
| 121 | - echo wp_kses_post( wp_sprintf( | |
| 122 | - "<a href='%s' class='bread-link' title='%s'>%s</a>", | |
| 123 | - esc_attr( esc_url( $breadcrumb['url'] ) ), | |
| 124 | - esc_attr( stripslashes( $breadcrumb['text'] ) ), | |
| 125 | - $breadcrumb['text'] | |
| 126 | - ) ); | |
| 127 | - } | |
| 128 | - ?> | |
| 129 | - </li> | |
| 130 | - <?php if ( next( $breadcrumbs ) ): ?> | |
| 131 | - <li class="betterdocs-breadcrumb-item breadcrumb-delimiter"> | |
| 132 | - <span class="icon-container"> | |
| 133 | - <svg class="breadcrumb-delimiter-icon svg-inline--fa fa-angle-right fa-w-8" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="angle-right" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 512"> | |
| 134 | - <path fill="currentColor" d="M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z"></path> | |
| 135 | - </svg> | |
| 136 | - </span> | |
| 137 | - </li> | |
| 138 | - <?php endif;?> | |
| 139 | -<?php endforeach;?> | |
| 140 | - </ul> | |
| 139 | + <?php echo $wrapper_attr; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>> | |
| 140 | + <ul class="betterdocs-breadcrumb-list"> | |
| 141 | + <?php | |
| 142 | + foreach ( $breadcrumbs as $breadcrumb ) : | |
| 143 | + $li_classes = [ 'betterdocs-breadcrumb-item' ]; | |
| 144 | + $li_classes = ! empty( $breadcrumb['li_classes'] ) ? array_merge( $li_classes, $breadcrumb['li_classes'] ) : $li_classes; | |
| 145 | + ?> | |
| 146 | + <li class="<?php echo implode( ' ', $li_classes ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>"> | |
| 147 | + <?php | |
| 148 | + if ( empty( $breadcrumb['url'] ) ) { | |
| 149 | + echo wp_kses_post( '<span>' . $breadcrumb['text'] . '</span>' ); | |
| 150 | + } else { | |
| 151 | + echo wp_kses_post( | |
| 152 | + wp_sprintf( | |
| 153 | + "<a href='%s' class='bread-link' title='%s'>%s</a>", | |
| 154 | + esc_attr( esc_url( $breadcrumb['url'] ) ), | |
| 155 | + esc_attr( stripslashes( $breadcrumb['text'] ) ), | |
| 156 | + $breadcrumb['text'] | |
| 157 | + ) | |
| 158 | + ); | |
| 159 | + } | |
| 160 | + ?> | |
| 161 | + </li> | |
| 162 | + <?php | |
| 163 | + if ( next( $breadcrumbs ) ) : | |
| 164 | + if ( $breadcrumbs_layout == 'layout-2' || $breadcrumbs_layout == 'layout-3' ) { | |
| 165 | + $view_object->get( 'template-parts/breadcrumb-delimiter-2' ); | |
| 166 | + } else { | |
| 167 | + $view_object->get( 'template-parts/breadcrumb-delimiter-1' ); | |
| 168 | + } | |
| 169 | + endif; | |
| 170 | + ?> | |
| 171 | + <?php endforeach; ?> | |
| 172 | + </ul> | |
| 141 | 173 | </nav> |