PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 3.6.1
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v3.6.1
4.9.1 4.9.0 4.8.2 4.8.1 4.8.0 4.7.0 4.6.2 4.6.1 4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 4.5.1 4.5.0 4.4.1 4.4.0 3.3.4 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.5.2 All 199 releases
betterdocs / includes / Core / Settings.php

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

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