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

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

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