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

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