PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 2.0.5
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v2.0.5
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
betterdocs / includes / elementor / class-betterdocs-elementor.php

class-betterdocs-elementor.php in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 2.0.5, at includes/elementor/class-betterdocs-elementor.php

873 lines 29.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 use Elementor\Controls_Manager;
3 use ElementorPro\Plugin;
4 use ElementorPro\Modules\ThemeBuilder as ThemeBuilder;
5
6 /**
7 * Working with elementor plugin
8 *
9 *
10 * @since 1.3.0
11 * @package BetterDocs
12 * @subpackage BetterDocs/elementor
13 * @author WPDeveloper <support@wpdeveloper.com>
14 */
15 class BetterDocs_Elementor
16 {
17 public static $pro_active;
18
19 /**
20 * Short Description. (use period)
21 *
22 * Long Description.
23 *
24 * @since 1.3.0
25 */
26 public static function init()
27 {
28 self::$pro_active = is_plugin_active('betterdocs-pro/betterdocs-pro.php');
29 add_action('elementor/editor/before_enqueue_scripts', [__CLASS__, 'editor_enqueue_scripts']);
30 if (is_plugin_active('betterdocs/betterdocs.php')) {
31 add_action('elementor/documents/register', [__CLASS__, 'register_singel_documents_page']);
32 add_action('elementor/documents/register', [__CLASS__, 'register_doc_category_archive']);
33 add_filter('elementor/theme/need_override_location', [__CLASS__, 'theme_template_include'], 10, 2);
34 add_action('betterdocs/elementor/widgets/query', [__CLASS__, 'betterdocs_query'], 10, 2);
35 add_action('elementor/widgets/register', [__CLASS__, 'register_basic_widgets']);
36 add_action('elementor/elements/categories_registered', [__CLASS__, 'register_widget_categories']);
37 add_filter('elementor/editor/localize_settings', [__CLASS__, 'promote_pro_elements']);
38 add_action('wp_enqueue_scripts', [__CLASS__, 'editor_load_asset']);
39 add_action('elementor/init', [__CLASS__, 'load_basic_widgets']);
40 if (is_plugin_active('elementor-pro/elementor-pro.php')) {
41 add_action('elementor/widgets/widgets_registered', [__CLASS__, 'register_theme_builder_widgets']);
42 add_action('elementor/init', [__CLASS__, 'load_theme_builder_widgets']);
43 add_action('elementor/theme/register_conditions', [__CLASS__, 'register_conditions']);
44 }
45 }
46
47 add_action('init', [__CLASS__, '_betterdocs_init'], -999);
48 }
49
50 /**
51 *
52 * Mange all widget for single docs
53 *
54 * @return string[]
55 * @since 1.3.0
56 */
57 public static function get_basic_widget_list()
58 {
59 $widget_arr = [
60 'betterdocs-elementor-search-form' => 'BetterDocs_Elementor_Search_Form',
61 'betterdocs-elementor-category-grid' => 'BetterDocs_Elementor_Category_Grid',
62 'betterdocs-elementor-category-box' => 'BetterDocs_Elementor_Category_Box'
63 ];
64
65 return $widget_arr;
66 }
67
68 /**
69 *
70 * Mange all widget for single docs
71 *
72 * @return string[]
73 * @since 1.3.0
74 */
75 public static function get_theme_builder_widget_list()
76 {
77 $widget_arr = [
78 'betterdocs-elementor-breadcrumbs' => 'BetterDocs_Elementor_Breadcrumbs',
79 'betterdocs-elementor-title' => 'BetterDocs_Elementor_Title',
80 'betterdocs-elementor-content' => 'BetterDocs_Elementor_Content',
81 'betterdocs-elementor-sidebar' => 'BetterDocs_Elementor_Sidebar',
82 'betterdocs-elementor-navigation' => 'BetterDocs_Elementor_Navigation',
83 'betterdocs-elementor-doc-share' => 'BetterDocs_Elementor_Doc_Share',
84 'betterdocs-elementor-feedback' => 'BetterDocs_Elementor_Feedback',
85 'betterdocs-elementor-doc-date' => 'BetterDocs_Elementor_Doc_Date',
86 'betterdocs-elementor-toc' => 'BetterDocs_Elementor_Toc',
87 'betterdocs-elementor-category-archive-list' => 'BetterDocs_Category_Archive_List'
88 ];
89
90 return $widget_arr;
91 }
92
93 /**
94 *
95 * Load asset for elementor icon
96 *
97 * @since 1.3.0
98 */
99 public static function editor_enqueue_scripts()
100 {
101 wp_enqueue_style(
102 'betterdocs-el-icon',
103 BETTERDOCS_ADMIN_URL . 'assets/css/betterdocs-el-icon.css',
104 false,
105 BETTERDOCS_VERSION
106 );
107 }
108
109 public static function editor_load_asset()
110 {
111 if (BetterDocs_Helper::is_templates() == true) {
112 wp_enqueue_style(
113 'betterdocs-el-edit',
114 BETTERDOCS_ADMIN_URL . 'assets/css/betterdocs-el-edit.css',
115 false,
116 BETTERDOCS_VERSION
117 );
118
119 wp_enqueue_script(
120 'betterdocs-el-promotion',
121 BETTERDOCS_ADMIN_URL . 'assets/js/promotion.js',
122 ['jquery'],
123 BETTERDOCS_VERSION,
124 true
125 );
126
127 if (!self::$pro_active) {
128 wp_enqueue_script(
129 'betterdocs-el-editor',
130 BETTERDOCS_ADMIN_URL . 'assets/js/betterdocs-el-editor.js',
131 ['jquery'],
132 BETTERDOCS_VERSION,
133 true
134 );
135 }
136 }
137 }
138
139 public static function load_basic_widgets()
140 {
141 require_once BETTERDOCS_DIR_PATH . 'includes/elementor/template-query.php';
142
143 // load widget file
144 foreach (self::get_basic_widget_list() as $key => $value) {
145 require_once BETTERDOCS_DIR_PATH . "includes/elementor/widgets/basic/$key.php";
146 }
147 }
148
149 public static function load_theme_builder_widgets()
150 {
151 require_once BETTERDOCS_DIR_PATH . 'includes/elementor/template-query.php';
152 require_once BETTERDOCS_DIR_PATH . 'includes/elementor/betterdocs-single-docs.php';
153 require_once BETTERDOCS_DIR_PATH . 'includes/elementor/betterdocs-doc-archive.php';
154 require_once BETTERDOCS_DIR_PATH . 'includes/elementor/betterdocs-archive-condition.php';
155 require_once BETTERDOCS_DIR_PATH . 'includes/elementor/docs-page.php';
156 self::_register_tag();
157
158 //load widget file
159 foreach (self::get_theme_builder_widget_list() as $key => $value) {
160 require_once BETTERDOCS_DIR_PATH . "includes/elementor/widgets/$key.php";
161 }
162 }
163
164 public static function register_singel_documents_page($documents_manager)
165 {
166 if (class_exists('BetterDocs_Single_Docs')) {
167 $documents_manager->register_document_type('docs', BetterDocs_Single_Docs::get_class_full_name());
168 }
169 }
170
171 public static function register_doc_category_archive($documents_manager)
172 {
173 if (class_exists('Betterdocs_Doc_Archive')) {
174 $documents_manager->register_document_type('doc-archive', Betterdocs_Doc_Archive::get_class_full_name());
175 }
176 }
177
178 /**
179 * @param Conditions_Manager $conditions_manager
180 */
181 public static function register_conditions($conditions_manager)
182 {
183 $betterdocs_condition = new Betterdocs_Archive_Condition();
184
185 $conditions_manager->get_condition('general')->register_sub_condition($betterdocs_condition);
186 }
187
188 public static function theme_template_include($need_override_location, $location)
189 {
190 if (is_singular(['docs']) && 'single' === $location) {
191 $need_override_location = true;
192 }
193
194 return $need_override_location;
195 }
196
197 public static function register_basic_widgets($widgets_manager)
198 {
199 foreach (self::get_basic_widget_list() as $value) {
200 if (class_exists($value)) {
201 //error_log( print_r(self::get_basic_widget_list(), TRUE) );
202 $widgets_manager->register_widget_type(new $value);
203 }
204 }
205 }
206
207 public static function register_widget_categories($elements_manager)
208 {
209 $elements_manager->add_category(
210 'betterdocs-elements',
211 [
212 'title' => __('BetterDocs', 'betterdocs'),
213 'icon' => 'font',
214 ], 1);
215 }
216
217 public static function register_theme_builder_widgets($widgets_manager)
218 {
219 foreach (self::get_theme_builder_widget_list() as $value) {
220 if (class_exists($value)) {
221 $widgets_manager->register_widget_type(new $value);
222 }
223 }
224 }
225
226 public static function _register_tag()
227 {
228 require_once BETTERDOCS_DIR_PATH . 'includes/elementor/widgets/betterdocs-elementor-title-tag.php';
229
230 $module = Plugin::elementor()->dynamic_tags;
231 $module->register_tag(new BetterDocs_Elementor_Title_Tag());
232 }
233
234 public static function promote_pro_elements($config)
235 {
236 if (is_plugin_active('betterdocs-pro/betterdocs-pro.php')) {
237 return $config;
238 }
239
240 $promotion_widgets = [];
241
242 if (isset($config['promotionWidgets'])) {
243 $promotion_widgets = $config['promotionWidgets'];
244 }
245
246 $combine_array = array_merge($promotion_widgets, [
247 [
248 'name' => 'betterdocs-elementor-reactions',
249 'title' => __('Doc Reactions', 'betterdocs'),
250 'icon' => 'betterdocs-icon-Reactions',
251 'categories' => '["betterdocs-elements"]',
252 ],
253 [
254 'name' => 'betterdocs-multiple-kb',
255 'title' => __('BetterDocs Multiple KB', 'betterdocs'),
256 'icon' => 'betterdocs-icon-category-box',
257 'categories' => '["docs-archive"]',
258 ],
259 ]);
260
261 $config['promotionWidgets'] = $combine_array;
262
263 return $config;
264 }
265
266 public static function _betterdocs_init()
267 {
268 add_action('elementor/init', array(__CLASS__, 'register_bd_template_instance'), 20);
269 if (defined('Elementor\Api::LIBRARY_OPTION_KEY')) {
270 add_filter('option_' . Elementor\Api::LIBRARY_OPTION_KEY, array(__CLASS__, 'prepend_categories'));
271 }
272 add_action('elementor/ajax/register_actions', array(__CLASS__, 'modified_ajax_action'), 20);
273 }
274
275 public static function register_bd_template_instance()
276 {
277 require_once BETTERDOCS_DIR_PATH . 'includes/elementor/betterdocs-template-source.php';
278
279 $elementor = Elementor\Plugin::instance();
280 $elementor->templates_manager->register_source('BetterDocs_Template_Source');
281 }
282
283 public static function modified_ajax_action($ajax)
284 {
285 if (!isset($_REQUEST['actions'])) {
286 return;
287 }
288
289 $actions = json_decode(stripslashes($_REQUEST['actions']), true);
290 $data = false;
291
292 foreach ($actions as $id => $action_data) {
293 if (!isset($action_data['get_template_data'])) {
294 $data = $action_data;
295 }
296 }
297
298
299 if (!$data) {
300 return;
301 }
302
303 if (!isset($data['data'])) {
304 return;
305 }
306
307 $data = $data['data'];
308
309 if (empty($data['template_id'])) {
310 return;
311 }
312
313 if (false === strpos($data['template_id'], 'betterdocs_')) {
314 return;
315 }
316 $ajax->register_ajax_action('get_template_data', array(__CLASS__, 'get_bd_template_data'));
317 }
318
319 public static function prepend_categories($library_data)
320 {
321 $categories = self::get_template_categories();
322 if (!empty($categories)) {
323 $library_data['types_data']['block']['categories'] = array_merge($categories, $library_data['types_data']['block']['categories']);
324 }
325 return $library_data;
326 }
327
328 public static function get_template_categories()
329 {
330 return [
331 'Single Docs', 'Docs Archive'
332 ];
333 }
334
335 public static function get_bd_template_data($args)
336 {
337 $source = Elementor\Plugin::instance()->templates_manager->get_source('betterdocs-templates');
338
339 return $source->get_data($args);
340 }
341
342 /**
343 * Include a file with variables
344 *
345 * @param $file_path
346 * @param $variables
347 *
348 * @return string
349 * @since 4.2.2
350 */
351 public static function include_with_variable( $file_path, $variables = [])
352 {
353 if (file_exists($file_path)) {
354 extract($variables);
355
356 ob_start();
357
358 include $file_path;
359
360 return ob_get_clean();
361 }
362
363 return '';
364 }
365
366 public static function get_multiple_kb_terms($prettify = false, $term_id = true)
367 {
368 $args = [
369 'taxonomy' => 'knowledge_base',
370 'hide_empty' => true,
371 'parent' => 0,
372 ];
373
374 $terms = get_terms($args);
375
376 if (is_wp_error($terms)) {
377 return [];
378 }
379
380 if ($prettify) {
381 $pretty_taxonomies = [];
382
383 foreach ($terms as $term) {
384 $pretty_taxonomies[$term_id ? $term->term_id : $term->slug] = $term->name;
385 }
386
387 return $pretty_taxonomies;
388 }
389
390 return $terms;
391 }
392
393 public static function get_betterdocs_multiple_kb_status()
394 {
395 if (\BetterDocs_DB::get_settings('multiple_kb') == 1) {
396 return 'true';
397 }
398
399 return '';
400 }
401
402 /**
403 * POst Orderby Options
404 *
405 * @return array
406 */
407 public static function get_post_orderby_options()
408 {
409 $orderby = array(
410 'ID' => 'Post ID',
411 'author' => 'Post Author',
412 'title' => 'Title',
413 'date' => 'Date',
414 'modified' => 'Last Modified Date',
415 'parent' => 'Parent Id',
416 'rand' => 'Random',
417 'comment_count' => 'Comment Count',
418 'menu_order' => 'Menu Order',
419 'betterdocs_order' => 'BetterDocs Order',
420 );
421
422 return $orderby;
423 }
424
425 /**
426 * Get Post Categories
427 *
428 * @return array
429 */
430 public static function get_terms_list($taxonomy = 'category', $key = 'term_id')
431 {
432 $options = [];
433 $terms = get_terms([
434 'taxonomy' => $taxonomy,
435 'hide_empty' => true,
436 ]);
437
438 if (!empty($terms) && !is_wp_error($terms)) {
439 foreach ($terms as $term) {
440 $options[$term->{$key}] = $term->name;
441 }
442 }
443
444 return $options;
445 }
446
447 /**
448 * Query Controls
449 *
450 */
451 public static function betterdocs_query($wb, $taxonomy)
452 {
453 $wb->start_controls_section(
454 'eael_section_post__filters',
455 [
456 'label' => __('Query', 'betterdocs'),
457 ]
458 );
459
460 $default_multiple_kb = self::get_betterdocs_multiple_kb_status();
461
462 if ($default_multiple_kb && $taxonomy != 'knowledge_base') {
463 $multiple_kb_terms = self::get_multiple_kb_terms(true, false);
464 $default_slug = count($multiple_kb_terms) > 0 ? array_keys($multiple_kb_terms)[0] : '';
465
466 $wb->add_control(
467 'selected_knowledge_base',
468 [
469 'label' => __('Knowledge Bases', 'betterdocs'),
470 'label_block' => true,
471 'type' => Controls_Manager::SELECT2,
472 'options' => $multiple_kb_terms,
473 'multiple' => false,
474 'default' => '',
475 'select2options' => [
476 'placeholder' => __('All Knowledge Base', 'betterdocs'),
477 'allowClear' => true,
478 ]
479 ]
480 );
481 }
482
483 if ($wb->get_name() === 'betterdocs-category-grid') {
484 $wb->add_control(
485 'grid_query_heading',
486 [
487 'label' => __('Category Grid', 'betterdocs'),
488 'type' => Controls_Manager::HEADING,
489 ]
490 );
491 }
492
493 $wb->add_control(
494 'include',
495 [
496 'label' => __('Include', 'betterdocs'),
497 'label_block' => true,
498 'type' => Controls_Manager::SELECT2,
499 'options' => self::get_terms_list($taxonomy, 'term_id'),
500 'multiple' => true,
501 'default' => [],
502 ]
503 );
504
505 $wb->add_control(
506 'exclude',
507 [
508 'label' => __('Exclude', 'betterdocs'),
509 'type' => Controls_Manager::SELECT2,
510 'options' => self::get_terms_list($taxonomy, 'term_id'),
511 'label_block' => true,
512 'post_type' => '',
513 'multiple' => true,
514 ]
515 );
516
517 if ($wb->get_name() === 'betterdocs-category-grid') {
518 $wb->add_control(
519 'grid_per_page',
520 [
521 'label' => __('Grid Per Page', 'betterdocs'),
522 'type' => Controls_Manager::NUMBER,
523 'default' => '8',
524 ]
525 );
526 } else {
527 $wb->add_control(
528 'box_per_page',
529 [
530 'label' => __('Box Per Page', 'betterdocs'),
531 'type' => Controls_Manager::NUMBER,
532 'default' => '8',
533 ]
534 );
535 }
536
537 $wb->add_control(
538 'offset',
539 [
540 'label' => __('Offset', 'betterdocs'),
541 'type' => Controls_Manager::NUMBER,
542 'default' => '0',
543 ]
544 );
545
546 $wb->add_control(
547 'orderby',
548 [
549 'label' => __('Order By', 'betterdocs'),
550 'type' => Controls_Manager::SELECT,
551 'options' => [
552 'none' => __('No order', 'betterdocs'),
553 'name' => __('Name', 'betterdocs'),
554 'slug' => __('Slug', 'betterdocs'),
555 'term_group' => __('Term Group', 'betterdocs'),
556 'term_id' => __('Term ID', 'betterdocs'),
557 'id' => __('ID', 'betterdocs'),
558 'description' => __('Description', 'betterdocs'),
559 'parent' => __('Parent', 'betterdocs'),
560 'betterdocs_order' => __('BetterDocs Order', 'betterdocs'),
561 ],
562 'default' => 'name',
563 ]
564 );
565
566 $wb->add_control(
567 'order',
568 [
569 'label' => __('Order', 'betterdocs'),
570 'type' => Controls_Manager::SELECT,
571 'options' => [
572 'ASC' => 'Ascending',
573 'DESC' => 'Descending',
574 ],
575 'default' => 'asc',
576
577 ]
578 );
579
580 if ($wb->get_name() === 'betterdocs-category-grid') {
581 $wb->add_control(
582 'grid_posts_query_heading',
583 [
584 'label' => __('Grid List Posts', 'betterdocs'),
585 'type' => Controls_Manager::HEADING,
586 'separator' => 'before',
587 ]
588 );
589
590 $wb->add_control(
591 'post_per_page',
592 [
593 'label' => __('Post Per Page', 'betterdocs'),
594 'type' => Controls_Manager::NUMBER,
595 'default' => '6',
596 ]
597 );
598
599 $wb->add_control(
600 'post_orderby',
601 [
602 'label' => __('Order By', 'betterdocs'),
603 'type' => Controls_Manager::SELECT,
604 'options' => self::get_post_orderby_options(),
605 'default' => 'date',
606 ]
607 );
608
609 $wb->add_control(
610 'post_order',
611 [
612 'label' => __('Order', 'betterdocs'),
613 'type' => Controls_Manager::SELECT,
614 'options' => [
615 'asc' => 'Ascending',
616 'desc' => 'Descending',
617 ],
618 'default' => 'desc',
619 ]
620 );
621
622 $wb->add_control(
623 'nested_subcategory',
624 [
625 'label' => __('Enable Nested Subcategory', 'betterdocs'),
626 'type' => Controls_Manager::SWITCHER,
627 'label_on' => __('Yes', 'betterdocs'),
628 'label_off' => __('No', 'betterdocs'),
629 'return_value' => 'true',
630 'default' => false,
631 ]
632 );
633
634 $wb->add_control(
635 'post_per_subcat',
636 [
637 'label' => __('Post Per Subcategory', 'betterdocs'),
638 'type' => Controls_Manager::NUMBER,
639 'default' => '6',
640 'condition' => [
641 'nested_subcategory' => 'true'
642 ]
643 ]
644 );
645 }
646
647 if ($wb->get_name() === 'betterdocs-category-box') {
648 $wb->add_control(
649 'nested_subcategory',
650 [
651 'label' => __('Nested Subcategory', 'betterdocs'),
652 'type' => Controls_Manager::SWITCHER,
653 'label_on' => __('Yes', 'betterdocs'),
654 'label_off' => __('No', 'betterdocs'),
655 'return_value' => 'true',
656 'default' => false,
657 ]
658 );
659 }
660
661 if($wb->get_name() === 'betterdocs-tab-view-list') {
662
663 $wb->add_control(
664 'tab_posts_query_heading',
665 [
666 'label' => __('Tab List Posts', 'betterdocs'),
667 'type' => Controls_Manager::HEADING,
668 'separator' => 'before',
669 ]
670 );
671
672 $wb->add_control(
673 'post_per_tab',
674 [
675 'label' => __('Posts Per Tab', 'betterdocs'),
676 'type' => Controls_Manager::NUMBER,
677 'default' => '10'
678 ]
679 );
680
681 $wb->add_control(
682 'tab_list_posts_orderby',
683 [
684 'label' => __('Posts Order By', 'betterdocs'),
685 'type' => Controls_Manager::SELECT,
686 'options' => [
687 'name' => __('Name', 'betterdocs'),
688 'slug' => __('Slug', 'betterdocs'),
689 'term_group' => __('Term Group', 'betterdocs'),
690 'term_id' => __('Term ID', 'betterdocs'),
691 'id' => __('ID', 'betterdocs'),
692 'description' => __('Description', 'betterdocs'),
693 'parent' => __('Parent', 'betterdocs'),
694 'betterdocs_order' => __('BetterDocs Order', 'betterdocs'),
695 ],
696 'default' => 'name',
697 ]
698 );
699
700 $wb->add_control(
701 'tab_list_order',
702 [
703 'label' => __('Order', 'betterdocs'),
704 'type' => Controls_Manager::SELECT,
705 'options' => [
706 'ASC' => 'Ascending',
707 'DESC' => 'Descending',
708 ],
709 'default' => 'ASC',
710
711 ]
712 );
713
714 $wb->add_control(
715 'nested_subcategory_tab_list',
716 [
717 'label' => __('Nested Subcategory', 'betterdocs'),
718 'type' => Controls_Manager::SWITCHER,
719 'label_on' => __('Yes', 'betterdocs'),
720 'label_off' => __('No', 'betterdocs'),
721 'return_value' => 'true',
722 'default' => 'true',
723 ]
724 );
725
726 $wb->add_control(
727 'nested_posts_per_page',
728 [
729 'label' => __('Posts Per Page', 'betterdocs'),
730 'type' => Controls_Manager::NUMBER,
731 'default' => '-1',
732 'condition' => [
733 'nested_subcategory_tab_list' => 'true'
734 ]
735 ]
736 );
737
738 $wb->add_control(
739 'nested_sub_cat_order',
740 [
741 'label' => __('Nested Posts Order', 'betterdocs'),
742 'type' => Controls_Manager::SELECT,
743 'options' => [
744 'ASC' => 'Ascending',
745 'DESC' => 'Descending',
746 ],
747 'default' => 'ASC',
748 'condition' => [
749 'nested_subcategory_tab_list' => 'true'
750 ]
751 ]
752 );
753
754 $wb->add_control(
755 'nested_sub_cat_orderby',
756 [
757 'label' => __('Nested Posts Order By', 'betterdocs'),
758 'type' => Controls_Manager::SELECT,
759 'options' => [
760 'none' => __('No order', 'betterdocs'),
761 'name' => __('Name', 'betterdocs'),
762 'slug' => __('Slug', 'betterdocs'),
763 'term_group' => __('Term Group', 'betterdocs'),
764 'term_id' => __('Term ID', 'betterdocs'),
765 'id' => __('ID', 'betterdocs'),
766 'description' => __('Description', 'betterdocs'),
767 'parent' => __('Parent', 'betterdocs'),
768 'betterdocs_order' => __('BetterDocs Order', 'betterdocs'),
769 ],
770 'default' => 'name',
771 'condition' => [
772 'nested_subcategory_tab_list' => 'true'
773 ]
774 ]
775 );
776 }
777
778 $wb->end_controls_section();
779 }
780
781 public function nested_subcategory($term_id, $settings, $multiple_kb) {
782 $html='';
783 $sub_categories = BetterDocs_Helper::child_taxonomy_terms($term_id, $multiple_kb, $settings['orderby'], $settings['order'], '');
784 if ($sub_categories) {
785 foreach ($sub_categories as $sub_category) {
786 $html .= '<span class="el-betterdocs-grid-sub-cat-title">';
787
788 if (isset($settings['nested_list_title_closed_icon']['value']['url']) && !empty($settings['nested_list_title_closed_icon']['value']['url'])) {
789 $html .= '<img class="toggle-arrow arrow-right" src="' . $settings['nested_list_title_closed_icon']['value']['url'] . '" />';
790 } else {
791 $html .= '<i class="' . $settings['nested_list_title_closed_icon']['value'] . ' toggle-arrow arrow-right"></i>';
792 }
793
794 if (isset($settings['nested_list_title_open_icon']['value']['url']) && !empty($settings['nested_list_title_open_icon']['value']['url'])) {
795 $html .= '<img class="toggle-arrow arrow-down" src="' . $settings['nested_list_title_open_icon']['value']['url'] . '" />';
796 } else {
797 $html .= '<i class="' . $settings['nested_list_title_open_icon']['value'] . ' toggle-arrow arrow-down"></i>';
798 }
799
800 $html .= '<a href="#">' . $sub_category->name . '</a></span>';
801 $html .= '<ul class="docs-sub-cat-list">';
802
803 $sub_args = array(
804 'post_type' => 'docs',
805 'post_status' => 'publish'
806 );
807
808 $tax_query = array(
809 array(
810 'taxonomy' => 'doc_category',
811 'field' => 'slug',
812 'terms' => $sub_category->slug,
813 'operator' => 'AND',
814 'include_children' => false
815 ),
816 );
817
818 $sub_args['posts_per_page'] = $settings['post_per_subcat'];
819
820 $sub_args['tax_query'] = apply_filters('betterdocs_list_tax_query_arg', $tax_query, $multiple_kb, $sub_category->slug, '');
821 $sub_args = apply_filters('betterdocs_sub_cat_articles_args', $sub_args, $sub_category->term_id);
822 $sub_post_query = new \WP_Query($sub_args);
823 if ($sub_post_query->have_posts()):
824 while ($sub_post_query->have_posts()): $sub_post_query->the_post();
825 $sub_attr = ['href="' . get_the_permalink() . '"'];
826 $html .= '<li class="sub-list">';
827 if (isset($settings['list_icon']['value']['url']) && !empty($settings['list_icon']['value']['url'])) {
828 $html .= '<img class="el-betterdocs-cg-post-list-icon" src="' . $settings['list_icon']['value']['url'] . '" />';
829 } else {
830 $html .= '<i class="' . $settings['list_icon']['value'] . ' el-betterdocs-cg-post-list-icon"></i>';
831 }
832 $html .= '<a ' . implode(' ', $sub_attr) . '>' . get_the_title() . '</a></li>';
833 endwhile;
834 endif;
835 wp_reset_query();
836 $html .= $this->nested_subcategory($sub_category->term_id, $settings, $multiple_kb);
837 $html .= '</ul>';
838 }
839 }
840 return $html;
841 }
842
843 const ELBD_ALLOWED_HTML_TAGS = [
844 'article',
845 'aside',
846 'div',
847 'footer',
848 'h1',
849 'h2',
850 'h3',
851 'h4',
852 'h5',
853 'h6',
854 'header',
855 'main',
856 'nav',
857 'p',
858 'section',
859 'span',
860 ];
861
862 /**
863 * elbd_validate_html_tag
864 * @param $tag
865 * @return mixed|string
866 */
867 public static function elbd_validate_html_tag( $tag ){
868 return in_array( strtolower( $tag ), self::ELBD_ALLOWED_HTML_TAGS ) ? $tag : 'div';
869 }
870 }
871
872 BetterDocs_Elementor::init();
873