PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 3.5.3
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v3.5.3
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 / Core / Settings.php

Settings.php in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 3.5.3, at includes/Core/Settings.php

2,247 lines 153.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\Core;
4
5 use WP_User;
6 use WP_Error;
7 use WPDeveloper\BetterDocs\Utils\Base;
8 use WPDeveloper\BetterDocs\Utils\Database;
9 use WPDeveloper\BetterDocs\Admin\Builder\Rules;
10 use WPDeveloper\BetterDocs\Admin\Builder\GlobalFields;
11
12 class Settings extends Base {
13 public $base_key = 'betterdocs_settings';
14
15 /**
16 * Database class
17 * @var Database
18 */
19 protected $database;
20
21 private $deprecated = [];
22
23 private $cannot_be_empty = [
24 'breadcrumb_doc_title',
25 'docs_slug',
26 'category_slug',
27 'tag_slug',
28 'permalink_structure',
29 'docs_page'
30 ];
31
32 public function __construct( Database $database ) {
33 $this->database = $database;
34 $this->deprecated = $this->deprecated_settings();
35
36 add_filter( 'betterdocs_settings_tabs', [$this, 'import_export_settings'] );
37
38 add_action( 'admin_enqueue_scripts', [$this, 'enqueue'] );
39
40 if ( isset( $_GET['page'] ) && $_GET['page'] === 'betterdocs-settings' && ! has_action( 'betterdocs_settings_header' ) ) {
41 add_action( 'betterdocs_settings_header', [$this, 'header'] );
42 }
43
44 add_action( 'wp_ajax_betterdocs_dark_mode', [$this, 'dark_mode'] );
45 add_filter( 'betterdocs_settings_tab_advance', [$this, 'hide_roles_management'], 11, 1 );
46 add_action( 'betterdocs::settings::saved', [$this, 'fallback_slugs'], 99, 3 );
47 }
48
49 public function fallback_slugs( $_saved, $_settings, $_old_settings = [] ) {
50 $_default = $this->get_default();
51 foreach ( $this->cannot_be_empty as $key ) {
52 if ( $key === 'docs_page' && ! $_settings['builtin_doc_page'] && empty( $_settings[$key] ) ) {
53 $this->save( 'builtin_doc_page', true );
54 continue;
55 }
56
57 if ( empty( $_settings[$key] ) ) {
58 $this->save( $key, $_default[$key] );
59 }
60 }
61 }
62
63 /**
64 * Get the settings URL for admin
65 * @return string
66 */
67 public function url() {
68 return esc_url( admin_url( 'admin.php?page=betterdocs-settings' ) );
69 }
70
71 /**
72 * This method is responsible for enqueueing scripts in settings panel
73 *
74 * @param string $hook
75 *
76 * @return void
77 * @since 2.5.0
78 */
79 public function enqueue( $hook ) {
80 if ( $hook !== 'betterdocs_page_betterdocs-settings' ) {
81 return;
82 }
83
84 wp_enqueue_script( 'betterdocs-admin' );
85 betterdocs()->assets->enqueue( 'betterdocs-settings', 'admin/css/settings.css' );
86 betterdocs()->assets->enqueue( 'betterdocs-icons', 'admin/btd-icon/style.css' );
87 betterdocs()->assets->enqueue( 'betterdocs-settings', 'admin/js/settings.js' );
88 betterdocs()->assets->localize( 'betterdocs-settings', 'betterdocsAdminSettings', GlobalFields::normalize( $this->settings_args() ) );
89 }
90
91 /**
92 * This method is responsible for printing header in dashboard settings page.
93 *
94 * @param string $hook
95 *
96 * @return void
97 * @since 2.5.0
98 */
99 public function header( $hook ) {
100 if ( $hook !== 'settings' ) {
101 return;
102 }
103
104 betterdocs()->views->get( 'admin/template-parts/settings-header' );
105 betterdocs()->views->get( 'admin/template-parts/settings-header-2' );
106 }
107
108 /**
109 * A list of deprecated settings keys.
110 *
111 * @return array
112 * @since 2.5.0
113 */
114 public function deprecated_settings() {
115 return [];
116 }
117
118 /**
119 * Dynamic migration caller.
120 *
121 * @return void
122 * @since 2.5.0
123 */
124 public function migration( $version ) {
125 if ( $version > 250 ) {
126 for ( $v = 250; $v <= $version; $v++ ) {
127 $_func = "v{$v}";
128 if ( method_exists( $this, $_func ) ) {
129 call_user_func( [$this, $_func] );
130 }
131 }
132 }
133 }
134
135 /**
136 * Migration for version 2.5.0
137 *
138 * @return void
139 * @since 2.5.0
140 */
141 public function v250() {
142 if ( $this->get( 'alphabetically_order_term', false ) ) {
143 $this->save( 'terms_orderby', 'name' );
144 }
145
146 if ( $orderby = $this->get( 'alphabetically_order_post', false ) ) {
147 if ( $orderby === '1' ) {
148 $this->save( 'alphabetically_order_post', 'title' );
149 }
150 }
151 }
152
153 /**
154 * A list of default settings data.
155 *
156 * @return array
157 * @since 1.0.0
158 *
159 */
160 public function get_default() {
161 $_default = [
162 'multiple_kb' => '',
163 'builtin_doc_page' => true,
164 'breadcrumb_doc_title' => __( 'Docs', 'betterdocs' ),
165 'docs_slug' => 'docs',
166 'docs_page' => 0,
167 'category_slug' => 'docs-category',
168 'tag_slug' => 'docs-tag',
169 'permalink_structure' => 'docs/',
170 'enable_faq_schema' => false,
171 'live_search' => true,
172 'advance_search' => false,
173 'popular_keyword_limit' => 5,
174 'search_letter_limit' => 3,
175 'search_placeholder' => __( 'Search...', 'betterdocs' ),
176 'search_not_found_text' => __( 'Sorry, no docs were found.', 'betterdocs' ),
177 'search_result_image' => true,
178 'masonry_layout' => true,
179 'category_title_link' => false,
180 'terms_orderby' => 'betterdocs_order',
181 'alphabetically_order_term' => false,
182 'terms_order' => 'ASC',
183 'alphabetically_order_post' => 'betterdocs_order',
184 'docs_order' => 'ASC',
185 'nested_subcategory' => false,
186 'column_number' => 3,
187 'posts_number' => 10,
188 'post_count' => true,
189 'count_text' => __( 'docs', 'betterdocs' ),
190 'count_text_singular' => __( 'doc', 'betterdocs' ),
191 'exploremore_btn' => true,
192 'exploremore_btn_txt' => __( 'Explore More', 'betterdocs' ),
193 'doc_single' => 1,
194 'enable_toc' => true,
195 'toc_title' => __( 'Table of Contents', 'betterdocs' ),
196 'toc_hierarchy' => true,
197 'toc_list_number' => true,
198 'toc_dynamic_title' => false,
199 'enable_sticky_toc' => true,
200 'sticky_toc_offset' => 100,
201 'collapsible_toc_mobile' => false,
202 'supported_heading_tag' => ['1', '2', '3', '4', '5', '6'],
203 'enable_post_title' => true,
204 'title_link_ctc' => true,
205 'enable_breadcrumb' => true,
206 'breadcrumb_home_text' => __( 'Home', 'betterdocs' ),
207 'breadcrumb_home_url' => get_home_url(),
208 'enable_breadcrumb_category' => true,
209 'enable_breadcrumb_title' => true,
210 'enable_sidebar_cat_list' => true,
211 'enable_print_icon' => true,
212 'enable_tags' => true,
213 'email_feedback' => true,
214 'feedback_link_text' => __( 'Still stuck? How can we help?', 'betterdocs' ),
215 'reaction_feedback_text' => __( 'Thanks for your feedback', 'betterdocs'),
216 'feedback_url' => '',
217 'feedback_form_title' => __( 'How can we help?', 'betterdocs' ),
218 'email_address' => get_option( 'admin_email' ),
219 'show_last_update_time' => true,
220 'enable_navigation' => true,
221 'enable_comment' => true,
222 'enable_credit' => false,
223 'enable_archive_sidebar' => true,
224 'archive_nested_subcategory' => true,
225 'enable_content_restriction' => false,
226 'enable_reporting' => false,
227 'enable_sample_data' => false,
228 'reporting_day' => 'monday',
229 'reporting_email' => get_option( 'admin_email' ),
230 'enable_write_with_ai' => true,
231 'enable_faq_write_with_ai' => true,
232 'ai_autowrite_api_key' => '',
233 'ai_autowrite_max_token' => 1500,
234 'enable_estimated_reading_time' => false
235 ];
236
237 $_default = apply_filters( 'betterdocs_default_settings', $_default );
238 // $_default = apply_filters_deprecated(
239 // 'betterdocs_option_default_settings', [$_default], '2.5.0',
240 // 'betterdocs_default_settings', 'betterdocs_option_default_settings will be removed from v3.5.0.'
241 // );
242
243 return $_default;
244 }
245
246 /**
247 * A list of default settings for pro plugins.
248 *
249 * @return array
250 * @since 2.5.0
251 */
252 public function get_pro_defaults() {
253 return [];
254 }
255
256 /**
257 * Get customizer links for docs page.
258 *
259 * @return string
260 * @since 1.0.0
261 */
262 public function customizer_link() {
263 $query['autofocus[panel]'] = 'betterdocs_customize_options';
264 $query['return'] = admin_url( 'edit.php?post_type=docs' );
265 $builtin_doc_page = betterdocs()->settings->get( 'builtin_doc_page' );
266 $docs_slug = betterdocs()->settings->get( 'docs_slug' );
267 $docs_page = betterdocs()->settings->get( 'builtin_doc_page' );
268
269 if ( $builtin_doc_page == 1 && $docs_slug ) {
270 $query['url'] = site_url( '/' . $docs_slug );
271 } elseif ( $builtin_doc_page != 1 && $docs_page ) {
272 $post_info = get_post( $docs_page );
273 $query['url'] = site_url( '/' . $post_info->post_name );
274 }
275
276 return add_query_arg( $query, admin_url( 'customize.php' ) );
277 }
278
279 /**
280 * Get All Roles
281 * dynamically
282 *
283 * @return array
284 */
285 public function get_roles() {
286 $roles = wp_roles()->role_names;
287 unset( $roles['subscriber'] );
288
289 return $roles;
290 }
291
292 /**
293 * Set dark mode
294 *
295 * @return void
296 * @since 1.0.0
297 */
298 public function dark_mode() {
299 if ( ! check_ajax_referer( 'doc_cat_order_nonce', 'nonce', false ) ) {
300 wp_send_json_error();
301 }
302
303 if ( isset( $_POST['mode'] ) ) {
304 if ( $this->save( 'dark_mode', rest_sanitize_boolean( $_POST['mode'] ) ) ) {
305 wp_send_json_success();
306 }
307 }
308
309 wp_send_json_error();
310 }
311
312 public function get_normalized_value( $key, $value, $default = null ) {
313 $_origin_value = $_value = $value;
314
315 if ( in_array( $_value, ['on', 'off', '1', 'false', 'true'], true ) ) {
316 switch ( $_value ) {
317 case 'on':
318 case 'ON':
319 case '1':
320 case 'true':
321 $_value = true;
322 break;
323 case 'off':
324 case 'OFF':
325 case '':
326 case 'false':
327 $_value = false;
328 break;
329 }
330 }
331
332 $this->type_validation( $_value, $default );
333
334 return $_value;
335 }
336
337 public function get_normalized_values( $values, $default_values = [] ) {
338 if ( empty( $values ) ) {
339 return [];
340 }
341
342 $_settings = [];
343 foreach ( $values as $key => $value ) {
344 $_default_value = isset( $default_values[$key] ) ? $default_values[$key] : null;
345 $_settings[$key] = $this->get_normalized_value( $key, $value, $_default_value );
346 }
347
348 return $_settings;
349 }
350
351 public function get_all( $raw = false ) {
352 $_default_settings = $raw ? [] : array_merge( $this->get_default(), $this->get_pro_defaults() );
353 $_settings = $this->database->get( $this->base_key, $_default_settings );
354
355 return $this->get_normalized_values( $_settings, $_default_settings );
356 }
357
358 public function type_validation( &$value, $defaultValue = null ) {
359 if ( $defaultValue !== null ) {
360 /**
361 * Check if value is not in same type
362 */
363 $_default_type = gettype( $defaultValue );
364
365 if ( ! ( is_scalar( $defaultValue ) && is_scalar( $value ) ) && empty( $value ) ) {
366 $value = $defaultValue;
367 }
368
369 settype( $value, $_default_type );
370 }
371 }
372
373 /**
374 * Get settings value by key
375 *
376 * @param string $key
377 * @param mixed $default
378 * @param bool $get_all
379 *
380 * @return mixed
381 * @since 2.5.0
382 *
383 */
384 public function get( $key, $default = null ) {
385 $_default_settings = array_merge( $this->get_default(), $this->get_pro_defaults() );
386 $_settings = $this->database->get( $this->base_key, $_default_settings );
387
388 $_value = $default;
389 switch ( true ) {
390 // Check if it's a PRO Option
391 case ! isset( $_default_settings[$key] ):
392 $_value = $default;
393 break;
394 // Check if it's a FREE Option and not in DB.
395 case ! isset( $_settings[$key] ) && isset( $_default_settings[$key] ):
396 $_value = $default !== null ? $default : $_default_settings[$key];
397 break;
398 // Check if it's a FREE Option
399 case isset( $_settings[$key] ) && isset( $_default_settings[$key] ):
400 $_value = $_settings[$key];
401 break;
402 }
403
404 $_value = $this->get_normalized_value( $key, $_value, isset( $_default_settings[$key] ) ? $_default_settings[$key] : null );
405
406 if ( gettype( $_value ) === 'string' ) {
407 if ( empty( $_value ) && $default != null ) {
408 $_value = $default;
409 } elseif ( empty( $_value ) && $default === null && isset( $_default_settings[$key] ) ) {
410 $_value = $_default_settings[$key];
411 }
412 }
413
414 return $_value;
415 }
416
417 public function get_raw_field( $key, $default = null ) {
418 $_settings = $this->database->get( $this->base_key, [] );
419
420 if ( isset( $_settings[$key] ) ) {
421 return $this->get_normalized_value( $key, $_settings[$key], $default );
422 }
423
424 return $default;
425 }
426
427 public function save( $key, $value ) {
428 $_settings = $this->database->get( $this->base_key, [] );
429 $_settings[$key] = $value;
430
431 return $this->database->save( $this->base_key, $_settings );
432 }
433
434 public function save_settings( $settings ) {
435 $existing_plugins = betterdocs()->kbmigration->knowledge_base_plugins();
436 if ( ! current_user_can( 'edit_docs_settings' ) ) {
437 return new WP_Error( 'unauthorized_action', __( 'You don\'t have any rights for saving settings.', 'betterdocs' ) );
438 }
439
440 $_old_settings = $this->database->get( $this->base_key, $this->get_default() );
441 // @todo: sanitize the data before inject in DB.
442 $_normalized_settings = $this->get_normalized_values( $settings );
443 if ( $existing_plugins && isset( $_normalized_settings['migration_step'] ) && $_normalized_settings['migration_step'] == true ) {
444 betterdocs()->kbmigration->migrate();
445 }
446 $_settings = wp_parse_args( $_normalized_settings, $_old_settings );
447 $_saved = $this->database->save( $this->base_key, $_settings );
448
449 do_action_ref_array( 'betterdocs::settings::saved', [$_saved, $_settings, $_old_settings, &$this] );
450
451 return $_saved;
452 }
453
454 public function views( $hook ) {
455 return betterdocs()->views->get( 'admin/settings' );
456 }
457
458 public function save_default_settings() {
459 $_settings = $this->get_all();
460
461 return $this->database->save( $this->base_key, $_settings );
462 }
463
464 public function get_pages() {
465 $_pages = betterdocs()->query->get_posts( [
466 'post_type' => 'page',
467 'numberposts' => -1,
468 'post_status' => 'publish',
469 'posts_per_page' => -1
470 ] );
471
472 $__pages = [];
473
474 if ( ! empty( $_pages ) ) {
475 $__pages[0] = __( 'Select a Page', 'betterdocs' );
476 foreach ( $_pages->posts as $page ) {
477 $__pages[$page->ID] = esc_html( $page->post_title );
478 }
479 }
480
481 return $__pages;
482 }
483
484 public function settings_args() {
485 $wp_roles = $this->normalize_options( $this->get_roles() );
486
487 $settings = [
488 'id' => 'betterdocs_settings_metabox_wrapper',
489 'title' => __( 'betterdocs', 'betterdocs' ),
490 'object_types' => ['betterdocs'],
491 'context' => 'normal',
492 'priority' => 'high',
493 'show_header' => false,
494 'tabnumber' => false,
495 'is_pro_active' => betterdocs()->is_pro_active(),
496 'logoURL' => betterdocs()->assets->icon( 'betterdocs-icon.svg', true ),
497 'layout' => 'vertical',
498 'config' => [
499 'active' => 'tab-general',
500 'sidebar' => true,
501 'title' => false
502 ],
503 'submit' => [
504 'show' => true,
505 'label' => __( 'Save', 'betterdocs' ),
506 'loadingLabel' => __( 'Saving...', 'betterdocs' ),
507 'class' => 'save-settings',
508 'rules' => Rules::logicalRule( [
509 Rules::is( 'config.active', 'tab-design', true ),
510 Rules::is( 'config.active', 'tab-shortcodes', true ),
511 Rules::is( 'config.active', 'tab-instant-answer', true ),
512 Rules::is( 'config.active', 'tab-import-export', true ),
513 Rules::is( 'config.active', 'tab-migration', true )
514 ], 'and' )
515 ],
516 'values' => $this->get_all(),
517 'tabs' => apply_filters( 'betterdocs_settings_tabs', [
518 'tab-general' => apply_filters( 'betterdocs_settings_tab_general', [
519 'id' => 'tab-general',
520 'label' => __( 'General', 'betterdocs' ),
521 'classes' => 'tab-general',
522 'priority' => 10,
523 'fields' => [
524 'title-general' => [
525 'name' => 'title-general-tab',
526 'type' => 'section',
527 'label' => __( 'General Settings', 'betterdocs' ),
528 'priority' => 10,
529 'fields' => [
530 'multiple_kb' => apply_filters( 'betterdocs_multi_kb_settings', [
531 'name' => 'multiple_kb',
532 'type' => 'toggle',
533 'label' => __( 'Multiple Knowledge Base', 'betterdocs' ),
534 'enable_disable_text_active' => true,
535 'default' => '',
536 'priority' => 1,
537 'is_pro' => true
538 ] ),
539 'builtin_doc_page' => [
540 'name' => 'builtin_doc_page',
541 'type' => 'toggle',
542 'label' => __( 'Built-in Documentation Page', 'betterdocs' ),
543 'enable_disable_text_active' => true,
544 'default' => 1,
545 'priority' => 2
546 ],
547 'breadcrumb_doc_title' => [
548 'name' => 'breadcrumb_doc_title',
549 'type' => 'text',
550 'label' => __( 'Documentation Page Title', 'betterdocs' ),
551 'default' => __( 'Docs', 'betterdocs' ),
552 'priority' => 3,
553 'rules' => Rules::is( 'builtin_doc_page', true )
554 ],
555 'docs_slug' => [
556 'name' => 'docs_slug',
557 'type' => 'text',
558 'label' => __( 'BetterDocs Root Slug', 'betterdocs' ),
559 'default' => 'docs',
560 'priority' => 4,
561 'rules' => Rules::is( 'builtin_doc_page', true )
562 ],
563 'docs_page' => [
564 'name' => 'docs_page',
565 'label' => __( 'Docs Page', 'betterdocs' ),
566 'type' => 'select',
567 'default' => 0,
568 'priority' => 5,
569 'search' => true,
570 'options' => $this->normalize_options( $this->get_pages() ),
571 'label_subtitle' => __( 'You will need to insert BetterDocs Shortcode inside the page. This page will be used as docs permalink.', 'betterdocs' ),
572 'rules' => Rules::is( 'builtin_doc_page', false )
573 ],
574 'category_slug' => [
575 'name' => 'category_slug',
576 'type' => 'text',
577 'label' => __( 'Custom Category Slug', 'betterdocs' ),
578 'default' => 'docs-category',
579 'priority' => 6
580 ],
581 'tag_slug' => [
582 'name' => 'tag_slug',
583 'type' => 'text',
584 'label' => __( 'Custom Tag Slug', 'betterdocs' ),
585 'default' => 'docs-tag',
586 'priority' => 7
587 ],
588 'permalink_structure' => [
589 'name' => 'permalink_structure',
590 'type' => 'permalink_structure',
591 'label' => __( 'Single Docs Permalink', 'betterdocs' ),
592 'default' => PostType::permalink_structure(),
593 'priority' => 9,
594 'tags' => $this->normalize_options( [
595 '%doc_category%' => '%doc_category%',
596 '%knowledge_base%' => '%knowledge_base%'
597 ] ),
598 'label_subtitle' => __( 'Make sure to keep Docs Root Slug in the Single Docs Permalink. You are not able to keep it blank. You can use the available tags from below.', 'betterdocs' )
599 ],
600 'enable_faq_schema' => [
601 'name' => 'enable_faq_schema',
602 'type' => 'toggle',
603 'label' => __( 'FAQ Schema', 'betterdocs' ),
604 'enable_disable_text_active' => true,
605 'default' => '',
606 'priority' => 10
607 ],
608 'analytics_from' => [
609 'name' => 'analytics_from',
610 'type' => 'select',
611 'label' => __( 'Analytics From', 'betterdocs' ),
612 'options' => $this->normalize_options( [
613 'everyone' => __( 'Everyone', 'betterdocs' ),
614 'guests' => __( 'Guests Only', 'betterdocs' ),
615 'registered_users' => __( 'Registered Users Only', 'betterdocs' )
616 ] ),
617 'default' => 'everyone',
618 'priority' => 11,
619 'is_pro' => true
620 ],
621 'unique_visitor_count' => [
622 'name' => 'unique_visitor_count',
623 'type' => 'toggle',
624 'label' => __( 'Unique Visitor Count', 'betterdocs' ),
625 'enable_disable_text_active' => true,
626 'default' => true,
627 'priority' => 12,
628 'is_pro' => true
629 ],
630 'exclude_bot_analytics' => [
631 'name' => 'exclude_bot_analytics',
632 'type' => 'toggle',
633 'label' => __( 'Exclude Bot Analytics', 'betterdocs' ),
634 'enable_disable_text_active' => true,
635 'default' => true,
636 'priority' => 13,
637 'is_pro' => true
638 ]
639 ]
640 ]
641 ]
642 ] ),
643 'tab-layout' => apply_filters( 'betterdocs_settings_tab_layout', [
644 'id' => 'tab-layout',
645 'label' => __( 'Layout', 'betterdocs' ),
646 'classes' => 'tab-layout',
647 'priority' => 20,
648 'fields' => [
649 'title-layout' => [
650 'name' => 'title-layout-tab',
651 'type' => 'section',
652 'label' => __( 'Layout Settings', 'betterdocs' ),
653 'priority' => 20,
654 'fields' => [
655 'tab-sidebar-layout' => apply_filters( 'betterdocs_settings_tab_sidebar_layout', [
656 'id' => 'tab-sidebar-layout',
657 'name' => 'tab_sidebar_layout',
658 'label' => __( 'Layout Settings', 'betterdocs' ),
659 'classes' => 'tab-layout',
660 'type' => "tab",
661 'active' => "layout_documentation_page",
662 'completionTrack' => true,
663 'sidebar' => false,
664 'save' => false,
665 'title' => false,
666 'config' => [
667 'active' => 'layout_documentation_page',
668 'sidebar' => false,
669 'title' => false
670 ],
671 'submit' => [
672 'show' => false
673 ],
674 'step' => [
675 'show' => false
676 ],
677 'priority' => 20,
678 'fields' => [
679 'layout_documentation_page' => [
680 'id' => 'layout_documentation_page',
681 'name' => 'layout_documentation_page',
682 'type' => 'section',
683 'label' => __( 'Documentation Page', 'betterdocs' ),
684 'priority' => 1,
685 'fields' => [
686 'tab-nested-layout-1' => [
687 'id' => 'tab-nested-layout-1',
688 'name' => 'tab_nested_layout_1',
689 'label' => __( 'Documentation Page', 'betterdocs' ),
690 'classes' => 'tab-nested-layout',
691 'type' => "tab",
692 'active' => "layout_documentation_page_general",
693 'completionTrack' => true,
694 'sidebar' => false,
695 'save' => false,
696 'title' => false,
697 'config' => [
698 'active' => 'layout_documentation_page_general',
699 'sidebar' => false,
700 'title' => false
701 ],
702 'submit' => [
703 'show' => false
704 ],
705 'step' => [
706 'show' => false
707 ],
708 'priority' => 1,
709 'fields' => [
710 'layout_documentation_page_general' => [
711 'id' => 'layout_documentation_page_general',
712 'name' => 'layout_documentation_page_general',
713 'type' => 'section',
714 'label' => __( 'General', 'betterdocs' ),
715 'priority' => 1,
716 'fields' => [
717 'category_title_link' => [
718 'name' => 'category_title_link',
719 'type' => 'toggle',
720 'label' => __( 'Category Title Link', 'betterdocs' ),
721 'label_subtitle' => __( 'This setting is applicable for category grid layout', 'betterdocs' ),
722 'enable_disable_text_active' => true,
723 'default' => false,
724 'priority' => 0
725 ],
726 'masonry_layout' => [
727 'name' => 'masonry_layout',
728 'type' => 'toggle',
729 'label' => __( 'Masonry', 'betterdocs' ),
730 'enable_disable_text_active' => true,
731 'default' => 1,
732 'priority' => 1
733 ],
734 'nested_subcategory' => [
735 'name' => 'nested_subcategory',
736 'type' => 'toggle',
737 'label' => __( 'Nested Sub Category', 'betterdocs' ),
738 'enable_disable_text_active' => true,
739 'default' => '',
740 'priority' => 2
741 ],
742 'column_number' => [
743 'name' => 'column_number',
744 'type' => 'number',
745 'label' => __( 'Number Of Columns', 'betterdocs' ),
746 'default' => 3,
747 'priority' => 3
748 ],
749 'posts_number' => apply_filters( 'betterdocs_posts_number', [
750 'name' => 'posts_number',
751 'type' => 'number',
752 'label' => __( 'Number Of Docs', 'betterdocs' ),
753 'label_subtitle' => __( 'This setting is not applicable for handbook layout.', 'betterdocs' ),
754 'default' => 10,
755 'priority' => 4
756 ] ),
757 'post_count' => [
758 'name' => 'post_count',
759 'type' => 'toggle',
760 'label' => __( 'Doc Count', 'betterdocs' ),
761 'enable_disable_text_active' => true,
762 'default' => 1,
763 'priority' => 5
764 ],
765 'count_text' => [
766 'name' => 'count_text',
767 'type' => 'text',
768 'label' => __( 'Count Text', 'betterdocs' ),
769 'default' => __( 'docs', 'betterdocs' ),
770 'priority' => 6
771 ],
772 'count_text_singular' => [
773 'name' => 'count_text_singular',
774 'type' => 'text',
775 'label' => __( 'Count Text Singular', 'betterdocs' ),
776 'default' => __( 'doc', 'betterdocs' ),
777 'priority' => 7
778 ],
779 'exploremore_btn' => [
780 'name' => 'exploremore_btn',
781 'type' => 'toggle',
782 'label' => __( 'Explore More Button', 'betterdocs' ),
783 'enable_disable_text_active' => true,
784 'default' => true,
785 'priority' => 8
786 ],
787 'exploremore_btn_txt' => [
788 'name' => 'exploremore_btn_txt',
789 'type' => 'text',
790 'label' => __( 'Explore More Button Text', 'betterdocs' ),
791 'default' => __( 'Explore More', 'betterdocs' ),
792 'priority' => 9,
793 'rules' => Rules::is( 'exploremore_btn', true )
794 ],
795 'betterdocs_popular_docs_text' => [
796 'name' => 'betterdocs_popular_docs_text',
797 'type' => 'text',
798 'label' => __( 'Popular Docs Text', 'betterdocs' ),
799 'default' => __( 'Popular Docs', 'betterdocs' ),
800 'priority' => 10,
801 "is_pro" => true
802 ],
803 'betterdocs_popular_docs_number' => [
804 'name' => 'betterdocs_popular_docs_number',
805 'type' => 'number',
806 'label' => __( 'Popular Docs Number', 'betterdocs' ),
807 'default' => 10,
808 'priority' => 11,
809 "is_pro" => true
810 ]
811 ]
812 ],
813 'layout_documentation_page_search' => [
814 'id' => 'layout_documentation_page_search',
815 'name' => 'layout_documentation_page_search',
816 'type' => 'section',
817 'label' => __( 'Search', 'betterdocs' ),
818 'priority' => 2,
819 'fields' => [
820 'live_search' => [
821 'name' => 'live_search',
822 'type' => 'toggle',
823 'label' => __( 'Live Search', 'betterdocs' ),
824 'enable_disable_text_active' => true,
825 'default' => 1,
826 'priority' => 1
827 ],
828 'advance_search' => apply_filters( 'betterdocs_advance_search_settings', [
829 'name' => 'advance_search',
830 'type' => 'toggle',
831 'label' => __( 'Advanced Search', 'betterdocs' ),
832 'enable_disable_text_active' => true,
833 'default' => '',
834 'priority' => 2,
835 'is_pro' => true
836 ] ),
837 'child_category_exclude' => apply_filters( 'child_category_exclude', [
838 'name' => 'child_category_exclude',
839 'type' => 'toggle',
840 'label' => __( 'Exclude Child Terms In Category Search', 'betterdocs' ),
841 'enable_disable_text_active' => true,
842 'default' => '',
843 'priority' => 3,
844 'is_pro' => true
845 ] ),
846 'popular_keyword_limit' => apply_filters( 'betterdocs_popular_keyword_limit_settings', [
847 'name' => 'popular_keyword_limit',
848 'type' => 'number',
849 'label' => __( 'Minimum amount of Keywords Search', 'betterdocs' ),
850 'default' => 5,
851 'priority' => 4,
852 'is_pro' => true
853 ] ),
854 'search_letter_limit' => [
855 'name' => 'search_letter_limit',
856 'type' => 'number',
857 'label' => __( 'Minimum Character Limit For Search Result', 'betterdocs' ),
858 'priority' => 5,
859 'default' => 3
860 ],
861 'search_placeholder' => [
862 'name' => 'search_placeholder',
863 'type' => 'text',
864 'label' => __( 'Search Placeholder', 'betterdocs' ),
865 'default' => __( 'Search..', 'betterdocs' ),
866 'priority' => 6
867 ],
868 'search_button_text' => apply_filters( 'betterdocs_search_button_text', [
869 'name' => 'search_button_text',
870 'type' => 'text',
871 'label' => __( 'Search Button Text', 'betterdocs' ),
872 'priority' => 7,
873 'default' => __( 'Search', 'betterdocs' ),
874 'is_pro' => true
875 ] ),
876 'search_not_found_text' => [
877 'name' => 'search_not_found_text',
878 'type' => 'text',
879 'label' => __( 'Search Not Found Text', 'betterdocs' ),
880 'default' => 'Sorry, no docs were found.',
881 'priority' => 8
882 ],
883 'search_result_image' => [
884 'name' => 'search_result_image',
885 'type' => 'toggle',
886 'label' => __( 'Search Result Image', 'betterdocs' ),
887 'enable_disable_text_active' => true,
888 'default' => 1,
889 'priority' => 9
890 ],
891 'kb_based_search' => apply_filters( 'betterdocs_kb_based_search_settings', [
892 'name' => 'kb_based_search',
893 'type' => 'toggle',
894 'label' => __( 'KB Based Search', 'betterdocs' ),
895 'enable_disable_text_active' => true,
896 'default' => '',
897 'priority' => 10,
898 'is_pro' => true,
899 'rules' => Rules::is( 'multiple_kb', true )
900 ] )
901 ]
902 ],
903 'layout_documentation_page_order_by' => [
904 'id' => 'layout_documentation_page_order_by',
905 'name' => 'layout_documentation_page_order_by',
906 'type' => 'section',
907 'label' => __( 'Order By', 'betterdocs' ),
908 'priority' => 3,
909 'fields' => [
910 'terms_orderby' => [
911 'name' => 'terms_orderby',
912 'type' => 'select',
913 'label' => __( 'Terms Order By', 'betterdocs' ),
914 'default' => 'betterdocs_order',
915 'options' => $this->normalize_options( apply_filters( 'betterdocs_terms_orderby_options', [
916 'none' => __( 'No order', 'betterdocs' ),
917 'name' => __( 'Name', 'betterdocs' ),
918 'slug' => __( 'Slug', 'betterdocs' ),
919 'term_group' => __( 'Term Group', 'betterdocs' ),
920 'term_id' => __( 'Term ID', 'betterdocs' ),
921 'id' => __( 'ID', 'betterdocs' ),
922 'description' => __( 'Description', 'betterdocs' ),
923 'parent' => __( 'Parent', 'betterdocs' ),
924 'betterdocs_order' => __( 'BetterDocs Order', 'betterdocs' )
925 ] ) ),
926 'priority' => 1
927 ],
928 'terms_order' => [
929 'name' => 'terms_order',
930 'type' => 'select',
931 'label' => __( 'Terms Order', 'betterdocs' ),
932 'default' => 'ASC',
933 'options' => $this->normalize_options( [
934 'ASC' => 'Ascending',
935 'DESC' => 'Descending'
936 ] ),
937 'priority' => 3
938 ],
939 'alphabetically_order_post' => [
940 'name' => 'alphabetically_order_post',
941 'type' => 'select',
942 'label' => __( 'Docs Order By', 'betterdocs' ),
943 'default' => 'betterdocs_order',
944 'options' => $this->normalize_options( [
945 'none' => __( 'No order', 'betterdocs' ),
946 'ID' => __( 'Docs ID', 'betterdocs' ),
947 'author' => __( 'Docs Author', 'betterdocs' ),
948 'title' => __( 'Title', 'betterdocs' ),
949 'date' => __( 'Date', 'betterdocs' ),
950 'modified' => __( 'Last Modified Date', 'betterdocs' ),
951 'parent' => __( 'Parent Id', 'betterdocs' ),
952 'rand' => __( 'Random', 'betterdocs' ),
953 'comment_count' => __( 'Comment Count', 'betterdocs' ),
954 'menu_order' => __( 'Menu Order', 'betterdocs' ),
955 'betterdocs_order' => __( 'BetterDocs Order', 'betterdocs' )
956 ] ),
957 'priority' => 4
958 ],
959 'docs_order' => [
960 'name' => 'docs_order',
961 'type' => 'select',
962 'label' => __( 'Docs Order', 'betterdocs' ),
963 'default' => 'ASC',
964 'options' => $this->normalize_options( [
965 'ASC' => 'Ascending',
966 'DESC' => 'Descending'
967 ] ),
968 'priority' => 5
969 ]
970 ]
971 ]
972 ]
973 ]
974 ]
975 ],
976 'layout_single_doc' => apply_filters( 'single_doc_setting_section', [
977 'id' => 'layout_single_doc',
978 'name' => 'layout_single_doc',
979 'type' => 'section',
980 'label' => __( 'Single Doc', 'betterdocs' ),
981 'priority' => 2,
982 'fields' => [
983 'tab-nested-layout-2' => [
984 'id' => 'tab-nested-layout-2',
985 'name' => 'tab_nested_layout_2',
986 'label' => __( 'Single Doc', 'betterdocs' ),
987 'classes' => 'tab-nested-layout',
988 'type' => "tab",
989 'active' => "layout_single_doc_general",
990 'completionTrack' => true,
991 'sidebar' => false,
992 'save' => false,
993 'title' => false,
994 'config' => [
995 'active' => 'layout_single_doc_general',
996 'sidebar' => false,
997 'title' => false
998 ],
999 'submit' => [
1000 'show' => false
1001 ],
1002 'step' => [
1003 'show' => false
1004 ],
1005 'priority' => 20,
1006 'fields' => [
1007 'layout_single_doc_general' => [
1008 'id' => 'layout_single_doc_general',
1009 'name' => 'layout_single_doc_general',
1010 'type' => 'section',
1011 'label' => __( 'General', 'betterdocs' ),
1012 'priority' => 5,
1013 'fields' => [
1014 'enable_post_title' => [
1015 'name' => 'enable_post_title',
1016 'type' => 'toggle',
1017 'label' => __( 'Doc Title', 'betterdocs' ),
1018 'enable_disable_text_active' => true,
1019 'default' => 1,
1020 'priority' => 1
1021 ],
1022 'enable_sidebar_cat_list' => [
1023 'name' => 'enable_sidebar_cat_list',
1024 'type' => 'toggle',
1025 'label' => __( 'Sidebar Category List', 'betterdocs' ),
1026 'enable_disable_text_active' => true,
1027 'default' => 1,
1028 'priority' => 2
1029 ],
1030 'enable_print_icon' => [
1031 'name' => 'enable_print_icon',
1032 'type' => 'toggle',
1033 'label' => __( 'Print Icon', 'betterdocs' ),
1034 'enable_disable_text_active' => true,
1035 'default' => 1,
1036 'priority' => 3
1037 ],
1038 'enable_tags' => [
1039 'name' => 'enable_tags',
1040 'type' => 'toggle',
1041 'label' => __( 'Tags', 'betterdocs' ),
1042 'enable_disable_text_active' => true,
1043 'default' => 1,
1044 'priority' => 4
1045 ],
1046 'show_last_update_time' => [
1047 'name' => 'show_last_update_time',
1048 'type' => 'toggle',
1049 'label' => __( 'Last Update Time', 'betterdocs' ),
1050 'enable_disable_text_active' => true,
1051 'default' => 1,
1052 'priority' => 5
1053 ],
1054 'enable_navigation' => [
1055 'name' => 'enable_navigation',
1056 'type' => 'toggle',
1057 'label' => __( 'Navigation', 'betterdocs' ),
1058 'enable_disable_text_active' => true,
1059 'default' => 1,
1060 'priority' => 6
1061 ],
1062 'enable_comment' => [
1063 'name' => 'enable_comment',
1064 'type' => 'toggle',
1065 'label' => __( 'Comment', 'betterdocs' ),
1066 'enable_disable_text_active' => true,
1067 'default' => '',
1068 'priority' => 7
1069 ],
1070 'enable_credit' => [
1071 'name' => 'enable_credit',
1072 'type' => 'toggle',
1073 'label' => __( 'Show Powered by BetterDocs', 'betterdocs' ),
1074 'enable_disable_text_active' => true,
1075 'default' => '',
1076 'priority' => 8
1077 ],
1078 'enable_estimated_reading_time' => [
1079 'name' => 'enable_estimated_reading_time',
1080 'type' => 'toggle',
1081 'label' => __( 'Estimated Reading Time', 'betterdocs' ),
1082 'enable_disable_text_active' => true,
1083 'default' => 0,
1084 'priority' => 9
1085 ],
1086 'reaction_feedback_text' => [
1087 'name' => 'reaction_feedback_text',
1088 'type' => 'text',
1089 'label' => __( 'Reaction Feedback Text', 'betterdocs' ),
1090 'default' => __( 'Thanks for your feedback', 'betterdocs' ),
1091 'priority' => 10,
1092 ],
1093 ]
1094 ],
1095 'layout_single_doc_TOC' => [
1096 'id' => 'layout_single_doc_TOC',
1097 'name' => 'layout_single_doc_TOC',
1098 'type' => 'section',
1099 'label' => __( 'TOC', 'betterdocs' ),
1100 'priority' => 5,
1101 'fields' => [
1102 'enable_toc' => [
1103 'name' => 'enable_toc',
1104 'type' => 'toggle',
1105 'label' => __( 'Table of Contents', 'betterdocs' ),
1106 'enable_disable_text_active' => true,
1107 'default' => 1,
1108 'priority' => 1
1109 ],
1110 'toc_title' => [
1111 'name' => 'toc_title',
1112 'type' => 'text',
1113 'label' => __( 'TOC Title', 'betterdocs' ),
1114 'default' => __( 'Table of Contents', 'betterdocs' ),
1115 'priority' => 2,
1116 'rules' => Rules::is( 'enable_toc', true )
1117
1118 ],
1119 'toc_hierarchy' => [
1120 'name' => 'toc_hierarchy',
1121 'type' => 'toggle',
1122 'label' => __( 'TOC Hierarchy', 'betterdocs' ),
1123 'enable_disable_text_active' => true,
1124 'default' => 1,
1125 'priority' => 3,
1126 'rules' => Rules::is( 'enable_toc', true )
1127 ],
1128 'toc_list_number' => [
1129 'name' => 'toc_list_number',
1130 'type' => 'toggle',
1131 'label' => __( 'TOC List Number', 'betterdocs' ),
1132 'enable_disable_text_active' => true,
1133 'default' => 1,
1134 'priority' => 4,
1135 'rules' => Rules::is( 'enable_toc', true )
1136 ],
1137 'toc_dynamic_title' => [
1138 'name' => 'toc_dynamic_title',
1139 'type' => 'toggle',
1140 'label' => __( 'Show TOC Title in Anchor Links', 'betterdocs' ),
1141 'enable_disable_text_active' => true,
1142 'default' => 0,
1143 'priority' => 5,
1144 'rules' => Rules::is( 'enable_toc', true )
1145 ],
1146 'enable_sticky_toc' => [
1147 'name' => 'enable_sticky_toc',
1148 'type' => 'toggle',
1149 'label' => __( 'Sticky TOC', 'betterdocs' ),
1150 'enable_disable_text_active' => true,
1151 'default' => 1,
1152 'priority' => 6,
1153 'rules' => Rules::is( 'enable_toc', true )
1154 ],
1155 'collapsible_toc_mobile' => [
1156 'name' => 'collapsible_toc_mobile',
1157 'type' => 'toggle',
1158 'label' => __( 'Collapsible TOC on small devices', 'betterdocs' ),
1159 'enable_disable_text_active' => true,
1160 'default' => '',
1161 'priority' => 7,
1162 'rules' => Rules::is( 'enable_toc', true )
1163 ],
1164 'title_link_ctc' => [
1165 'name' => 'title_link_ctc',
1166 'type' => 'toggle',
1167 'label' => __( 'Title Link Copy To Clipboard', 'betterdocs' ),
1168 'enable_disable_text_active' => true,
1169 'default' => 1,
1170 'priority' => 8
1171 ],
1172 'supported_heading_tag' => [
1173 'name' => 'supported_heading_tag',
1174 'label' => __( 'TOC Supported Heading Tag', 'betterdocs' ),
1175 'type' => 'checkbox-select',
1176 'multiple' => true,
1177 'priority' => 10,
1178 'default' => ['1', '2', '3', '4', '5', '6'],
1179 'options' => $this->normalize_options( [
1180 '1' => 'H1',
1181 '2' => 'H2',
1182 '3' => 'H3',
1183 '4' => 'H4',
1184 '5' => 'H5',
1185 '6' => 'H6'
1186 ] ),
1187 'priority' => 9,
1188 'rules' => Rules::is( 'enable_toc', true )
1189 ],
1190 'sticky_toc_offset' => [
1191 'name' => 'sticky_toc_offset',
1192 'type' => 'number',
1193 'label' => __( 'Content Offset', 'betterdocs' ),
1194 'default' => 100,
1195 'priority' => 10,
1196 'label_subtitle' => __( 'content offset from top on scroll.', 'betterdocs' ),
1197 'rules' => Rules::is( 'enable_toc', true )
1198 ]
1199 ]
1200 ],
1201 'layout_single_doc_breadcrumb' => [
1202 'id' => 'layout_single_doc_breadcrumb',
1203 'name' => 'layout_single_doc_breadcrumb',
1204 'type' => 'section',
1205 'label' => __( 'Breadcrumb', 'betterdocs' ),
1206 'priority' => 5,
1207 'fields' => [
1208 'enable_breadcrumb' => [
1209 'name' => 'enable_breadcrumb',
1210 'type' => 'toggle',
1211 'label' => __( 'Breadcrumb', 'betterdocs' ),
1212 'enable_disable_text_active' => true,
1213 'default' => 1,
1214 'priority' => 1
1215 ],
1216 'breadcrumb_home_text' => [
1217 'name' => 'breadcrumb_home_text',
1218 'type' => 'text',
1219 'label' => __( 'Breadcrumb Home Text', 'betterdocs' ),
1220 'default' => __( 'Home', 'betterdocs' ),
1221 'priority' => 2,
1222 'rules' => Rules::is( 'enable_breadcrumb', true )
1223 ],
1224 'breadcrumb_home_url' => [
1225 'name' => 'breadcrumb_home_url',
1226 'type' => 'text',
1227 'label' => __( 'Breadcrumb Home URL', 'betterdocs' ),
1228 'priority' => 3,
1229 'default' => get_home_url(),
1230 'rules' => Rules::is( 'enable_breadcrumb', true )
1231 ],
1232 'enable_breadcrumb_category' => [
1233 'name' => 'enable_breadcrumb_category',
1234 'type' => 'toggle',
1235 'label' => __( 'Category on Breadcrumb', 'betterdocs' ),
1236 'enable_disable_text_active' => true,
1237 'default' => 1,
1238 'priority' => 4,
1239 'rules' => Rules::is( 'enable_breadcrumb', true )
1240 ],
1241 'enable_breadcrumb_title' => [
1242 'name' => 'enable_breadcrumb_title',
1243 'type' => 'toggle',
1244 'label' => __( 'Title on Breadcrumb', 'betterdocs' ),
1245 'enable_disable_text_active' => true,
1246 'default' => 1,
1247 'priority' => 5,
1248 'rules' => Rules::is( 'enable_breadcrumb', true )
1249 ]
1250 ]
1251 ],
1252 'layout_single_doc_email_feedback' => [
1253 'id' => 'layout_single_doc_email_feedback',
1254 'name' => 'layout_single_doc_email_feedback',
1255 'type' => 'section',
1256 'label' => __( 'Email Feedback', 'betterdocs' ),
1257 'priority' => 5,
1258 'fields' => [
1259 'email_feedback' => [
1260 'name' => 'email_feedback',
1261 'type' => 'toggle',
1262 'label' => __( 'Email Feedback', 'betterdocs' ),
1263 'enable_disable_text_active' => true,
1264 'default' => 1,
1265 'priority' => 1
1266 ],
1267 'feedback_link_text' => [
1268 'name' => 'feedback_link_text',
1269 'type' => 'text',
1270 'label' => __( 'Feedback Link Text', 'betterdocs' ),
1271 'default' => __( 'Still stuck? How can we help?', 'betterdocs' ),
1272 'priority' => 2,
1273 'rules' => Rules::is( 'email_feedback', true )
1274 ],
1275 'feedback_form_title' => [
1276 'name' => 'feedback_form_title',
1277 'type' => 'text',
1278 'label' => __( 'Feedback Form Title', 'betterdocs' ),
1279 'default' => __( 'Still stuck? How can we help?', 'betterdocs' ),
1280 'priority' => 3,
1281 'rules' => Rules::is( 'email_feedback', true )
1282 ],
1283 'email_address' => [
1284 'name' => 'email_address',
1285 'type' => 'text',
1286 'label' => __( 'Email Address', 'betterdocs' ),
1287 'default' => get_option( 'admin_email' ),
1288 'priority' => 4,
1289 'label_subtitle' => __( 'The email address where the Feedback form will be sent', 'betterdocs' ),
1290 'rules' => Rules::is( 'email_feedback', true )
1291 ],
1292 'feedback_url' => [
1293 'name' => 'feedback_url',
1294 'type' => 'text',
1295 'label' => __( 'Feedback URL', 'betterdocs' ),
1296 'default' => '',
1297 'priority' => 5,
1298 'rules' => Rules::is( 'email_feedback', true )
1299 ]
1300 ]
1301 ],
1302 [
1303 'id' => 'layout_single_doc_attachments',
1304 'name' => 'layout_single_doc_attachments',
1305 'type' => 'section',
1306 'label' => __( 'Attachments', 'betterdocs-pro' ),
1307 'priority' => 6,
1308 'fields' => apply_filters( 'betterdocs_single_doc_attachments', [
1309 'show_attachment' => [
1310 'name' => 'show_attachment',
1311 'type' => 'toggle',
1312 'is_pro' => true,
1313 'priority' => 1,
1314 'label' => __( 'Show Attachment', 'betterdocs-pro' ),
1315 'enable_disable_text_active' => true,
1316 'default' => false
1317 ]
1318 ] )
1319 ],
1320 [
1321 'id' => 'layout_single_doc_related_docs',
1322 'name' => 'layout_single_doc_related_docs',
1323 'type' => 'section',
1324 'label' => __( 'Related Docs', 'betterdocs-pro' ),
1325 'priority' => 7,
1326 'fields' => apply_filters( 'betterdocs_single_doc_related_docs', [
1327 'show_related_docs' => [
1328 'name' => 'show_related_docs',
1329 'type' => 'toggle',
1330 'is_pro' => true,
1331 'priority' => 1,
1332 'label' => __( 'Show Related Docs', 'betterdocs-pro' ),
1333 'enable_disable_text_active' => true,
1334 'default' => false
1335 ]
1336 ] )
1337 ]
1338 ]
1339 ]
1340 ]
1341 ] ),
1342 'layout_archive_page' => [
1343 'id' => 'layout_archive_page',
1344 'name' => 'layout_archive_page',
1345 'type' => 'section',
1346 'label' => __( 'Archive Page', 'betterdocs' ),
1347 'priority' => 3,
1348 'fields' => [
1349 'enable_archive_sidebar' => [
1350 'name' => 'enable_archive_sidebar',
1351 'type' => 'toggle',
1352 'label' => __( 'Sidebar Category List', 'betterdocs' ),
1353 'enable_disable_text_active' => true,
1354 'default' => 1,
1355 'priority' => 31
1356 ],
1357 'archive_nested_subcategory' => [
1358 'name' => 'archive_nested_subcategory',
1359 'type' => 'toggle',
1360 'label' => __( 'Nested Subcategory', 'betterdocs' ),
1361 'enable_disable_text_active' => true,
1362 'default' => 1,
1363 'priority' => 32
1364 ]
1365 ]
1366 ]
1367 ]
1368 ] )
1369 ]
1370 ]
1371 ]
1372 ] ),
1373 'tab-design' => apply_filters( 'betterdocs_settings_tab_design', [
1374 'id' => 'tab-design',
1375 'label' => __( 'Design', 'betterdocs' ),
1376 'priority' => 30,
1377 'fields' => [
1378 'title-design' => [
1379 'name' => 'title-design-tab',
1380 'type' => 'section',
1381 'label' => __( 'Design', 'betterdocs' ),
1382 'priority' => 30,
1383 'fields' => [
1384 'customizer_link' => [
1385 'name' => 'customizer_link',
1386 'type' => 'action',
1387 'action' => 'betterdocs_settings_customizer_link',
1388 'label' => __( 'Customize BetterDocs', 'betterdocs' ),
1389 'url' => $this->customizer_link(),
1390 'customizer_img' => betterdocs()->assets->icon( 'customizer/betterdocs-customize.png', true ),
1391 'priority' => 1
1392 ]
1393 ]
1394 ]
1395 ]
1396 ] ),
1397 'tab-shortcodes' => apply_filters( 'betterdocs_settings_tab_shortcodes', [
1398 'label' => __( 'Shortcodes', 'betterdocs' ),
1399 'id' => 'tab-shortcodes',
1400 'classes' => 'tab-shortcodes',
1401 'priority' => 40,
1402 'fields' => [
1403 'title-shortcodes' => [
1404 'name' => 'title-shortcodes-tab',
1405 'type' => 'section',
1406 'label' => __( 'Shortcodes', 'betterdocs' ),
1407 'priority' => 40,
1408 'searchable' => true,
1409 'searchPlaceholder' => __( 'Search for shortcode', 'betterdocs' ),
1410 'searchNotFoundMessage' => '<img src="' . betterdocs()->assets->icon( 'not-found.svg', true ) . '"/><p>' . __( 'No Shortcodes Found with these keywords', 'betterdocs' ) . '</p>',
1411 'fields' => apply_filters( 'betterdocs_shortcode_fields', [
1412 'search_form' => [
1413 'name' => 'search_form',
1414 'type' => 'copy-to-clipboard',
1415 'label' => __( 'Search Form', 'betterdocs' ),
1416 'default' => '[betterdocs_search_form]',
1417 'readOnly' => true,
1418 'priority' => 1,
1419 'description' => __( '[betterdocs_search_form placeholder="Search..." heading="Heading" subheading="Subheading" category_search="true" search_button="true" popular_search="true"]', 'betterdocs' ),
1420 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1421 'descriptionCopyable' => true
1422 ],
1423 'feedback_form' => [
1424 'name' => 'feedback_form',
1425 'type' => 'copy-to-clipboard',
1426 'label' => __( 'Feedback Form', 'betterdocs' ),
1427 'default' => '[betterdocs_feedback_form]',
1428 'readOnly' => true,
1429 'priority' => 2,
1430 'description' => __( '[betterdocs_feedback_form button_text="Send"]', 'betterdocs' ),
1431 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1432 'descriptionCopyable' => true
1433 ],
1434 'category_grid' => [
1435 'name' => 'category_grid',
1436 'type' => 'copy-to-clipboard',
1437 'label' => __( 'Category Grid- Layout 1', 'betterdocs' ),
1438 'default' => '[betterdocs_category_grid]',
1439 'readOnly' => true,
1440 'priority' => 3,
1441 'description' => __( '[betterdocs_category_grid post_counter="true" show_icon="true" masonry="true" column="3" posts_per_page="5" nested_subcategory="true" terms="term_ID, term_ID" terms_orderby="" terms_order="" multiple_knowledge_base="" kb_slug="" title_tag="h2" orderby="" order="" ]', 'betterdocs' ),
1442 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1443 'descriptionCopyable' => true
1444 ],
1445 'category_box' => [
1446 'name' => 'category_box',
1447 'type' => 'copy-to-clipboard',
1448 'label' => __( 'Category Box- Layout 2', 'betterdocs' ),
1449 'default' => '[betterdocs_category_box]',
1450 'readOnly' => true,
1451 'priority' => 4,
1452 'description' => __( '[betterdocs_category_box orderby="" column="" nested_subcategory="" terms="" terms_orderby="" show_icon="" kb_slug="" title_tag="h2" multiple_knowledge_base="false" border_bottom="false"]', 'betterdocs' ),
1453 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1454 'descriptionCopyable' => true
1455 ],
1456 'category_list' => [
1457 'name' => 'category_list',
1458 'type' => 'copy-to-clipboard',
1459 'label' => __( 'Category List', 'betterdocs' ),
1460 'default' => '[betterdocs_category_list]',
1461 'readOnly' => true,
1462 'priority' => 5,
1463 'description' => __( '[betterdocs_category_list orderby="" order="" posts_per_page="" nested_subcategory="" terms="" terms_orderby="" terms_order="" kb_slug="" multiple_knowledge_base="false" title_tag="h2"]', 'betterdocs' ),
1464 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1465 'descriptionCopyable' => true
1466 ],
1467 'faq_modern_layout' => [
1468 'name' => 'faq_modern_layout',
1469 'type' => 'copy-to-clipboard',
1470 'label' => __( 'FAQ Layout - 1', 'betterdocs' ),
1471 'default' => '[betterdocs_faq_list_modern]',
1472 'readOnly' => true,
1473 'priority' => 13,
1474 'description' => __( '[betterdocs_faq_list_modern groups="group_id" class="" group_exclude="group_id" faq_heading="Frequently Asked Questions"]', 'betterdocs' ),
1475 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1476 'descriptionCopyable' => true
1477 ],
1478 'faq_classic_layout' => [
1479 'name' => 'faq_classic_layout',
1480 'type' => 'copy-to-clipboard',
1481 'label' => __( 'FAQ Layout - 2', 'betterdocs' ),
1482 'default' => '[betterdocs_faq_list_classic]',
1483 'readOnly' => true,
1484 'priority' => 14,
1485 'description' => __( '[betterdocs_faq_list_classic groups="group_id" class="" group_exclude="group_id" faq_heading="Frequently Asked Questions"]', 'betterdocs' ),
1486 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1487 'descriptionCopyable' => true
1488 ]
1489 ] )
1490 ]
1491 ]
1492 ] ),
1493 'tab-advance-settings' => apply_filters( 'betterdocs_settings_tab_advance', [
1494 'id' => 'tab-advance-settings',
1495 'label' => __( 'Advanced Settings', 'betterdocs' ),
1496 'priority' => 50,
1497 'fields' => [
1498 'title-advance-settings' => [
1499 'name' => 'title-advance-settings-tab',
1500 'type' => 'section',
1501 'label' => __( 'Advanced Settings', 'betterdocs' ),
1502 'priority' => 50,
1503 'fields' => apply_filters( 'betterdocs_internal_kb_fields', [
1504 'article_roles' => [
1505 'name' => 'article_roles',
1506 'type' => 'checkbox-select',
1507 'label' => __( 'Who Can Write Docs?', 'betterdocs' ),
1508 'priority' => 1,
1509 'multiple' => true,
1510 'search' => true,
1511 'is_pro' => true,
1512 'default' => ['administrator'],
1513 'options' => $wp_roles
1514 ],
1515 'settings_roles' => [
1516 'name' => 'settings_roles',
1517 'type' => 'checkbox-select',
1518 'label' => __( 'Who Can Edit Settings?', 'betterdocs' ),
1519 'priority' => 2,
1520 'multiple' => true,
1521 'is_pro' => true,
1522 'search' => true,
1523 'default' => ['administrator'],
1524 'options' => $wp_roles
1525 ],
1526 'analytics_roles' => [
1527 'name' => 'analytics_roles',
1528 'type' => 'checkbox-select',
1529 'label' => __( 'Who Can Check Analytics?', 'betterdocs' ),
1530 'priority' => 3,
1531 'multiple' => true,
1532 'is_pro' => true,
1533 'search' => true,
1534 'default' => ['administrator'],
1535 'options' => $wp_roles
1536 ],
1537 'enable_content_restriction' => [
1538 'name' => 'enable_content_restriction',
1539 'type' => 'toggle',
1540 'is_pro' => true,
1541 'priority' => 4,
1542 'label' => __( 'Internal Knowledge Base', 'betterdocs' ),
1543 'enable_disable_text_active' => true,
1544 'default' => ['all']
1545 ],
1546 'content_visibility' => [
1547 'name' => 'content_visibility',
1548 'type' => 'checkbox-select',
1549 'label' => __( 'Restrict Access to', 'betterdocs' ),
1550 'label_subtitle' => __( 'Only selected User Roles will be able to view your Knowledge Base', 'betterdocs' ),
1551 'is_pro' => true,
1552 'priority' => 5,
1553 'multiple' => true,
1554 'search' => true,
1555 'default' => ['all'],
1556 'placeholder' => __( 'Select any', 'betterdocs' ),
1557 'options' => $this->normalize_options( array_merge( [
1558 'all' => __( 'All logged in users', 'betterdocs' )
1559 ], wp_roles()->role_names ) ),
1560 'rules' => Rules::is( 'enable_content_restriction', true ),
1561 'filterValue' => 'all'
1562 ],
1563 'restrict_template' => [
1564 'name' => 'restrict_template',
1565 'type' => 'checkbox-select',
1566 'label' => __( 'Restriction on Docs', 'betterdocs' ),
1567 'label_subtitle' => __( 'Selected Docs pages will be restricted', 'betterdocs' ),
1568 'is_pro' => true,
1569 'priority' => 6,
1570 'multiple' => true,
1571 'search' => true,
1572 'default' => ['all'],
1573 'placeholder' => __( 'Select any', 'betterdocs' ),
1574 'options' => $this->get_texanomy(),
1575 'rules' => Rules::is( 'enable_content_restriction', true ),
1576 'filterValue' => 'all'
1577 ],
1578 'restrict_category' => [
1579 'name' => 'restrict_category',
1580 'type' => 'checkbox-select',
1581 'label' => __( 'Restriction on Docs Categories', 'betterdocs' ),
1582 'label_subtitle' => __( 'Selected Docs categories will be restricted', 'betterdocs' ),
1583 'is_pro' => true,
1584 'priority' => 7,
1585 'multiple' => true,
1586 'search' => true,
1587 'default' => ['all'],
1588 'placeholder' => __( 'Select any', 'betterdocs' ),
1589 'options' => $this->get_terms( 'doc_category' ),
1590 'rules' => Rules::is( 'enable_content_restriction', true ),
1591 'filterValue' => 'all'
1592 ],
1593 'restricted_redirect_url' => [
1594 'name' => 'restricted_redirect_url',
1595 'type' => 'text',
1596 'label' => __( 'Redirect URL', 'betterdocs' ),
1597 'label_subtitle' => __( 'Set a custom URL to redirect users without permissions when they try to access internal knowledge base. By default, restricted content will redirect to the "404 not found" page', 'betterdocs' ),
1598 'default' => '',
1599 'placeholder' => 'https://',
1600 'is_pro' => true,
1601 'priority' => 9,
1602 'rules' => Rules::is( 'enable_content_restriction', true )
1603 ]
1604 ] )
1605 ]
1606 ]
1607 ] ),
1608 'tab-email-reporting' => apply_filters( 'betterdocs_settings_tab_email_reporting', [
1609 'id' => 'tab-email-reporting',
1610 'label' => __( 'Email Reporting', 'betterdocs' ),
1611 'priority' => 60,
1612 'fields' => [
1613 'title-email-reporting' => [
1614 'name' => 'title-email-reporting-tab',
1615 'type' => 'section',
1616 'label' => __( 'Email Reporting', 'betterdocs' ),
1617 'priority' => 60,
1618 'fields' => [
1619 'enable_reporting' => [
1620 'name' => 'enable_reporting',
1621 'label' => __( 'Email Reporting', 'betterdocs' ),
1622 'enable_disable_text_active' => true,
1623 'type' => 'toggle',
1624 'priority' => 1,
1625 'default' => 0
1626 ],
1627 'reporting_frequency' => apply_filters( 'betterdocs_reporting_frequency_settings', [
1628 'name' => 'reporting_frequency',
1629 'type' => 'select',
1630 'label' => __( 'Reporting Frequency', 'betterdocs' ),
1631 'default' => 'betterdocs_weekly',
1632 'priority' => 2,
1633 'is_pro' => true,
1634 'options' => $this->normalize_options( [
1635 'betterdocs_daily' => __( 'Once Daily', 'betterdocs' ),
1636 'betterdocs_weekly' => __( 'Once Weekly', 'betterdocs' ),
1637 'betterdocs_monthly' => __( 'Once Monthly', 'betterdocs' )
1638 ] ),
1639 'rules' => Rules::is( 'enable_reporting', true )
1640 ] ),
1641 'reporting_day' => [
1642 'name' => 'reporting_day',
1643 'type' => 'select',
1644 'label' => __( 'Reporting Day', 'betterdocs' ),
1645 'default' => 'monday',
1646 'rules' => Rules::logicalRule( [
1647 Rules::is( 'enable_reporting', true ),
1648 Rules::is( 'reporting_frequency', 'betterdocs_weekly' )
1649 ], 'and' ),
1650 'priority' => 3,
1651 'options' => $this->normalize_options( [
1652 'sunday' => __( 'Sunday', 'betterdocs' ),
1653 'monday' => __( 'Monday', 'betterdocs' ),
1654 'tuesday' => __( 'Tuesday', 'betterdocs' ),
1655 'wednesday' => __( 'Wednesday', 'betterdocs' ),
1656 'thursday' => __( 'Thursday', 'betterdocs' ),
1657 'friday' => __( 'Friday', 'betterdocs' ),
1658 'saturday' => __( 'Saturday', 'betterdocs' )
1659 ] ),
1660 'label_subtitle' => __( 'This is only applicable for the “Weekly” report', 'betterdocs' )
1661 ],
1662 'select_reporting_data' => apply_filters( 'betterdocs_select_reporting_data_settings', [
1663 'name' => 'select_reporting_data',
1664 'type' => 'checkbox-select',
1665 'label' => __( 'Select Reporting Data', 'betterdocs' ),
1666 'priority' => 4,
1667 'multiple' => true,
1668 'options' => $this->normalize_options( [
1669 'overview' => 'Overview',
1670 'top-docs' => 'Top Docs',
1671 'most-search' => 'Most Searched Keywords'
1672 ] ),
1673 'default' => ['overview', 'top-docs', 'most-search'],
1674 'is_pro' => true,
1675 'rules' => Rules::is( 'enable_reporting', true )
1676 ] ),
1677 'reporting_email' => [
1678 'name' => 'reporting_email',
1679 'type' => 'text',
1680 'label' => __( 'Reporting Email', 'betterdocs' ),
1681 'default' => get_option( 'admin_email' ),
1682 'priority' => 5,
1683 'rules' => Rules::is( 'enable_reporting', true )
1684 ],
1685 'reporting_subject' => apply_filters( 'betterdocs_reporting_subject_settings', [
1686 'name' => 'reporting_subject',
1687 'type' => 'textarea',
1688 'label' => __( 'Reporting Email Subject', 'betterdocs' ),
1689 'default' => wp_sprintf( __( 'Your Documentation Performance of %s Website', 'betterdocs' ), get_bloginfo( 'name' ) ),
1690 'priority' => 6,
1691 'is_pro' => true,
1692 'rules' => Rules::is( 'enable_reporting', true )
1693 ] ),
1694 'test_report' => [
1695 'name' => 'test_report',
1696 'label' => __( 'Reporting Test', 'betterdocs' ),
1697 'text' => __( 'Test Report', 'betterdocs' ),
1698 'type' => 'button',
1699 'priority' => 7,
1700 'rules' => Rules::is( 'enable_reporting', true ),
1701 'ajax' => [
1702 'on' => 'click',
1703 'api' => '/betterdocs/v1/reporting-test',
1704 'data' => [
1705 'enable_reporting' => '@enable_reporting',
1706 'select_reporting_data' => '@select_reporting_data',
1707 'reporting_subject' => '@reporting_subject',
1708 'reporting_email' => '@reporting_email',
1709 'reporting_day' => '@reporting_day',
1710 'reporting_frequency' => '@reporting_frequency'
1711 ],
1712 'swal' => [
1713 'text' => __( 'Successfully Sent a Test Report in Your Email.', 'betterdocs' ),
1714 'icon' => 'success',
1715 'autoClose' => 2000
1716 ]
1717 ]
1718 ]
1719 ]
1720 ]
1721 ]
1722 ] ),
1723 'tab-instant-answer' => apply_filters( 'betterdocs_settings_tab_instant_answer', [
1724 'id' => 'tab-instant-answer',
1725 'name' => 'tab-instant-answer',
1726 'type' => 'section',
1727 'label' => __( 'Instant Answer', 'betterdocs' ),
1728 'save' => false,
1729 'priority' => 70,
1730 'fields' => [
1731 'title-instant-answer' => [
1732 'name' => 'title-instant-answer-tab',
1733 'type' => 'section',
1734 'label' => __( 'Instant Answer', 'betterdocs' ),
1735 'priority' => 80,
1736 'save' => false,
1737 'showSubmit' => false,
1738 'fields' => apply_filters( 'betterdocs_instant_answer_fields', [
1739 'enable_disable_wrapper' => [
1740 'name' => 'enable_disable_wrapper',
1741 'type' => 'section',
1742 'priority' => 0,
1743 'save' => false,
1744 'fields' => [
1745 'enable_disable' => [
1746 'name' => 'enable_disable',
1747 'type' => 'toggle',
1748 'priority' => 100,
1749 'description' => __( 'Enable Instant Answer', 'betterdocs' ),
1750 'enable_disable_text_active' => false,
1751 'default' => true,
1752 'is_pro' => true
1753 ]
1754 ]
1755 ]
1756 ] )
1757 ]
1758 ]
1759 ] ),
1760 'tab-ai-autowrite' => [
1761 'id' => 'tab-ai-autowrite',
1762 'name' => 'tab-ai-autowrite',
1763 'type' => 'section',
1764 'label' => __( 'Write with AI', 'betterdocs' ),
1765 'priority' => 75,
1766 'fields' => [
1767 'title-ai-autowrite' => apply_filters( 'betterdocs_settings_ai_autowrite_fields', [
1768 'name' => 'title-ai-autowrite-tab',
1769 'type' => 'section',
1770 'label' => __( 'Write with AI', 'betterdocs' ),
1771 'priority' => 60,
1772 'fields' => [
1773 'enable_write_with_ai' => [
1774 'name' => 'enable_write_with_ai',
1775 'type' => 'toggle',
1776 'priority' => 0,
1777 'label' => __( 'Write Docs with AI', 'betterdocs' ),
1778 'label_subtitle' => __( 'Generate AI based Documentation in your Gutenberg Editor', 'betterdocs' ),
1779 'enable_disable_text_active' => true,
1780 'default' => true
1781 ],
1782 'enable_faq_write_with_ai' => [
1783 'name' => 'enable_faq_write_with_ai',
1784 'type' => 'toggle',
1785 'priority' => 5,
1786 'label' => __( 'Write FAQ with AI', 'betterdocs' ),
1787 'label_subtitle' => __( 'Generate AI based FAQ in your Editor', 'betterdocs' ),
1788 'enable_disable_text_active' => true,
1789 'default' => true
1790 ],
1791 'ai_autowrite_api_key' => [
1792 'name' => 'ai_autowrite_api_key',
1793 'type' => 'text',
1794 'label' => __( 'API Key', 'betterdocs' ),
1795 'label_subtitle' => __( 'Check out this <a target="_blank" href="' . esc_url( 'https://betterdocs.co/docs/write-with-ai/' ) . '">documentation</a> to find out to generate your OpenAI API Key', 'betterdocs' ),
1796 'default' => '',
1797 'priority' => 10
1798 ],
1799 'ai_autowrite_max_token' => [
1800 'name' => 'ai_autowrite_max_token',
1801 'type' => 'number',
1802 'label' => __( 'Set Max Tokens', 'betterdocs' ),
1803 'label_subtitle' => __( 'Documentation will be generated based on the Token Limits you have set. For more information on Token Limits, you can check out this <a target="_blank" href="' . esc_url( 'https://platform.openai.com/account/limits' ) . '">link</a>.', 'betterdocs' ),
1804 'default' => 1500,
1805 'priority' => 15
1806 ]
1807 ]
1808 ] )
1809 ]
1810 ]
1811 ] )
1812 ];
1813
1814 return apply_filters( 'betterdocs_settings_args', $settings );
1815 }
1816
1817 public function import_export_settings( $settings ) {
1818 if ( ! current_user_can( 'import' ) ) {
1819 return $settings;
1820 }
1821
1822 $settings['tab-import-export'] = apply_filters( 'betterdocs_settings_tab_import_export', [
1823 'id' => 'tab-import-export',
1824 'name' => 'tab-import-export',
1825 'classes' => 'tab-import-export',
1826 'label' => __( 'Import / Export', 'betterdocs' ),
1827 'priority' => 80,
1828 'fields' => [
1829 'sections-import-export' => [
1830 'name' => 'sections-import-export',
1831 'type' => 'section',
1832 'label' => __( 'Import / Export', 'betterdocs' ),
1833 'priority' => 30,
1834 'fields' => [
1835 'all-tab-import-export' => [
1836 'id' => 'all-tab-import-export',
1837 'name' => 'all-tab-import-export',
1838 'label' => __( 'Import Export Settings', 'betterdocs' ),
1839 'classes' => 'tab-layout',
1840 'type' => "tab",
1841 'active' => "import",
1842 'completionTrack' => true,
1843 'sidebar' => false,
1844 'save' => false,
1845 'title' => false,
1846 'config' => [
1847 'active' => 'import',
1848 'sidebar' => false,
1849 'title' => false
1850 ],
1851 'submit' => [
1852 'show' => false
1853 ],
1854 'step' => [
1855 'show' => false
1856 ],
1857 'priority' => 20,
1858 'fields' => [
1859 'import' => [
1860 'id' => 'import',
1861 'name' => 'import',
1862 'type' => 'section',
1863 'label' => __( 'Import', 'betterdocs' ),
1864 'priority' => 1,
1865 'fields' => [
1866 'import_tab_nested' => [
1867 'id' => 'import_tab_nested',
1868 'name' => 'import_tab_nested',
1869 'label' => __( 'Import', 'betterdocs' ),
1870 'classes' => 'tab-nested-layout',
1871 'type' => "tab",
1872 'active' => "import_docs_nested",
1873 'completionTrack' => true,
1874 'sidebar' => false,
1875 'save' => false,
1876 'title' => false,
1877 'config' => [
1878 'active' => 'import_docs_nested',
1879 'sidebar' => false,
1880 'title' => false
1881 ],
1882 'submit' => [
1883 'show' => false
1884 ],
1885 'step' => [
1886 'show' => false
1887 ],
1888 'priority' => 1,
1889 'fields' => [
1890 'import_docs_nested' => [
1891 'id' => 'import_docs_nested',
1892 'name' => 'import_docs_nested',
1893 'type' => 'section',
1894 'label' => __( 'Import Docs', 'betterdocs' ),
1895 'priority' => 1,
1896 'fields' => [
1897 'import_docs' => [
1898 'name' => 'import_docs',
1899 'type' => 'importerupload',
1900 'label' => __( 'Import Docs', 'betterdocs' ),
1901 'label_subtitle' => wp_sprintf( __( 'To import your Docs, please upload the .xml / .csv file here. <a href="%1$s">Download sample csv file</a>', 'betterdocs' ), betterdocs()->assets->icon( 'BetterDocs-sample-data.csv', true ) ),
1902 'text' => [
1903 'normal' => __( 'Proceed', 'betterdocs' ),
1904 'saved' => __( 'Proceed', 'betterdocs' ),
1905 'loading' => __( 'Importing...', 'betterdocs' ),
1906 'exists_notice' => __( 'It seems like documentations with same slugs already exist on your website. What would you like to do?', 'betterdocs' )
1907 ],
1908 'ajax' => [
1909 'on' => 'click',
1910 'api' => '/betterdocs/v1/import-docs',
1911 'swal' => [
1912 'text' => __( 'Import completed successfully.', 'betterdocs' ),
1913 'icon' => 'success',
1914 'autoClose' => 2000
1915 ]
1916 ],
1917 'file_type' => '.xml, .csv',
1918 'priority' => 1
1919 ]
1920 ]
1921 ],
1922
1923 'import_settings_nested' => [
1924 'id' => 'import_settings_nested',
1925 'name' => 'import_settings_nested',
1926 'type' => 'section',
1927 'label' => __( 'Import Settings', 'betterdocs' ),
1928 'priority' => 1,
1929 'fields' => [
1930 'settings_importer' => [
1931 'name' => 'settings_importer',
1932 'type' => 'settingsuploader',
1933 'label' => __( 'Import Settings', 'notificationx' ),
1934 'label_subtitle' => __( 'To import BetterDocs Settings, please upload BetterDocs settings you have exported from another website in .json format', 'betterdocs' ),
1935 'reset' => __( 'Change', 'notificationx' ),
1936 'priority' => 1
1937 ],
1938 'import_settings' => [
1939 'name' => 'import_settings',
1940 'type' => 'button',
1941 'rules' => Rules::is( 'settings_importer', null, true ),
1942 'text' => [
1943 'normal' => __( 'Proceed', 'betterdocs' ),
1944 'saved' => __( 'Proceed', 'betterdocs' ),
1945 'loading' => __( 'Importing...', 'betterdocs' )
1946 ],
1947 'ajax' => [
1948 'on' => 'click',
1949 'api' => '/betterdocs/v1/import-settings',
1950 'data' => [
1951 'settings' => '@settings_importer'
1952 ],
1953 'swal' => [
1954 'text' => __( 'Import completed successfully.', 'betterdocs' ),
1955 'icon' => 'success',
1956 'autoClose' => 1000
1957 ],
1958 'reload' => true
1959 ],
1960 'priority' => 2
1961 ]
1962 ]
1963 ]
1964 ]
1965 ]
1966 ]
1967 ],
1968 'export' => [
1969 'id' => 'export',
1970 'name' => 'export',
1971 'type' => 'section',
1972 'label' => __( 'Export', 'betterdocs' ),
1973 'priority' => 1,
1974 'fields' => [
1975 'export_tab_nested' => [
1976 'id' => 'export_tab_nested',
1977 'name' => 'export_tab_nested',
1978 'label' => __( 'Export', 'betterdocs' ),
1979 'classes' => 'tab-nested-layout',
1980 'type' => "tab",
1981 'active' => "export_docs_nested",
1982 'completionTrack' => true,
1983 'sidebar' => false,
1984 'save' => false,
1985 'title' => false,
1986 'config' => [
1987 'active' => 'export_docs_nested',
1988 'sidebar' => false,
1989 'title' => false
1990 ],
1991 'submit' => [
1992 'show' => false
1993 ],
1994 'step' => [
1995 'show' => false
1996 ],
1997 'priority' => 1,
1998 'fields' => [
1999 'export_docs_nested' => [
2000 'id' => 'export_docs_nested',
2001 'name' => 'export_docs_nested',
2002 'type' => 'section',
2003 'label' => __( 'Export Docs', 'betterdocs' ),
2004 'priority' => 1,
2005 'fields' => apply_filters( 'betterdocs_export_fields', [
2006 'export_type' => [
2007 'name' => 'export_type',
2008 'label' => __( 'Select Docs Type', 'betterdocs' ),
2009 'label_subtitle' => __( 'Choose an export type: All Docs, a specific Knowledge Base, or a Doc Category', 'betterdocs' ),
2010 'type' => 'select',
2011 'default' => 'docs',
2012 'priority' => 3,
2013 'search' => true,
2014 'options' => $this->normalize_options( apply_filters( 'betterdocs_export_type_options', [
2015 'docs' => __( 'Docs', 'betterdocs' ),
2016 'doc_category' => __( 'Docs Category', 'betterdocs' )
2017 ] ) )
2018 ],
2019 'export_docs' => [
2020 'name' => 'export_docs',
2021 'type' => 'checkbox-select',
2022 'label' => __( 'Select Docs', 'betterdocs' ),
2023 'label_subtitle' => __( 'Selected docs will be included in the export.', 'betterdocs' ),
2024 'priority' => 4,
2025 'multiple' => true,
2026 'search' => true,
2027 'default' => ['all'],
2028 'placeholder' => __( 'Select any', 'betterdocs' ),
2029 'options' => array_merge( [
2030 [
2031 'value' => 'all',
2032 'label' => 'All'
2033 ]
2034 ], $this->docs() ),
2035 'filterValue' => 'all',
2036 'rules' => Rules::is( 'export_type', 'docs' )
2037 ],
2038 'export_categories' => [
2039 'name' => 'export_categories',
2040 'type' => 'checkbox-select',
2041 'label' => __( 'Select Categories', 'betterdocs' ),
2042 'label_subtitle' => __( 'Selected categories and its docs will be included in the export.', 'betterdocs' ),
2043 'priority' => 6,
2044 'multiple' => true,
2045 'search' => true,
2046 'default' => ['all'],
2047 'placeholder' => __( 'Select any', 'betterdocs' ),
2048 'options' => $this->get_terms( 'doc_category' ),
2049 'filterValue' => 'all',
2050 'rules' => Rules::is( 'export_type', 'doc_category' )
2051 ],
2052 'file_type' => [
2053 'name' => 'file_type',
2054 'label' => __( 'Select File Type', 'betterdocs' ),
2055 'label_subtitle' => __( 'Choose a file type', 'betterdocs' ),
2056 'type' => 'select',
2057 'default' => 'xml',
2058 'priority' => 7,
2059 'search' => true,
2060 'options' => $this->normalize_options( apply_filters( 'betterdocs_export_file_type_options', [
2061 'xml' => __( '.xml', 'betterdocs' ),
2062 'csv' => __( '.csv', 'betterdocs' )
2063 ] ) )
2064 ],
2065 'export_docs_btn' => [
2066 'name' => 'export_docs_btn',
2067 'text' => [
2068 'normal' => __( 'Proceed', 'betterdocs' ),
2069 'saved' => __( 'Proceed', 'betterdocs' ),
2070 'loading' => __( 'Exporting...', 'betterdocs' )
2071 ],
2072 'type' => 'button',
2073 'priority' => 8,
2074 'ajax' => [
2075 'on' => 'click',
2076 'api' => '/betterdocs/v1/export-docs',
2077 'data' => [
2078 'export_type' => '@export_type',
2079 'export_docs' => '@export_docs',
2080 'export_kbs' => '@export_kbs',
2081 'export_categories' => '@export_categories',
2082 'file_type' => '@file_type'
2083 ],
2084 'swal' => [
2085 'text' => __( 'Exported Successfully.', 'betterdocs' ),
2086 'icon' => 'success',
2087 'autoClose' => 2000
2088 ]
2089 ]
2090 ]
2091 ] )
2092 ],
2093
2094 'export_settings_nested' => [
2095 'id' => 'export_settings_nested',
2096 'name' => 'export_settings_nested',
2097 'type' => 'section',
2098 'label' => __( 'Export Settings', 'betterdocs' ),
2099 'priority' => 1,
2100 'fields' => [
2101 'export_settings' => [
2102 'name' => 'export_settings',
2103 'label' => __( 'Export Settings', 'betterdocs' ),
2104 'label_subtitle' => __( 'Simply click on “Export Settings” button to download your BetterDocs settings in .json format', 'betterdocs' ),
2105 'text' => [
2106 'normal' => __( 'Export Settings', 'betterdocs' ),
2107 'saved' => __( 'Export Settings', 'betterdocs' ),
2108 'loading' => __( 'Exporting...', 'betterdocs' )
2109 ],
2110 'type' => 'button',
2111 'priority' => 8,
2112 'ajax' => [
2113 'on' => 'click',
2114 'api' => '/betterdocs/v1/export-settings',
2115 'data' => [
2116 'betterdocs_settings' => get_option( 'betterdocs_settings' )
2117 ],
2118 'swal' => [
2119 'text' => __( 'File downloaded successfully.', 'betterdocs' ),
2120 'icon' => 'success',
2121 'autoClose' => 2000
2122 ]
2123 ]
2124 ]
2125 ]
2126 ]
2127 ]
2128 ]
2129 ]
2130 ]
2131 ]
2132 ]
2133 ]
2134 ]
2135 ]
2136 ] );
2137
2138 return $settings;
2139 }
2140
2141 public function normalize_options( $options ) {
2142 return GlobalFields::normalize_fields( $options );
2143 }
2144
2145 public function get_texanomy() {
2146 $docs_tax = $this->database->get_cache( 'betterdocs::settings::taxonomies' );
2147
2148 if ( $docs_tax ) {
2149 return $docs_tax;
2150 }
2151
2152 $taxonomies = get_taxonomies( [
2153 'object_type' => ['docs']
2154 ], 'objects' );
2155
2156 $docs_tax = [
2157 'all' => 'All Docs Archive',
2158 'docs' => 'Docs Page'
2159 ];
2160 foreach ( $taxonomies as $key => $value ) {
2161 $docs_tax[$key] = $value->label;
2162 }
2163 unset( $docs_tax['doc_tag'] );
2164
2165 $docs_tax = $this->normalize_options( $docs_tax );
2166 if ( count( $docs_tax ) > 2 ) {
2167 $this->database->set_cache( 'betterdocs::settings::taxonomies', $docs_tax );
2168 }
2169
2170 return $docs_tax;
2171 }
2172
2173 public function get_terms( $taxonomy ) {
2174 $_cache_key = 'betterdocs::settings::terms::' . trim( $taxonomy );
2175 $docs_tax = $this->database->get_cache( $_cache_key );
2176
2177 if ( $docs_tax ) {
2178 return $docs_tax;
2179 }
2180
2181 $get_terms = get_terms( [
2182 'taxonomy' => $taxonomy,
2183 'hide_empty' => false
2184 ] );
2185
2186 $terms = [
2187 'all' => 'All'
2188 ];
2189
2190 if ( ! empty( $get_terms ) && ! is_wp_error( $get_terms ) ) {
2191 foreach ( $get_terms as $value ) {
2192 if ( isset( $value->slug ) && isset( $value->name ) ) {
2193 $terms[$value->slug] = $value->name;
2194 }
2195 }
2196 }
2197
2198 $terms = $this->normalize_options( $terms );
2199 if ( count( $terms ) > 1 ) {
2200 $this->database->set_cache( $_cache_key, $terms );
2201 }
2202
2203 return $terms;
2204 }
2205
2206 /**
2207 * Get all docs
2208 */
2209 public function docs() {
2210 $docs = $this->database->get_cache( 'betterdocs::settings::all_docs' );
2211
2212 if ( $docs ) {
2213 return $docs;
2214 }
2215
2216 $docs = [];
2217
2218 $_docs = get_posts( [
2219 'post_type' => 'docs',
2220 'numberposts' => -1,
2221 'posts_per_page' => -1
2222 ] );
2223
2224 if ( ! empty( $_docs ) ) {
2225 foreach ( $_docs as $doc ) {
2226 $docs[$doc->ID] = betterdocs()->template_helper->kses( $doc->post_title );
2227 }
2228 $docs = GlobalFields::normalize_fields( $docs );
2229 $this->database->set_cache( 'betterdocs::settings::all_docs', $docs );
2230 }
2231
2232 return $docs;
2233 }
2234
2235 public function hide_roles_management( $tabData = [] ) {
2236 global $current_user;
2237
2238 if ( $current_user instanceof WP_User && ! in_array( 'administrator', $current_user->roles ) ) {
2239 unset( $tabData['fields']['title-advance-settings']['fields']['article_roles'] );
2240 unset( $tabData['fields']['title-advance-settings']['fields']['settings_roles'] );
2241 unset( $tabData['fields']['title-advance-settings']['fields']['analytics_roles'] );
2242 }
2243
2244 return $tabData;
2245 }
2246 }
2247