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

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