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

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

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