PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.9.2
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.9.2
4.9.2 4.9.1 4.9.0 4.8.2 4.8.1 4.8.0 4.7.0 4.6.2 4.6.1 4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 4.5.1 4.5.0 4.4.1 4.4.0 3.3.4 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 All 200 releases
← All changes | views/widgets/breadcrumbs.php +153 -121 3.4.24.9.2 View file →
@@ -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>