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

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

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