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

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