PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.9.5
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.9.5
4.9.5 4.9.4 4.9.3 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 All 203 releases
← All changes | includes/Editors/BlockEditor/Blocks/Sidebar.php +137 -55 3.4.1 → 4.9.5 View file →
@@ -1,87 +1,169 @@
1 1 <?php
2 +// phpcs:disable WordPress.DB.SlowDBQuery.slow_db_query_meta_query,WordPress.DB.SlowDBQuery.slow_db_query_meta_key,WordPress.DB.SlowDBQuery.slow_db_query_tax_query -- core block query; meta/tax filtering required.
3 +namespace WPDeveloper\BetterDocs\Editors\BlockEditor\Blocks;
2 4
3 -namespace WPDeveloper\BetterDocs\Editors\BlockEditor\Blocks;
5 +if ( ! defined( 'ABSPATH' ) ) {
6 + exit;
7 +}
4 8
9 +
5 10 use WPDeveloper\BetterDocs\Editors\BlockEditor\Block;
6 11
7 12 class Sidebar extends Block {
8 13
9 - protected $editor_styles = [
10 - 'betterdocs-sidebar'
11 - ];
14 + public $view_wrapper = 'betterdocs-toc-block';
12 15
13 - protected $frontend_styles = [
14 - 'betterdocs-sidebar'
15 - ];
16 + protected $editor_styles = [
17 + 'betterdocs-sidebar',
18 + 'betterdocs-search-modal',
19 + 'betterdocs-extend-search-modal'
20 + ];
16 21
17 - public function get_name() {
18 - return 'sidebar';
19 - }
22 + protected $frontend_styles = [
23 + 'betterdocs-sidebar',
24 + 'betterdocs-fontawesome'
25 + ];
20 26
27 + protected $frontend_scripts = [
28 + 'betterdocs',
29 + 'betterdocs-category-grid',
30 + 'betterdocs-search-modal'
31 + ];
32 +
33 + public function get_name() {
34 + return 'sidebar';
35 + }
36 +
37 + public function register_scripts() {
38 + if( is_admin() ){ // load for wordpress admin panel only
39 + if ( function_exists( 'betterdocs_pro' ) && betterdocs_pro()->assets != null ) { // get the sidebar modal on gutenberg edit mode
40 + betterdocs_pro()->assets->enqueue( 'betterdocs-extend-search-modal', 'public/js/extend-search-modal.js', [] );
41 + }
42 + $this->assets_manager->enqueue(
43 + 'betterdocs-search-modal',
44 + 'shortcodes/js/search-modal.js',
45 + [ 'jquery' ]
46 + );
47 + }
48 + }
49 +
21 50 public function get_default_attributes() {
22 51 return [
23 - 'blockId' => '',
24 - 'sidebar_layout' => 'layout-1',
25 - 'includeCategories' => '',
26 - 'excludeCategories' => '',
27 - 'terms_per_page' => -1,
28 - 'terms_order' => 'asc',
29 - 'terms_orderby' => 'doc_category_order',
30 - 'docs_per_page' => -1,
31 - 'docs_orderby' => 'title',
32 - 'docs_order' => 'asc',
33 - 'enableNestedSubcategory' => false,
34 - 'docs_per_subcategory' => 10,
35 - 'titleTag' => 'h1',
36 - 'enableStickyTOC' => false
52 + 'blockId' => '',
53 + 'sidebar_layout' => 'layout-1',
54 + 'selectKB' => '',
55 + 'includeCategories' => '',
56 + 'excludeCategories' => '',
57 + 'terms_per_page' => -1,
58 + 'terms_order' => 'asc',
59 + 'terms_orderby' => 'doc_category_order',
60 + 'docs_per_page' => -1,
61 + 'postsOrderBy' => 'title',
62 + 'postsOrder' => 'asc',
63 + 'enableNestedSubcategory' => false,
64 + // Default follows the global "Lazy Load Sidebar Docs & Subcategories"
65 + // setting, mirroring the Elementor sidebar widget's control default, so
66 + // enabling the setting lazy-loads the block too unless overridden.
67 + 'enableLazyLoad' => (bool) betterdocs()->settings->get( 'archive_lazy_load_descendants' ),
68 + 'docs_per_subcategory' => 10,
69 + 'titleTag' => 'h1',
70 + 'show_count' => false,
71 + 'enableStickyTOC' => false,
72 + 'listIcon' => '',
73 + 'listIconImageUrl' => '',
74 + 'initialDocsQueryNumber' => 5,
75 + 'initialFAQQueryNumber' => 5,
76 + 'searchModalQueryTermIds' => '', //for search modal
77 + 'searchModalQueryDocIds' => '', //for search modal
78 + 'searchModalQueriesFaqGroupIds' => ''
37 79 ];
38 80 }
39 81
40 - public function render( $attributes, $content ) {
41 - $layout = isset( $this->attributes['sidebar_layout'] ) ? $this->attributes['sidebar_layout'] : 'layout-1';
42 - $layout = str_replace( 'layout-', '', $layout );
82 + public function render( $attributes, $content ) {
83 + $layout = isset( $this->attributes['sidebar_layout'] ) ? $this->attributes['sidebar_layout'] : 'layout-1';
84 + $layout = str_replace( 'layout-', '', $layout );
85 + $layout_mapper = [
86 + 1 => 1,
87 + 2 => 4,
88 + 3 => 5,
89 + 4 => 2,
90 + 5 => 3,
91 + 6 => 6,
92 + 7 => 7,
93 + 8 => 8,
94 + ];
95 + $sidebar_layout = isset( $layout_mapper[ $layout ] ) ? $layout_mapper[ $layout ] : 1;
43 96
44 - $sidebar_layout = $layout;
97 + // Sidebars 2, 3 and 6 ship in Pro; every other layout's template is in Free.
98 + if ( ! betterdocs()->is_pro_active() && in_array( $sidebar_layout, [ 2, 3, 6 ], true ) ) {
99 + $sidebar_layout = 1;
100 + }
45 101
46 - if ( ! betterdocs()->is_pro_active() && ( $sidebar_layout == 2 || $sidebar_layout == 3 ) ) {
47 - $sidebar_layout = 1;
48 - }
102 + add_filter( 'betterdocs_base_terms_args', [ $this, 'filter_base_args' ], 10, 1 );
103 + $this->views( 'templates/sidebars/sidebar-' . $sidebar_layout );
104 + if ( $this->attributes['enableStickyTOC'] && $sidebar_layout == 1 ) {
105 + $this->views( 'widgets/sticky-toc-block' );
106 + }
107 + remove_filter( 'betterdocs_base_terms_args', [ $this, 'filter_base_args' ], 10 );
108 + }
49 109
50 - add_filter( 'betterdocs_base_terms_args', [$this, 'filter_base_args'], 10, 1 );
51 - $this->views( 'templates/sidebars/sidebar-' . $sidebar_layout );
52 - if ( $this->attributes['enableStickyTOC'] && $sidebar_layout == 1 ) {
53 - $this->views( 'widgets/sticky-toc-block' );
54 - }
55 - remove_filter( 'betterdocs_base_terms_args', [$this, 'filter_base_args'], 10 );
56 - }
110 + public function filter_base_args( $term_args ) {
111 + if ( $term_args['orderby'] == 'doc_category_order' ) {
112 + $term_args['meta_key'] = 'doc_category_order';
113 + $term_args['orderby'] = 'meta_value_num';
114 + }
115 + return $term_args;
116 + }
57 117
58 - public function filter_base_args( $term_args ) {
59 - if ( $term_args['orderby'] == 'doc_category_order' ) {
60 - $term_args['meta_key'] = 'doc_category_order';
61 - $term_args['orderby'] = 'meta_value_num';
62 - }
63 - return $term_args;
64 - }
118 + public function view_params() {
119 + $settings = &$this->attributes;
65 120
66 - public function view_params() {
67 - $settings = &$this->attributes;
121 + $default_multiple_kb = betterdocs()->settings->get( 'multiple_kb' );
122 + $kb_slug = ! empty( $settings['selectKB'] ) && isset( $settings['selectKB'] ) ? json_decode( $settings['selectKB'] )->value : '';
123 + $layout_seven_params = [];
68 124
69 - $default_multiple_kb = betterdocs()->settings->get( 'multiple_kb' );
70 - $kb_slug = isset( $settings['selected_knowledge_base'] ) ? $settings['selected_knowledge_base'] : '';
71 - return [
125 + if ( $settings['sidebar_layout'] == 'layout-1' || $settings['sidebar_layout'] == 'layout-6' || $settings['sidebar_layout'] == 'layout-7' ) {
126 + $settings['show_count'] = true;
127 + }
128 +
129 + $default_view_params = [
72 130 'shortcode_attr' => [
73 131 'terms_order' => $settings['terms_order'],
74 - 'terms_orderby' => $settings['terms_orderby'],
132 + 'terms_orderby' => $settings['terms_orderby'] == 'doc_category_order' ? 'betterdocs_order' : $settings['terms_orderby'],
75 133 'terms_include' => array_diff( $this->string_to_array( $settings['includeCategories'] ), $this->string_to_array( $settings['excludeCategories'] ) ),
76 134 'terms_exclude' => isset( $settings['excludeCategories'] ) ? $this->string_to_array( $settings['excludeCategories'] ) : '',
77 135 'nested_subcategory' => $settings['enableNestedSubcategory'],
78 - 'multiple_knowledge_base' => $default_multiple_kb,
79 - 'kb_slug' => $kb_slug,
136 + 'lazy_load' => ! empty( $settings['enableLazyLoad'] ),
80 137 'sidebar_list' => true,
138 + 'list_icon_url' => '',
139 + 'list_icon_name' => $settings['sidebar_layout'] == 'layout-4' ? '' : ( ! empty( $this->attributes['listIconImageUrl'] ) ? $this->attributes['listIconImageUrl'] : ( ! empty( $this->attributes['listIcon'] ) ? $this->attributes['listIcon'] : ( ! empty( betterdocs()->settings->get( 'docs_list_icon' ) ) ? betterdocs()->settings->get( 'docs_list_icon' )['url'] : 'list' ) ) ),
140 + 'layout_type' => 'block',
81 141 'disable_customizer_style' => true,
82 142 'posts_per_page' => -1,
83 - 'title_tag' => $settings['titleTag']
143 + 'title_tag' => $settings['titleTag'],
144 + 'show_count' => $settings['show_count'],
145 + 'orderby' => $settings['postsOrderBy'],
146 + 'order' => $settings['postsOrder']
84 147 ]
85 148 ];
86 - }
149 +
150 + if ( $settings['sidebar_layout'] == 'layout-7' ) {
151 + $default_view_params['number_of_docs'] = $settings['initialDocsQueryNumber'];
152 + $default_view_params['number_of_faqs'] = $settings['initialFAQQueryNumber'];
153 + $default_view_params['faq_term_ids'] = $settings['searchModalQueriesFaqGroupIds'];
154 + $default_view_params['doc_ids'] = $settings['searchModalQueryDocIds'];
155 + $default_view_params['doc_term_ids'] = $settings['searchModalQueryTermIds'];
156 + }
157 +
158 + // Pass a KB scope only when one is explicitly selected on the block. When none is
159 + // set, omit kb_slug so the betterdocs_sidebar_template_shortcode_params filter
160 + // (Pro/MKB) can inject the current knowledge_base context on KB templates — the
161 + // same path the default sidebar uses. (Passing kb_slug='' would block injection.)
162 + if ( ! empty( $kb_slug ) ) {
163 + $default_view_params['shortcode_attr']['kb_slug'] = $kb_slug;
164 + $default_view_params['shortcode_attr']['multiple_knowledge_base'] = (bool) $default_multiple_kb;
165 + }
166 +
167 + return $default_view_params;
168 + }
87 169 }