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

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