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

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