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

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