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

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