PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 3.8.1
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v3.8.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 / Editors / Elementor.php

Elementor.php in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 3.8.1, at includes/Editors/Elementor.php

883 lines 32.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace WPDeveloper\BetterDocs\Editors;
4
5 if ( ! defined( 'ABSPATH' ) ) {
6 exit; // Exit if accessed directly
7 }
8
9 use Elementor\Controls_Manager;
10 use Elementor\Api as ElementorAPI;
11 use Elementor\Plugin as ElementorPlugin;
12 use WPDeveloper\BetterDocs\Core\Settings;
13 use WPDeveloper\BetterDocs\Utils\Enqueue;
14 use WPDeveloper\BetterDocs\Editors\Elementor\Helper;
15 use WPDeveloper\BetterDocs\Editors\Elementor\SingleDocs;
16 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\ToC;
17 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\DocAuthor;
18 use WPDeveloper\BetterDocs\Editors\Elementor\DocsArchive;
19 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\Title;
20 use WPDeveloper\BetterDocs\Editors\Elementor\Tags\TitleTag;
21 use WPDeveloper\BetterDocs\Editors\Elementor\TemplateSource;
22 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\Content;
23 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\DocDate;
24 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\Sidebar;
25 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\DocShare;
26 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\Feedback;
27 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\Basic\FAQ;
28 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\Reactions;
29 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\Navigation;
30 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\ArchiveList;
31 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\PrintButton;
32 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\Breadcrumbs;
33 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\ReadingTime;
34 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\Basic\SearchForm;
35 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\Basic\CategoryBox;
36 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\Basic\CategoryGrid;
37 use WPDeveloper\BetterDocs\Editors\Elementor\Conditions\ArchiveCondition;
38 // use WPDeveloper\BetterDocs\Editors\Elementor\Widget\Basic\BetterdocsEncyclopedia;
39 use WPDeveloper\BetterDocs\Editors\Elementor\Widget\CategoryArchiveHeader;
40
41 class Elementor extends BaseEditor {
42 protected $is_elementor_active = false;
43 protected $is_elementor_pro_active = false;
44 protected static $is_templates_added = false;
45
46 /**
47 * Elementor plugin class
48 * @var ElementorPlugin
49 */
50 protected $elementor;
51
52 /**
53 * Elementor Helper class
54 * @var Helper
55 */
56 protected $helper;
57
58 public function __construct( Settings $settings, Enqueue $enqueue, Helper $helper ) {
59 parent::__construct( $settings, $enqueue );
60
61 $this->helper = $helper;
62 $this->is_elementor_active = betterdocs()->helper->is_plugin_active( 'elementor/elementor.php' );
63 $this->is_elementor_pro_active = betterdocs()->helper->is_plugin_active( 'elementor-pro/elementor-pro.php' );
64
65 if ( ! $this->is_elementor_active || ! class_exists( ElementorPlugin::class ) ) {
66 return;
67 }
68
69 $this->elementor = ElementorPlugin::instance();
70 }
71
72 public function init() {
73 if ( ! $this->is_elementor_active || $this->elementor == null ) {
74 return;
75 }
76
77 add_action( 'wp_enqueue_scripts', [$this, 'enqueue_scripts'] );
78
79 add_action( 'elementor/elements/categories_registered', [$this, 'register_widget_category'] );
80 add_action( 'elementor/widgets/register', [$this, 'register_basic_widgets'] );
81
82 add_action( 'elementor/editor/before_enqueue_scripts', [$this, 'editor_enqueue_scripts'] );
83 add_filter( 'elementor/editor/localize_settings', [$this, 'promote_pro_elements'] );
84
85 add_filter( 'elementor/theme/need_override_location', [$this, 'override_location'], 10, 2 );
86 add_action( 'betterdocs/elementor/widgets/query', [$this, 'betterdocs_query'], 10, 2 );
87
88 if ( $this->is_elementor_pro_active ) {
89 add_action( 'elementor/dynamic_tags/register', [$this, 'register_basic_tags'] );
90 add_action( 'elementor/widgets/register', [$this, 'register_theme_builder_widgets'] );
91 add_action( 'elementor/theme/register_conditions', [$this, 'register_conditions'] );
92
93 //(Conflict Fix)Solves the issue with plugin - Sticky Header Effects for Elementor(Plugin)
94 if ( ! did_action( 'elementor/documents/register' ) ) {
95 add_action( 'elementor/documents/register', [$this, 'register_documents'] );
96 } else {
97 $this->elementor->documents->register_document_type( 'docs', SingleDocs::get_class_full_name() );
98 $this->elementor->documents->register_document_type( 'doc-archive', DocsArchive::get_class_full_name() );
99 }
100 }
101
102 $this->betterdocs_init();
103 }
104
105 public function editor_enqueue_scripts() {
106 betterdocs()->assets->enqueue( 'betterdocs-el-icon', 'elementor/css/betterdocs-el-icon.css' );
107 }
108
109 public function register_documents( $documents_manager ) {
110 $documents_manager->register_document_type( 'docs', SingleDocs::get_class_full_name() );
111 $documents_manager->register_document_type( 'doc-archive', DocsArchive::get_class_full_name() );
112 }
113
114 public function override_location( $need_override_location, $location ) {
115 if ( is_singular( ['docs'] ) && 'single' === $location ) {
116 $need_override_location = true;
117 }
118
119 return $need_override_location;
120 }
121
122 /**
123 * Query Controls
124 *
125 */
126 public function betterdocs_query( $wb, $taxonomy ) {
127 $wb->start_controls_section(
128 'eael_section_post__filters',
129 [
130 'label' => __( 'Query', 'betterdocs' )
131 ]
132 );
133
134 $default_multiple_kb = $this->multiple_kb_status();
135
136 if ( $default_multiple_kb && $taxonomy != 'knowledge_base' ) {
137 $multiple_kb_terms = $this->get_kb_terms( true, false );
138 $default_slug = count( $multiple_kb_terms ) > 0 ? array_keys( $multiple_kb_terms )[0] : '';
139
140 $wb->add_control(
141 'selected_knowledge_base',
142 [
143 'label' => __( 'Knowledge Bases', 'betterdocs' ),
144 'label_block' => true,
145 'type' => Controls_Manager::SELECT2,
146 'options' => $multiple_kb_terms,
147 'multiple' => false,
148 'default' => '',
149 'select2options' => [
150 'placeholder' => __( 'All Knowledge Base', 'betterdocs' ),
151 'allowClear' => true
152 ]
153 ]
154 );
155 }
156
157 if ( $wb->get_name() === 'betterdocs-category-grid' ) {
158 $wb->add_control(
159 'grid_query_heading',
160 [
161 'label' => __( 'Category Grid', 'betterdocs' ),
162 'type' => Controls_Manager::HEADING
163 ]
164 );
165 }
166
167 $wb->add_control(
168 'include',
169 [
170 'label' => __( 'Include', 'betterdocs' ),
171 'label_block' => true,
172 'type' => Controls_Manager::SELECT2,
173 'options' => $this->helper->get_terms( $taxonomy, 'term_id' ),
174 'multiple' => true,
175 'default' => []
176 ]
177 );
178
179 $wb->add_control(
180 'exclude',
181 [
182 'label' => __( 'Exclude', 'betterdocs' ),
183 'type' => Controls_Manager::SELECT2,
184 'options' => $this->helper->get_terms( $taxonomy, 'term_id' ),
185 'label_block' => true,
186 'post_type' => '',
187 'multiple' => true
188 ]
189 );
190
191 if ( $wb->get_name() === 'betterdocs-category-grid' ) {
192 $wb->add_control(
193 'grid_per_page',
194 [
195 'label' => __( 'Grid Per Page', 'betterdocs' ),
196 'type' => Controls_Manager::NUMBER,
197 'default' => '8'
198 ]
199 );
200 } else if ( $wb->get_name() !== 'betterdocs-sidebar' ) {
201 $wb->add_control(
202 'box_per_page',
203 [
204 'label' => __( $wb->get_name() == 'betterdocs-tab-view-list' ? 'Tabs Per Page' : 'Box Per Page', 'betterdocs' ),
205 'type' => Controls_Manager::NUMBER,
206 'default' => '8'
207 ]
208 );
209 }
210
211 $wb->add_control(
212 'offset',
213 [
214 'label' => __( 'Offset', 'betterdocs' ),
215 'type' => Controls_Manager::NUMBER,
216 'default' => '0'
217 ]
218 );
219
220 // difference between betterdocs-sidebar and betterdocs-category-grid is the default order
221 if ( $wb->get_name() === 'betterdocs-sidebar' ) {
222 $wb->add_control(
223 'orderby',
224 [
225 'label' => __( 'Order By', 'betterdocs' ),
226 'type' => Controls_Manager::SELECT,
227 'options' => [
228 'none' => __( 'No order', 'betterdocs' ),
229 'name' => __( 'Name', 'betterdocs' ),
230 'slug' => __( 'Slug', 'betterdocs' ),
231 'term_group' => __( 'Term Group', 'betterdocs' ),
232 'term_id' => __( 'Term ID', 'betterdocs' ),
233 'id' => __( 'ID', 'betterdocs' ),
234 'description' => __( 'Description', 'betterdocs' ),
235 'parent' => __( 'Parent', 'betterdocs' ),
236 'betterdocs_order' => __( 'BetterDocs Order', 'betterdocs' )
237 ],
238 'default' => $this->settings->get( 'terms_orderby', 'betterdocs_order' )
239 ]
240 );
241
242 $wb->add_control(
243 'order',
244 [
245 'label' => __( 'Order', 'betterdocs' ),
246 'type' => Controls_Manager::SELECT,
247 'options' => [
248 'ASC' => 'Ascending',
249 'DESC' => 'Descending'
250 ],
251 'default' => $this->settings->get( 'terms_order', 'ASC' ),
252 'condition' => [
253 'orderby!' => 'betterdocs_order'
254 ]
255
256 ]
257 );
258 } else {
259 $wb->add_control(
260 'orderby',
261 [
262 'label' => __( 'Order By', 'betterdocs' ),
263 'type' => Controls_Manager::SELECT,
264 'options' => [
265 'none' => __( 'No order', 'betterdocs' ),
266 'name' => __( 'Name', 'betterdocs' ),
267 'slug' => __( 'Slug', 'betterdocs' ),
268 'term_group' => __( 'Term Group', 'betterdocs' ),
269 'term_id' => __( 'Term ID', 'betterdocs' ),
270 'id' => __( 'ID', 'betterdocs' ),
271 'description' => __( 'Description', 'betterdocs' ),
272 'parent' => __( 'Parent', 'betterdocs' ),
273 'betterdocs_order' => __( 'BetterDocs Order', 'betterdocs' )
274 ],
275 'default' => 'name'
276 ]
277 );
278
279 $wb->add_control(
280 'order',
281 [
282 'label' => __( 'Order', 'betterdocs' ),
283 'type' => Controls_Manager::SELECT,
284 'options' => [
285 'ASC' => 'Ascending',
286 'DESC' => 'Descending'
287 ],
288 'default' => 'asc',
289 'condition' => [
290 'orderby!' => 'betterdocs_order'
291 ]
292
293 ]
294 );
295 }
296
297 if ( $wb->get_name() === 'betterdocs-category-grid' ) {
298 $wb->add_control(
299 'grid_posts_query_heading',
300 [
301 'label' => __( 'Grid List Posts', 'betterdocs' ),
302 'type' => Controls_Manager::HEADING,
303 'separator' => 'before'
304 ]
305 );
306
307 $wb->add_control(
308 'post_per_page',
309 [
310 'label' => __( 'Post Per Page', 'betterdocs' ),
311 'type' => Controls_Manager::NUMBER,
312 'default' => '6'
313 ]
314 );
315
316 $wb->add_control(
317 'post_orderby',
318 [
319 'label' => __( 'Order By', 'betterdocs' ),
320 'type' => Controls_Manager::SELECT,
321 'options' => $this->helper->orderby_options(),
322 'default' => 'date'
323 ]
324 );
325
326 $wb->add_control(
327 'post_order',
328 [
329 'label' => __( 'Order', 'betterdocs' ),
330 'type' => Controls_Manager::SELECT,
331 'options' => [
332 'asc' => 'Ascending',
333 'desc' => 'Descending'
334 ],
335 'default' => 'desc'
336 ]
337 );
338
339 $wb->add_control(
340 'nested_subcategory',
341 [
342 'label' => __( 'Enable Nested Subcategory', 'betterdocs' ),
343 'type' => Controls_Manager::SWITCHER,
344 'label_on' => __( 'Yes', 'betterdocs' ),
345 'label_off' => __( 'No', 'betterdocs' ),
346 'return_value' => 'true',
347 'default' => false
348 ]
349 );
350
351 $wb->add_control(
352 'subcategory_per_grid',
353 [
354 'label' => __( 'Subcategory Per Grid', 'betterdocs' ),
355 'type' => Controls_Manager::NUMBER,
356 'default' => '2',
357 'condition' => [
358 'nested_subcategory' => 'true'
359 ]
360 ]
361 );
362
363 $wb->add_control(
364 'post_per_subcat',
365 [
366 'label' => __( 'Post Per Subcategory', 'betterdocs' ),
367 'type' => Controls_Manager::NUMBER,
368 'default' => '6',
369 'condition' => [
370 'nested_subcategory' => 'true'
371 ]
372 ]
373 );
374 }
375
376 if ( $wb->get_name() === 'betterdocs-category-box' ) {
377 $wb->add_control(
378 'nested_subcategory',
379 [
380 'label' => __( 'Nested Subcategory', 'betterdocs' ),
381 'type' => Controls_Manager::SWITCHER,
382 'label_on' => __( 'Yes', 'betterdocs' ),
383 'label_off' => __( 'No', 'betterdocs' ),
384 'return_value' => 'true',
385 'default' => false
386 ]
387 );
388 }
389
390 if ( $wb->get_name() === 'betterdocs-sidebar' ) {
391 $wb->add_control(
392 'nested_subcategory',
393 [
394 'label' => __( 'Nested Subcategory', 'betterdocs' ),
395 'type' => Controls_Manager::SWITCHER,
396 'label_on' => __( 'Yes', 'betterdocs' ),
397 'label_off' => __( 'No', 'betterdocs' ),
398 'return_value' => 'true',
399 'default' => ( $this->settings->get( 'archive_nested_subcategory' ) == 1 ) ? 'true' : ''
400 ]
401 );
402 }
403
404 if ( $wb->get_name() === 'betterdocs-tab-view-list' ) {
405 $wb->add_control(
406 'tab_posts_query_heading',
407 [
408 'label' => __( 'Tab List Posts', 'betterdocs' ),
409 'type' => Controls_Manager::HEADING,
410 'separator' => 'before'
411 ]
412 );
413
414 $wb->add_control(
415 'tab_box_per_tabs',
416 [
417 'label' => __( 'Box Per Tabs', 'betterdocs' ),
418 'type' => Controls_Manager::NUMBER,
419 'default' => '10'
420 ]
421 );
422
423 $wb->add_control(
424 'post_per_tab',
425 [
426 'label' => __( 'Posts Per Tab', 'betterdocs' ),
427 'type' => Controls_Manager::NUMBER,
428 'default' => '10'
429 ]
430 );
431
432 $wb->add_control(
433 'tab_list_posts_orderby',
434 [
435 'label' => __( 'Posts Order By', 'betterdocs' ),
436 'type' => Controls_Manager::SELECT,
437 'options' => [
438 'name' => __( 'Name', 'betterdocs' ),
439 'slug' => __( 'Slug', 'betterdocs' ),
440 'term_group' => __( 'Term Group', 'betterdocs' ),
441 'term_id' => __( 'Term ID', 'betterdocs' ),
442 'id' => __( 'ID', 'betterdocs' ),
443 'description' => __( 'Description', 'betterdocs' ),
444 'parent' => __( 'Parent', 'betterdocs' ),
445 'betterdocs_order' => __( 'BetterDocs Order', 'betterdocs' )
446 ],
447 'default' => 'name'
448 ]
449 );
450
451 $wb->add_control(
452 'tab_list_order',
453 [
454 'label' => __( 'Order', 'betterdocs' ),
455 'type' => Controls_Manager::SELECT,
456 'options' => [
457 'ASC' => 'Ascending',
458 'DESC' => 'Descending'
459 ],
460 'default' => 'ASC'
461
462 ]
463 );
464
465 $wb->add_control(
466 'nested_subcategory_tab_list',
467 [
468 'label' => __( 'Nested Subcategory', 'betterdocs' ),
469 'type' => Controls_Manager::SWITCHER,
470 'label_on' => __( 'Yes', 'betterdocs' ),
471 'label_off' => __( 'No', 'betterdocs' ),
472 'return_value' => 'true',
473 'default' => 'true'
474 ]
475 );
476
477 $wb->add_control(
478 'nested_posts_per_page',
479 [
480 'label' => __( 'Posts Per Page', 'betterdocs' ),
481 'type' => Controls_Manager::NUMBER,
482 'default' => '-1',
483 'condition' => [
484 'nested_subcategory_tab_list' => 'true'
485 ]
486 ]
487 );
488
489 $wb->add_control(
490 'nested_sub_cat_order',
491 [
492 'label' => __( 'Nested Subcategory Order', 'betterdocs' ),
493 'type' => Controls_Manager::SELECT,
494 'options' => [
495 'ASC' => 'Ascending',
496 'DESC' => 'Descending'
497 ],
498 'default' => 'ASC',
499 'condition' => [
500 'nested_subcategory_tab_list' => 'true'
501 ]
502 ]
503 );
504
505 $wb->add_control(
506 'nested_sub_cat_orderby',
507 [
508 'label' => __( 'Nested Subcategory Order By', 'betterdocs' ),
509 'type' => Controls_Manager::SELECT,
510 'options' => [
511 'none' => __( 'No order', 'betterdocs' ),
512 'name' => __( 'Name', 'betterdocs' ),
513 'slug' => __( 'Slug', 'betterdocs' ),
514 'term_group' => __( 'Term Group', 'betterdocs' ),
515 'term_id' => __( 'Term ID', 'betterdocs' ),
516 'id' => __( 'ID', 'betterdocs' ),
517 'description' => __( 'Description', 'betterdocs' ),
518 'parent' => __( 'Parent', 'betterdocs' ),
519 'betterdocs_order' => __( 'BetterDocs Order', 'betterdocs' )
520 ],
521 'default' => 'name',
522 'condition' => [
523 'nested_subcategory_tab_list' => 'true'
524 ]
525 ]
526 );
527 }
528
529 $wb->end_controls_section();
530 }
531
532 public function multiple_kb_status() {
533 if ( $this->settings->get( 'multiple_kb' ) == 1 ) {
534 return 'true';
535 }
536
537 return '';
538 }
539
540 public function get_kb_terms( $prettify = false, $term_id = true ) {
541 $args = [
542 'taxonomy' => 'knowledge_base',
543 'hide_empty' => true,
544 'parent' => 0
545 ];
546
547 $terms = get_terms( $args );
548
549 if ( is_wp_error( $terms ) ) {
550 return [];
551 }
552
553 if ( $prettify ) {
554 $pretty_taxonomies = [];
555
556 foreach ( $terms as $term ) {
557 $pretty_taxonomies[$term_id ? $term->term_id : $term->slug] = $term->name;
558 }
559
560 return $pretty_taxonomies;
561 }
562
563 return $terms;
564 }
565
566 public function register_basic_tags( $module ) {
567 $module->register( new TitleTag );
568 }
569
570 public function register_basic_widgets( $widgets_manager ) {
571 foreach ( $this->basic_widget_lists() as $value ) {
572 $widgets_manager->register( new $value );
573 }
574 }
575
576 /**
577 *
578 * Mange all widget for single docs
579 *
580 * @return string[]
581 * @since 1.3.0
582 */
583 private function basic_widget_lists() {
584 $widget_arr = [
585 'betterdocs-elementor-search-form' => SearchForm::class,
586 'betterdocs-elementor-category-grid' => CategoryGrid::class,
587 'betterdocs-elementor-category-box' => CategoryBox::class,
588 'betterdocs-faq-widget' => FAQ::class
589 // 'betterdocs-encyclopedia-widget' => BetterdocsEncyclopedia::class
590 ];
591
592 return $widget_arr;
593 }
594
595 public function register_widget_category( $elements_manager ) {
596 $elements_manager->add_category( 'betterdocs-elements', [
597 'title' => __( 'BetterDocs', 'betterdocs' ),
598 'icon' => 'font'
599 ], 1 );
600 }
601
602 public function promote_pro_elements( $config ) {
603 if ( $this->is_pro_active ) {
604 return $config;
605 }
606
607 $promotion_widgets = [];
608
609 if ( isset( $config['promotionWidgets'] ) ) {
610 $promotion_widgets = $config['promotionWidgets'];
611 }
612
613 $combine_array = array_merge( $promotion_widgets, [
614 [
615 'name' => 'betterdocs-multiple-kb',
616 'title' => __( 'BetterDocs Multiple KB', 'betterdocs' ),
617 'icon' => 'betterdocs-icon-category-box',
618 'categories' => '["docs-archive"]'
619 ]
620 ] );
621
622 $config['promotionWidgets'] = $combine_array;
623
624 return $config;
625 }
626
627 public function is_templates() {
628 if ( $this->is_elementor_active && $this->is_elementor_pro_active ) {
629 $post_id = get_the_ID();
630 if ( $this->elementor->editor->is_edit_mode() || (
631 get_post_meta( $post_id, '_elementor_template_type', true )
632 && $this->elementor->documents->get( $post_id )->is_built_with_elementor()
633 ) ) {
634 return true;
635 }
636 }
637
638 return null;
639 }
640
641 public function enqueue_scripts() {
642 $assets = betterdocs()->assets;
643
644 /**
645 * Widget's CSS
646 */
647 $assets->register( 'betterdocs-el-category-grid', 'elementor/css/category-grid.css' );
648 $assets->register( 'betterdocs-el-category-box', 'elementor/css/category-box.css' );
649 $assets->register( 'betterdocs-el-articles-list', 'elementor/css/articles-list.css' );
650 $assets->register( 'betterdocs-el-navigation', 'elementor/css/navigation.css' );
651
652 /**
653 * Widget's JS
654 */
655 $assets->register( 'betterdocs-el-category-grid', 'elementor/js/category-grid.js', ['jquery', 'betterdocs-category-toggler'] );
656
657 /**
658 * Localize This In Order To Know If This Block Is Arriving From Betterdocs Templates Or Not
659 */
660 betterdocs()->assets->localize( 'betterdocs-el-category-grid', 'betterdocsCategoryGridConfig', [
661 'is_betterdocs_templates' => betterdocs()->helper->is_templates() ? true : false
662 ] );
663
664 if ( betterdocs()->helper->is_el_templates() == true ) {
665 $assets->enqueue( 'betterdocs-elementor-editor', 'elementor/css/betterdocs-el-edit.css' );
666
667 if ( ! $this->is_pro_active ) {
668 $assets->enqueue( 'betterdocs-elementor-editor', 'elementor/js/editor.js', ['jquery'] );
669 }
670 }
671
672 do_action( 'betterdocs_elementor_enqueue_scripts', $this );
673 }
674
675 public function register_theme_builder_widgets( $widgets_manager ) {
676 foreach ( $this->builder_widget_list() as $value ) {
677 if ( class_exists( $value ) ) {
678 $widgets_manager->register( new $value );
679 }
680 }
681 }
682
683 /**
684 * Mange all widget for single docs
685 *
686 * @return array<string>
687 * @since 1.3.0
688 */
689 public function builder_widget_list() {
690 return apply_filters( 'betterdocs_elementor_pro_widgets', [
691 'betterdocs-elementor-toc' => ToC::class,
692 'betterdocs-elementor-title' => Title::class,
693 'betterdocs-elementor-sidebar' => Sidebar::class,
694 'betterdocs-elementor-content' => Content::class,
695 'betterdocs-elementor-doc-date' => DocDate::class,
696 'betterdocs-elementor-doc-share' => DocShare::class,
697 'betterdocs-elementor-feedback' => Feedback::class,
698 'betterdocs-elementor-reactions' => Reactions::class,
699 'betterdocs-elementor-navigation' => Navigation::class,
700 'betterdocs-elementor-breadcrumbs' => Breadcrumbs::class,
701 'betterdocs-elementor-category-archive-list' => ArchiveList::class,
702 'betteredocs-elementor-reading-time' => ReadingTime::class,
703 'betterdocs-print-button' => PrintButton::class,
704 'betterdocs-elementor-doc-author' => DocAuthor::class,
705 'betteredocs-elementor-doc-category-archive-header' => CategoryArchiveHeader::class
706 ] );
707 }
708
709 /**
710 * @param \ElementorPro\Modules\ThemeBuilder\Classes\Conditions_Manager $conditions_manager
711 */
712 public function register_conditions( $conditions_manager ) {
713 $betterdocs_condition = betterdocs()->container->get( ArchiveCondition::class );
714 $conditions_manager->get_condition( 'general' )->register_sub_condition( $betterdocs_condition );
715 }
716
717 public function betterdocs_init() {
718 add_action( 'elementor/init', [$this, 'register_template_instance'], 20 );
719
720 static $is_done = false;
721 if ( defined( 'Elementor\Api::LIBRARY_OPTION_KEY' ) && ! $is_done ) {
722 $is_done = true;
723 add_filter( 'option_' . ElementorAPI::LIBRARY_OPTION_KEY, [$this, 'prepend_categories'] );
724 }
725
726 add_action( 'elementor/ajax/register_actions', [$this, 'modified_ajax_action'], 20 );
727
728 if ( defined( 'ELEMENTOR_VERSION' ) && version_compare( ELEMENTOR_VERSION, '3.10.0', '>=' ) && ! self::$is_templates_added ) {
729 self::$is_templates_added = true;
730 add_filter( 'http_response', [$this, 'http_response_modify_for_bd_template'], 10, 3 );
731 } elseif ( defined( 'ELEMENTOR_VERSION' ) && version_compare( ELEMENTOR_VERSION, '3.5.0', '>=' ) && ! self::$is_templates_added ) {
732 self::$is_templates_added = true;
733 add_filter( 'option_' . ElementorAPI::LIBRARY_OPTION_KEY, [$this, 'added_bd_template'] );
734 }
735 }
736
737 /**
738 * Added BetterDocs template with Elementor core templates list
739 *
740 * @param $response
741 * @param $parsed_args
742 * @param $url
743 *
744 * @return mixed
745 * @since 2.3.5
746 */
747 public function http_response_modify_for_bd_template( $response, $parsed_args, $url ) {
748 if ( $url === \Elementor\TemplateLibrary\Source_Remote::API_TEMPLATES_URL ) {
749 $templates_list = json_decode( wp_remote_retrieve_body( $response ), true );
750 $bd_templates = $this->get_templates();
751
752 if ( ! empty( $bd_templates ) ) {
753 $templates_list = array_merge( (array) $templates_list, (array) $bd_templates );
754 }
755
756 $response['body'] = json_encode( $templates_list );
757 }
758
759 return $response;
760 }
761
762 public function register_template_instance() {
763 $this->elementor->templates_manager->register_source( TemplateSource::class );
764 }
765
766 public function prepend_categories( $library_data ) {
767 $categories = $this->template_categories();
768 if ( ! empty( $categories ) ) {
769 $library_data['types_data']['block']['categories'] = array_merge(
770 $categories,
771 $library_data['types_data']['block']['categories']
772 );
773 }
774 return $library_data;
775 }
776
777 public function template_categories() {
778 return [
779 'Single Docs',
780 'Docs Archive'
781 ];
782 }
783
784 /**
785 * Added BetterDocs template with Elementor core templates list
786 *
787 * added_template
788 *
789 * @param $templates_list array elementor template list
790 *
791 * @return array
792 * @since 2.0.7
793 *
794 */
795 public function added_bd_template( array $templates_list ) {
796 $templates = $this->get_templates();
797
798 if ( ! empty( $templates ) ) {
799 $templates_list['templates'] = array_merge( $templates_list['templates'], $templates );
800 }
801
802 return $templates_list;
803 }
804
805 /**
806 * get_templates
807 *
808 * Get Better docs template list and cache this list
809 *
810 * @return array|mixed
811 * @since 2.0.0
812 */
813 public function get_templates() {
814 $_cache_key = 'betterdocs_template_library_' . betterdocs()->version;
815 $templates = get_transient( $_cache_key );
816
817 if ( ! $templates ) {
818 $source = new TemplateSource;
819 $templates = $source->get_items();
820
821 if ( ! empty( $templates ) ) {
822 $templates = array_map( function ( $template ) {
823 $template['id'] = $template['template_id'];
824 $template['tmpl_created'] = $template['date'];
825 $template['tags'] = json_encode( $template['tags'] );
826 $template['is_pro'] = $template['isPro'];
827 $template['access_level'] = $template['accessLevel'];
828 $template['popularity_index'] = $template['popularityIndex'];
829 $template['trend_index'] = $template['trendIndex'];
830 $template['has_page_settings'] = $template['hasPageSettings'];
831
832 return $template;
833 }, $templates );
834
835 set_transient( $_cache_key, $templates, WEEK_IN_SECONDS );
836 } else {
837 $templates = [];
838 }
839 }
840
841 return $templates;
842 }
843
844 public function modified_ajax_action( $ajax ) {
845 if ( ! isset( $_REQUEST['actions'] ) ) {
846 return;
847 }
848
849 $actions = json_decode( stripslashes( $_REQUEST['actions'] ), true );
850 $data = false;
851
852 foreach ( $actions as $id => $action_data ) {
853 if ( ! isset( $action_data['get_template_data'] ) ) {
854 $data = $action_data;
855 }
856 }
857
858 if ( ! $data ) {
859 return;
860 }
861
862 if ( ! isset( $data['data'] ) ) {
863 return;
864 }
865
866 $data = $data['data'];
867
868 if ( empty( $data['template_id'] ) ) {
869 return;
870 }
871
872 if ( false === strpos( $data['template_id'], 'betterdocs_' ) ) {
873 return;
874 }
875 $ajax->register_ajax_action( 'get_template_data', [$this, 'get_template_data'] );
876 }
877
878 public function get_template_data( $args ) {
879 $source = new TemplateSource;
880 return $source->get_data( $args );
881 }
882 }
883