| 1 |
<?php |
| 2 |
// phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound -- view template receives variables via extract(); prefixing is impractical. |
| 3 |
|
| 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); |
| 22 |
|
| 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 ) ]; |
| 26 |
|
| 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 |
} |
| 34 |
|
| 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 |
]; |
| 47 |
|
| 48 |
if( ! $enable_breadcrumb_home_text ) { |
| 49 |
unset($breadcrumbs[0]); |
| 50 |
} |
| 51 |
|
| 52 |
$breadcrumbs = apply_filters( 'betterdocs_breadcrumb_before_archives', $breadcrumbs ); |
| 53 |
|
| 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'; |
| 57 |
|
| 58 |
if ( $taxanomy == 'doc_category' ) { |
| 59 |
if ( $enable_breadcrumb_category ) { |
| 60 |
$query_obj = get_queried_object(); |
| 61 |
$term_id = $query_obj->term_id; |
| 62 |
|
| 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; |
| 80 |
|
| 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 |
} |
| 89 |
|
| 90 |
if ( empty( $cat_terms ) ) { |
| 91 |
$cat_terms = wp_get_post_terms( $post->ID, 'doc_category' ); |
| 92 |
} |
| 93 |
|
| 94 |
$breadcrumbs = apply_filters( 'betterdocs_breadcrumb_before_single_category', $breadcrumbs ); |
| 95 |
|
| 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 |
} |
| 103 |
|
| 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 |
} |
| 113 |
|
| 114 |
if ( empty( $breadcrumbs ) ) { |
| 115 |
return; |
| 116 |
} |
| 117 |
|
| 118 |
$_wrapper_attr_array = [ |
| 119 |
'class' => [ 'betterdocs-breadcrumb' ], |
| 120 |
'id' => [ 'betterdocs-breadcrumb' ] |
| 121 |
]; |
| 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 |
|
| 138 |
<nav |
| 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> |
| 173 |
</nav> |
| 174 |
|