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

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