PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 2.0.1
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v2.0.1
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 3.5.2 All 199 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.1, at includes/elementor/class-betterdocs-elementor.php

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