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 / Core / Settings.php

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

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