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

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

1,579 lines 85.3 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\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 protected $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_action( 'admin_enqueue_scripts', [$this, 'enqueue'] );
37
38 if ( isset( $_GET['page'] ) && $_GET['page'] === 'betterdocs-settings' && ! has_action( 'betterdocs_settings_header' ) ) {
39 add_action( 'betterdocs_settings_header', [$this, 'header'] );
40 }
41
42 add_action( 'wp_ajax_betterdocs_dark_mode', [$this, 'dark_mode'] );
43 add_filter( 'betterdocs_settings_tab_advance', [ $this, 'hide_roles_management'], 11, 1 );
44 add_action( 'betterdocs::settings::saved', [$this, 'fallback_slugs'], 99, 3 );
45 }
46
47 public function fallback_slugs($_saved, $_settings, $_old_settings = []){
48 $_default = $this->get_default();
49 foreach( $this->cannot_be_empty as $key ) {
50 if( $key === 'docs_page' && ! $_settings['builtin_doc_page'] && empty( $_settings[ $key ] ) ) {
51 $this->save( 'builtin_doc_page', true );
52 continue;
53 }
54
55 if( empty( $_settings[ $key ] ) ) {
56 $this->save( $key, $_default[ $key ] );
57 }
58 }
59 }
60
61 /**
62 * Get the settings URL for admin
63 * @return string
64 */
65 public function url() {
66 return esc_url( admin_url( 'admin.php?page=betterdocs-settings' ) );
67 }
68
69 /**
70 * This method is responsible for enqueueing scripts in settings panel
71 *
72 * @since 2.5.0
73 * @param string $hook
74 *
75 * @return void
76 */
77 public function enqueue( $hook ) {
78 if ( $hook !== 'betterdocs_page_betterdocs-settings' ) {
79 return;
80 }
81
82 betterdocs()->assets->enqueue( 'betterdocs-settings', 'admin/css/settings.css' );
83 betterdocs()->assets->enqueue( 'betterdocs-settings', 'admin/js/settings.js' );
84 betterdocs()->assets->localize(
85 'betterdocs-settings',
86 'betterdocsAdminSettings',
87 GlobalFields::normalize( $this->settings_args() )
88 );
89 }
90
91 /**
92 * This method is responsible for printing header in dashboard settings page.
93 *
94 * @since 2.5.0
95 * @param string $hook
96 *
97 * @return void
98 */
99 public function header( $hook ) {
100 if ( $hook !== 'settings' ) {
101 return;
102 }
103
104 betterdocs()->views->get( 'admin/template-parts/settings-header' );
105 }
106
107 /**
108 * A list of deprecated settings keys.
109 *
110 * @since 2.5.0
111 * @return array
112 */
113 public function deprecated_settings() {
114 return [];
115 }
116
117 /**
118 * Dynamic migration caller.
119 *
120 * @since 2.5.0
121 * @return void
122 */
123 public function migration( $version ) {
124 if( $version > 250 ) {
125 for ( $v = 250; $v <= $version; $v++ ) {
126 $_func = "v{$v}";
127 if ( method_exists( $this, $_func ) ) {
128 call_user_func([$this, $_func]);
129 }
130 }
131 }
132 }
133
134 public function v253(){
135 $this->fallback_slugs(true, $this->get_all());
136 }
137
138 /**
139 * Migration for version 2.5.0
140 *
141 * @since 2.5.0
142 * @return void
143 */
144 public function v250() {
145 if ( $this->get( 'alphabetically_order_term', false ) ) {
146 $this->save( 'terms_orderby', 'name' );
147 }
148
149 if ( $orderby = $this->get( 'alphabetically_order_post', false ) ) {
150 if ( $orderby === '1' ) {
151 $this->save( 'alphabetically_order_post', 'title' );
152 }
153 }
154 }
155
156 /**
157 * A list of default settings data.
158 *
159 * @since 1.0.0
160 *
161 * @return array
162 */
163 public function get_default() {
164 $_default = [
165 'multiple_kb' => '',
166 'builtin_doc_page' => true,
167 'breadcrumb_doc_title' => __( 'Docs', 'betterdocs' ),
168 'docs_slug' => 'docs',
169 'docs_page' => 0,
170 'category_slug' => 'docs-category',
171 'tag_slug' => 'docs-tag',
172 'permalink_structure' => 'docs/',
173 'enable_faq_schema' => false,
174 'live_search' => true,
175 'advance_search' => false,
176 'popular_keyword_limit' => 5,
177 'search_letter_limit' => 3,
178 'search_placeholder' => __( 'Search...', 'betterdocs' ),
179 'search_not_found_text' => __( 'Sorry, no docs were found.', 'betterdocs' ),
180 'search_result_image' => true,
181 'masonry_layout' => true,
182 'terms_orderby' => 'betterdocs_order',
183 'alphabetically_order_term' => false,
184 'terms_order' => 'ASC',
185 'alphabetically_order_post' => 'betterdocs_order',
186 'docs_order' => 'ASC',
187 'nested_subcategory' => false,
188 'column_number' => 3,
189 'posts_number' => 10,
190 'post_count' => true,
191 'count_text' => __( 'docs', 'betterdocs' ),
192 'count_text_singular' => __( 'doc', 'betterdocs' ),
193 'exploremore_btn' => true,
194 'exploremore_btn_txt' => __( 'Explore More', 'betterdocs' ),
195 'doc_single' => 1,
196 'enable_toc' => true,
197 'toc_title' => __( 'Table of Contents', 'betterdocs' ),
198 'toc_hierarchy' => true,
199 'toc_list_number' => true,
200 'toc_dynamic_title' => false,
201 'enable_sticky_toc' => true,
202 'sticky_toc_offset' => 100,
203 'collapsible_toc_mobile' => false,
204 'supported_heading_tag' => [1, 2, 3, 4, 5, 6],
205 'enable_post_title' => true,
206 'title_link_ctc' => true,
207 'enable_breadcrumb' => true,
208 'breadcrumb_home_text' => __( 'Home', 'betterdocs' ),
209 'breadcrumb_home_url' => get_home_url(),
210 'enable_breadcrumb_category' => true,
211 'enable_breadcrumb_title' => true,
212 'enable_sidebar_cat_list' => true,
213 'enable_print_icon' => true,
214 'enable_tags' => true,
215 'email_feedback' => true,
216 'feedback_link_text' => __( 'Still stuck? How can we help?', 'betterdocs' ),
217 'feedback_url' => '',
218 'feedback_form_title' => __( 'How can we help?', 'betterdocs' ),
219 'email_address' => get_option( 'admin_email' ),
220 'show_last_update_time' => true,
221 'enable_navigation' => true,
222 'enable_comment' => true,
223 'enable_credit' => true,
224 'enable_archive_sidebar' => true,
225 'archive_nested_subcategory' => true,
226 'enable_content_restriction' => false,
227 'enable_reporting' => false,
228 'reporting_day' => 'monday',
229 'reporting_email' => get_option( 'admin_email' )
230 ];
231
232 $_default = apply_filters( 'betterdocs_default_settings', $_default );
233 // $_default = apply_filters_deprecated(
234 // 'betterdocs_option_default_settings', [$_default], '2.5.0',
235 // 'betterdocs_default_settings', 'betterdocs_option_default_settings will be removed from v3.5.0.'
236 // );
237
238 return $_default;
239 }
240
241 /**
242 * A list of default settings for pro plugins.
243 *
244 * @since 2.5.0
245 * @return array
246 */
247 public function get_pro_defaults() {
248 return [];
249 }
250
251 /**
252 * Get customizer links for docs page.
253 *
254 * @since 1.0.0
255 * @return string
256 */
257 public function customizer_link() {
258 $query['autofocus[panel]'] = 'betterdocs_customize_options';
259 $query['return'] = admin_url( 'edit.php?post_type=docs' );
260 $builtin_doc_page = betterdocs()->settings->get( 'builtin_doc_page' );
261 $docs_slug = betterdocs()->settings->get( 'docs_slug' );
262 $docs_page = betterdocs()->settings->get( 'builtin_doc_page' );
263
264 if ( $builtin_doc_page == 1 && $docs_slug ) {
265 $query['url'] = site_url( '/' . $docs_slug );
266 } elseif ( $builtin_doc_page != 1 && $docs_page ) {
267 $post_info = get_post( $docs_page );
268 $query['url'] = site_url( '/' . $post_info->post_name );
269 }
270
271 return add_query_arg( $query, admin_url( 'customize.php' ) );
272 }
273
274 /**
275 * Get All Roles
276 * dynamically
277 *
278 * @return array
279 */
280 public function get_roles() {
281 $roles = wp_roles()->role_names;
282 unset( $roles['subscriber'] );
283 return $roles;
284 }
285
286 /**
287 * Set dark mode
288 *
289 * @since 1.0.0
290 * @return void
291 */
292 public function dark_mode() {
293 if ( ! check_ajax_referer( 'doc_cat_order_nonce', 'nonce', false ) ) {
294 wp_send_json_error();
295 }
296
297 if ( isset( $_POST['mode'] ) ) {
298 if ( $this->save( 'dark_mode', rest_sanitize_boolean( $_POST['mode'] ) ) ) {
299 wp_send_json_success();
300 }
301 }
302
303 wp_send_json_error();
304 }
305
306 public function get_normalized_value( $key, $value, $default = null ) {
307 $_origin_value = $_value = $value;
308
309 if ( in_array( $_value, ['on', 'off', '1', 'false', 'true'], true ) ) {
310 switch ( $_value ) {
311 case 'on':
312 case 'ON':
313 case '1':
314 case 'true':
315 $_value = true;
316 break;
317 case 'off':
318 case 'OFF':
319 case '':
320 case 'false':
321 $_value = false;
322 break;
323 }
324 }
325
326 $this->type_validation( $_value, $default );
327 return $_value;
328 }
329
330 public function get_normalized_values( $values, $default_values = [] ) {
331 if ( empty( $values ) ) {
332 return [];
333 }
334
335 $_settings = [];
336 foreach ( $values as $key => $value ) {
337 $_default_value = isset( $default_values[ $key ] ) ? $default_values[ $key ] : null;
338 $_settings[$key] = $this->get_normalized_value( $key, $value, $_default_value );
339 }
340
341 return $_settings;
342 }
343
344 public function get_all( $raw = false ) {
345 // $_settings = $this->get( '', null, true );
346 // return $_settings;
347 $_default_settings = $raw ? [] : array_merge( $this->get_default(), $this->get_pro_defaults() );
348 $_settings = $this->database->get( $this->base_key, $_default_settings );
349 return $this->get_normalized_values( $_settings, $_default_settings );
350 }
351
352 public function type_validation( &$value, $defaultValue = null ){
353 if ( $defaultValue !== null ) {
354 /**
355 * Check if value is not in same type
356 */
357 $_default_type = gettype( $defaultValue );
358
359 if( ! ( is_scalar( $defaultValue ) && is_scalar( $value ) ) && empty( $value ) ) {
360 $value = $defaultValue;
361 }
362
363 settype( $value, $_default_type );
364 }
365 }
366
367 /**
368 * Get settings value by key
369 *
370 * @since 2.5.0
371 *
372 * @param string $key
373 * @param mixed $default
374 * @param bool $get_all
375 *
376 * @return mixed
377 */
378 public function get( $key, $default = null ) {
379 $_default_settings = array_merge( $this->get_default(), $this->get_pro_defaults() );
380 $_settings = $this->database->get( $this->base_key, $_default_settings );
381
382 $_value = $default;
383 switch ( true ) {
384 // Check if it's a PRO Option
385 case ! isset( $_default_settings[$key] ):
386 $_value = $default;
387 break;
388 // Check if it's a FREE Option and not in DB.
389 case ! isset( $_settings[$key] ) && isset( $_default_settings[$key] ):
390 $_value = $default !== null ? $default : $_default_settings[$key];
391 break;
392 // Check if it's a FREE Option
393 case isset( $_settings[$key] ) && isset( $_default_settings[$key] ):
394 $_value = $_settings[$key];
395 break;
396 }
397
398 $_value = $this->get_normalized_value( $key, $_value, isset( $_default_settings[$key] ) ? $_default_settings[$key] : null );
399
400
401 if ( gettype( $_value ) === 'string' ) {
402 if ( empty( $_value ) && $default != null ) {
403 $_value = $default;
404 } elseif ( empty( $_value ) && $default === null && isset( $_default_settings[$key] ) ) {
405 $_value = $_default_settings[$key];
406 }
407 }
408
409 return $_value;
410 }
411
412 public function get_raw_field( $key, $default = null ) {
413 $_settings = $this->database->get( $this->base_key, [] );
414
415 if( isset( $_settings[ $key ] ) ) {
416 return $this->get_normalized_value( $key, $_settings[ $key ], $default );
417 }
418
419 return $default;
420 }
421
422 public function save( $key, $value ) {
423 $_settings = $this->database->get( $this->base_key, [] );
424 $_settings[$key] = $value;
425
426 return $this->database->save( $this->base_key, $_settings );
427 }
428
429 public function save_settings( $settings ) {
430 if ( ! current_user_can( 'edit_docs_settings' ) ) {
431 return new WP_Error( 'unauthorized_action', __( 'You don\'t have any rights for saving settings.', 'betterdocs' ) );
432 }
433
434 $_old_settings = $this->database->get( $this->base_key, $this->get_default() );
435
436 // @todo: sanitize the data before inject in DB.
437 $_normalized_settings = $this->get_normalized_values( $settings );
438 $_settings = wp_parse_args( $_normalized_settings, $_old_settings );
439 $_saved = $this->database->save( $this->base_key, $_settings );
440
441 do_action_ref_array( 'betterdocs::settings::saved', [$_saved, $_settings, $_old_settings, &$this] );
442
443 return $_saved;
444 }
445
446 public function views( $hook ) {
447 return betterdocs()->views->get( 'admin/settings' );
448 }
449
450 public function save_default_settings() {
451 $_settings = $this->get_all();
452 return $this->database->save( $this->base_key, $_settings );
453 }
454
455 public function get_pages() {
456 $_pages = betterdocs()->query->get_posts( [
457 'post_type' => 'page',
458 'numberposts' => -1,
459 'post_status' => 'publish',
460 'posts_per_page' => -1
461 ] );
462
463 $__pages = [];
464
465 if ( ! empty( $_pages ) ) {
466 $__pages[0] = __( 'Select a Page', 'betterdocs' );
467 foreach ( $_pages->posts as $page ) {
468 $__pages[$page->ID] = esc_html( $page->post_title );
469 }
470 }
471
472 return $__pages;
473 }
474
475 public function settings_args() {
476 $wp_roles = $this->normalize_options( $this->get_roles() );
477
478 $settings = [
479 'id' => 'betterdocs_settings_metabox_wrapper',
480 'title' => __( 'betterdocs', 'betterdocs' ),
481 'object_types' => ['betterdocs'],
482 'context' => 'normal',
483 'priority' => 'high',
484 'show_header' => false,
485 'tabnumber' => true,
486 'is_pro_active' => betterdocs()->is_pro_active(),
487 'logoURL' => betterdocs()->assets->icon( 'betterdocs-icon.svg', true ),
488 'layout' => 'horizontal',
489 'config' => [
490 'active' => 'tab-general',
491 'sidebar' => false,
492 'title' => false
493 ],
494 'submit' => [
495 'show' => true,
496 'label' => __( 'Save Settings', 'betterdocs' ),
497 'loadingLabel' => __( 'Saving...', 'betterdocs' ),
498 'class' => 'save-settings',
499 'rules' => Rules::logicalRule( [
500 Rules::is( 'config.active', 'tab-design', true ),
501 Rules::is( 'config.active', 'tab-shortcodes', true ),
502 Rules::is( 'config.active', 'tab-instant-answer', true )
503 ], 'and' )
504 ],
505 'values' => $this->get_all( true ),
506 'tabs' => apply_filters( 'betterdocs_settings_tabs', [
507 'tab-general' => apply_filters( 'betterdocs_settings_tab_general', [
508 'id' => 'tab-general',
509 'label' => __( 'General', 'betterdocs' ),
510 'classes' => 'tab-general',
511 'priority' => 10,
512 'fields' => [
513 'multiple_kb' => apply_filters( 'betterdocs_multi_kb_settings', [
514 'name' => 'multiple_kb',
515 'type' => 'checkbox',
516 'label' => __( 'Enable Multiple Knowledge Base', 'betterdocs' ),
517 'default' => '',
518 'priority' => 1,
519 'is_pro' => true
520 ] ),
521 'builtin_doc_page' => [
522 'name' => 'builtin_doc_page',
523 'type' => 'checkbox',
524 'label' => __( 'Enable Built-in Documentation Page', 'betterdocs' ),
525 'default' => true,
526 'priority' => 2,
527 'help' => __( '<strong>Note:</strong> if you disable built-in documentation page, you can use shortcode or page builder widgets to design your documentation page.', 'betterdocs' )
528 ],
529 'breadcrumb_doc_title' => [
530 'name' => 'breadcrumb_doc_title',
531 'type' => 'text',
532 'label' => __( 'Documentation Page Title', 'betterdocs' ),
533 'default' => 'Docs',
534 'priority' => 3
535 ],
536 'docs_slug' => [
537 'name' => 'docs_slug',
538 'type' => 'text',
539 'label' => __( 'BetterDocs Root Slug', 'betterdocs' ),
540 'default' => 'docs',
541 'priority' => 4,
542 'rules' => Rules::is( 'builtin_doc_page', true )
543 ],
544 'docs_page' => [
545 'name' => 'docs_page',
546 'label' => __( 'Docs Page', 'betterdocs' ),
547 'type' => 'select',
548 'default' => 0,
549 'priority' => 5,
550 'search' => true,
551 'options' => $this->normalize_options( $this->get_pages() ),
552 'help' => __( 'Note: You will need to insert BetterDocs Shortcode inside the page. This page will be used as docs permalink.', 'betterdocs' ),
553 'rules' => Rules::is( 'builtin_doc_page', false )
554 ],
555 'category_slug' => [
556 'name' => 'category_slug',
557 'type' => 'text',
558 'label' => __( 'Custom Category Slug', 'betterdocs' ),
559 'default' => 'docs-category',
560 'priority' => 6
561 ],
562 'tag_slug' => [
563 'name' => 'tag_slug',
564 'type' => 'text',
565 'label' => __( 'Custom Tag Slug', 'betterdocs' ),
566 'default' => 'docs-tag',
567 'priority' => 7
568 ],
569 'permalink_structure' => [
570 'name' => 'permalink_structure',
571 'type' => 'permalink_structure',
572 'label' => __( 'Single Docs Permalink', 'betterdocs' ),
573 'default' => PostType::permalink_structure(),
574 'priority' => 9,
575 'tags' => $this->normalize_options( [
576 '%doc_category%' => '%doc_category%',
577 '%knowledge_base%' => '%knowledge_base%'
578 ] ),
579 'help' => __( '<b>Note:</b> Make sure to keep <b>Docs Root Slug</b> in the <b>Single Docs Permalink</b>. You are not able to keep it blank. You can use the available tags from below.', 'betterdocs' )
580 ],
581 'enable_faq_schema' => [
582 'name' => 'enable_faq_schema',
583 'type' => 'checkbox',
584 'label' => __( 'Enable FAQ Schema', 'betterdocs' ),
585 'default' => '',
586 'priority' => 10
587 ],
588 'analytics_from' => [
589 'name' => 'analytics_from',
590 'type' => 'select',
591 'label' => __( 'Analytics From', 'betterdocs' ),
592 'options' => $this->normalize_options( [
593 'everyone' => __( 'Everyone', 'betterdocs' ),
594 'guests' => __( 'Guests Only', 'betterdocs' ),
595 'registered_users' => __( 'Registered Users Only', 'betterdocs' )
596 ] ),
597 'default' => 'everyone',
598 'priority' => 11,
599 'is_pro' => true
600 ],
601 'exclude_bot_analytics' => [
602 'name' => 'exclude_bot_analytics',
603 'type' => 'checkbox',
604 'label' => __( 'Exclude Bot Analytics', 'betterdocs' ),
605 'default' => true,
606 'priority' => 12,
607 'help' => __( 'Select if you want to exclude bot analytics.', 'betterdocs' ),
608 'is_pro' => true
609 ]
610 ]
611 ] ),
612 'tab-layout' => apply_filters( 'betterdocs_settings_tab_layout', [
613 'id' => 'tab-layout',
614 'label' => __( 'Layout', 'betterdocs' ),
615 'classes' => 'tab-layout',
616 'priority' => 20,
617 'fields' => [
618 'tab-sidebar-layout' => apply_filters( 'betterdocs_settings_tab_sidebar_layout', [
619 'id' => 'tab-sidebar-layout',
620 'name' => 'tab_sidebar_layout',
621 'label' => __( 'Layout', 'betterdocs' ),
622 'classes' => 'tab-layout',
623 'type' => "tab",
624 'active' => "layout_documentation_page",
625 'completionTrack' => true,
626 'sidebar' => true,
627 'config' => [
628 'active' => 'layout_documentation_page',
629 'sidebar' => false,
630 'title' => false
631 ],
632 'submit' => [
633 'show' => false
634 ],
635 'step' => [
636 'show' => false
637 ],
638 'priority' => 20,
639 'fields' => [
640 'layout_documentation_page' => [
641 'id' => 'layout_documentation_page',
642 'name' => 'layout_documentation_page',
643 'type' => 'section',
644 'label' => __( 'Documentation Page', 'betterdocs' ),
645 'priority' => 5,
646 'fields' => [
647 // 'doc_page' => [
648 // 'name' => 'doc_page',
649 // 'type' => 'title',
650 // 'label' => __( 'Documentation Page', 'betterdocs' ),
651 // 'priority' => 1
652 // ],
653 'live_search' => [
654 'name' => 'live_search',
655 'type' => 'checkbox',
656 'label' => __( 'Enable Live Search', 'betterdocs' ),
657 'default' => 1,
658 'priority' => 2
659 ],
660 'advance_search' => apply_filters( 'betterdocs_advance_search_settings', [
661 'name' => 'advance_search',
662 'type' => 'checkbox',
663 'label' => __( 'Enable Advanced Search', 'betterdocs' ),
664 'default' => '',
665 'priority' => 3,
666 'is_pro' => true
667 ] ),
668 'child_category_exclude' => apply_filters( 'child_category_exclude', [
669 'name' => 'child_category_exclude',
670 'type' => 'checkbox',
671 'label' => __( 'Exclude Child Terms In Category Search', 'betterdocs' ),
672 'default' => '',
673 'priority' => 4,
674 'is_pro' => true
675 ] ),
676 'popular_keyword_limit' => apply_filters( 'betterdocs_popular_keyword_limit_settings', [
677 'name' => 'popular_keyword_limit',
678 'type' => 'number',
679 'label' => __( 'Minimum amount of Keywords Search', 'betterdocs' ),
680 'default' => 5,
681 'priority' => 5,
682 'is_pro' => true
683 ] ),
684 'search_letter_limit' => [
685 'name' => 'search_letter_limit',
686 'type' => 'number',
687 'label' => __( 'Minimum Character Limit For Search Result', 'betterdocs' ),
688 'priority' => 6,
689 'default' => 3
690 ],
691 'search_placeholder' => [
692 'name' => 'search_placeholder',
693 'type' => 'text',
694 'label' => __( 'Search Placeholder', 'betterdocs' ),
695 'default' => 'Search..',
696 'priority' => 7
697 ],
698 'search_button_text' => apply_filters( 'betterdocs_search_button_text', [
699 'name' => 'search_button_text',
700 'type' => 'text',
701 'label' => __( 'Search Button Text', 'betterdocs' ),
702 'priority' => 8,
703 'default' => __( 'Search', 'betterdocs' ),
704 'is_pro' => true
705 ] ),
706 'search_not_found_text' => [
707 'name' => 'search_not_found_text',
708 'type' => 'text',
709 'label' => __( 'Search Not Found Text', 'betterdocs' ),
710 'default' => 'Sorry, no docs were found.',
711 'priority' => 9
712 ],
713 'search_result_image' => [
714 'name' => 'search_result_image',
715 'type' => 'checkbox',
716 'label' => __( 'Search Result Image', 'betterdocs' ),
717 'default' => 1,
718 'priority' => 10
719 ],
720 'kb_based_search' => apply_filters( 'betterdocs_kb_based_search_settings', [
721 'name' => 'kb_based_search',
722 'type' => 'checkbox',
723 'label' => __( 'Search Result based on Knowledge Base', 'betterdocs' ),
724 'default' => '',
725 'priority' => 11,
726 'is_pro' => true,
727 'rules' => Rules::is( 'multiple_kb', true )
728 ] ),
729 'masonry_layout' => [
730 'name' => 'masonry_layout',
731 'type' => 'checkbox',
732 'label' => __( 'Enable Masonry', 'betterdocs' ),
733 'default' => 1,
734 'priority' => 12
735 ],
736 'terms_orderby' => [
737 'name' => 'terms_orderby',
738 'type' => 'select',
739 'label' => __( 'Terms Order By', 'betterdocs' ),
740 'default' => 'betterdocs_order',
741 'options' => $this->normalize_options(
742 apply_filters( 'betterdocs_terms_orderby_options', [
743 'none' => __( 'No order', 'betterdocs' ),
744 'name' => __( 'Name', 'betterdocs' ),
745 'slug' => __( 'Slug', 'betterdocs' ),
746 'term_group' => __( 'Term Group', 'betterdocs' ),
747 'term_id' => __( 'Term ID', 'betterdocs' ),
748 'id' => __( 'ID', 'betterdocs' ),
749 'description' => __( 'Description', 'betterdocs' ),
750 'parent' => __( 'Parent', 'betterdocs' ),
751 'betterdocs_order' => __( 'BetterDocs Order', 'betterdocs' )
752 ] )
753 ),
754 'priority' => 13
755 ],
756 'terms_order' => [
757 'name' => 'terms_order',
758 'type' => 'select',
759 'label' => __( 'Terms Order', 'betterdocs' ),
760 'default' => 'ASC',
761 'options' => $this->normalize_options( [
762 'ASC' => 'Ascending',
763 'DESC' => 'Descending'
764 ] ),
765 'priority' => 15
766 ],
767 'alphabetically_order_post' => [
768 'name' => 'alphabetically_order_post',
769 'type' => 'select',
770 'label' => __( 'Docs Order By', 'betterdocs' ),
771 'default' => 'betterdocs_order',
772 'options' => $this->normalize_options( [
773 'none' => __( 'No order', 'betterdocs' ),
774 'ID' => __( 'Docs ID', 'betterdocs' ),
775 'author' => __( 'Docs Author', 'betterdocs' ),
776 'title' => __( 'Title', 'betterdocs' ),
777 'date' => __( 'Date', 'betterdocs' ),
778 'modified' => __( 'Last Modified Date', 'betterdocs' ),
779 'parent' => __( 'Parent Id', 'betterdocs' ),
780 'rand' => __( 'Random', 'betterdocs' ),
781 'comment_count' => __( 'Comment Count', 'betterdocs' ),
782 'menu_order' => __( 'Menu Order', 'betterdocs' ),
783 'betterdocs_order' => __( 'BetterDocs Order', 'betterdocs' )
784 ] ),
785 'priority' => 16
786 ],
787 'docs_order' => [
788 'name' => 'docs_order',
789 'type' => 'select',
790 'label' => __( 'Docs Order', 'betterdocs' ),
791 'default' => 'ASC',
792 'options' => $this->normalize_options( [
793 'ASC' => 'Ascending',
794 'DESC' => 'Descending'
795 ] ),
796 'priority' => 17
797 ],
798 'nested_subcategory' => [
799 'name' => 'nested_subcategory',
800 'type' => 'checkbox',
801 'label' => __( 'Nested Subcategory', 'betterdocs' ),
802 'default' => '',
803 'priority' => 18
804 ],
805 'column_number' => [
806 'name' => 'column_number',
807 'type' => 'number',
808 'label' => __( 'Number of Columns', 'betterdocs' ),
809 'default' => 3,
810 'priority' => 19
811 ],
812 'posts_number' => apply_filters( 'betterdocs_posts_number', [
813 'name' => 'posts_number',
814 'type' => 'number',
815 'label' => __( 'Number of Docs', 'betterdocs' ),
816 'default' => 10,
817 'priority' => 20
818 ] ),
819 'post_count' => [
820 'name' => 'post_count',
821 'type' => 'checkbox',
822 'label' => __( 'Enable Doc Count', 'betterdocs' ),
823 'default' => 1,
824 'priority' => 21
825 ],
826 'count_text' => [
827 'name' => 'count_text',
828 'type' => 'text',
829 'label' => __( 'Count Text', 'betterdocs' ),
830 'default' => __( 'docs', 'betterdocs' ),
831 'priority' => 22
832 ],
833 'count_text_singular' => [
834 'name' => 'count_text_singular',
835 'type' => 'text',
836 'label' => __( 'Count Text Singular', 'betterdocs' ),
837 'default' => __( 'doc', 'betterdocs' ),
838 'priority' => 23
839 ],
840 'exploremore_btn' => [
841 'name' => 'exploremore_btn',
842 'type' => 'checkbox',
843 'label' => __( 'Enable Explore More Button', 'betterdocs' ),
844 'default' => true,
845 'priority' => 24
846 ],
847 'exploremore_btn_txt' => [
848 'name' => 'exploremore_btn_txt',
849 'type' => 'text',
850 'label' => __( 'Button Text', 'betterdocs' ),
851 'default' => __( 'Explore More', 'betterdocs' ),
852 'priority' => 25,
853 'rules' => Rules::is( 'exploremore_btn', true )
854 ]
855 ]
856 ],
857 'layout_single_doc' => [
858 'id' => 'layout_single_doc',
859 'name' => 'layout_single_doc',
860 'type' => 'section',
861 'label' => __( 'Single Doc', 'betterdocs' ),
862 'priority' => 6,
863 'fields' => [
864 // 'doc_single' => [
865 // 'name' => 'doc_single',
866 // 'type' => 'title',
867 // 'label' => __( 'Single Doc', 'betterdocs' ),
868 // 'priority' => 1
869 // ],
870 'enable_toc' => [
871 'name' => 'enable_toc',
872 'type' => 'checkbox',
873 'label' => __( 'Enable Table of Contents (TOC)', 'betterdocs' ),
874 'default' => 1,
875 'priority' => 2
876 ],
877 'toc_title' => [
878 'name' => 'toc_title',
879 'type' => 'text',
880 'label' => __( 'TOC Title', 'betterdocs' ),
881 'default' => __( 'Table of Contents', 'betterdocs' ),
882 'priority' => 3,
883 'rules' => Rules::is( 'enable_toc', true )
884
885 ],
886 'toc_hierarchy' => [
887 'name' => 'toc_hierarchy',
888 'type' => 'checkbox',
889 'label' => __( 'TOC Hierarchy', 'betterdocs' ),
890 'default' => 1,
891 'priority' => 4,
892 'rules' => Rules::is( 'enable_toc', true )
893 ],
894 'toc_list_number' => [
895 'name' => 'toc_list_number',
896 'type' => 'checkbox',
897 'label' => __( 'TOC List Number', 'betterdocs' ),
898 'default' => 1,
899 'priority' => 5,
900 'rules' => Rules::is( 'enable_toc', true )
901 ],
902 'toc_dynamic_title' => [
903 'name' => 'toc_dynamic_title',
904 'type' => 'checkbox',
905 'label' => __( 'Show TOC Title in Anchor Links', 'betterdocs' ),
906 'default' => 0,
907 'priority' => 6,
908 'rules' => Rules::is( 'enable_toc', true )
909 ],
910 'enable_sticky_toc' => [
911 'name' => 'enable_sticky_toc',
912 'type' => 'checkbox',
913 'label' => __( 'Enable Sticky TOC', 'betterdocs' ),
914 'default' => 1,
915 'priority' => 7,
916 'rules' => Rules::is( 'enable_toc', true )
917 ],
918 'sticky_toc_offset' => [
919 'name' => 'sticky_toc_offset',
920 'type' => 'number',
921 'label' => __( 'Content Offset', 'betterdocs' ),
922 'default' => 100,
923 'priority' => 8,
924 'description' => __( 'content offset from top on scroll.', 'betterdocs' ),
925 'rules' => Rules::is( 'enable_toc', true )
926 ],
927 'collapsible_toc_mobile' => [
928 'name' => 'collapsible_toc_mobile',
929 'type' => 'checkbox',
930 'label' => __( 'Collapsible TOC on small devices', 'betterdocs' ),
931 'default' => '',
932 'priority' => 9,
933 'rules' => Rules::is( 'enable_toc', true )
934 ],
935 'supported_heading_tag' => [
936 'name' => 'supported_heading_tag',
937 'label' => __( 'TOC Supported Heading Tag', 'betterdocs' ),
938 'type' => 'select',
939 'multiple' => true,
940 'priority' => 10,
941 'default' => ['1', '2', '3', '4', '5', '6'],
942 'options' => $this->normalize_options( [
943 '1' => 'h1',
944 '2' => 'h2',
945 '3' => 'h3',
946 '4' => 'h4',
947 '5' => 'h5',
948 '6' => 'h6'
949 ] ),
950 'rules' => Rules::is( 'enable_toc', true )
951 ],
952 'enable_post_title' => [
953 'name' => 'enable_post_title',
954 'type' => 'checkbox',
955 'label' => __( 'Enable Post Title', 'betterdocs' ),
956 'default' => 1,
957 'priority' => 11
958 ],
959 'title_link_ctc' => [
960 'name' => 'title_link_ctc',
961 'type' => 'checkbox',
962 'label' => __( 'Title Link Copy To Clipboard', 'betterdocs' ),
963 'default' => 1,
964 'priority' => 12
965 ],
966 'enable_breadcrumb' => [
967 'name' => 'enable_breadcrumb',
968 'type' => 'checkbox',
969 'label' => __( 'Enable Breadcrumb', 'betterdocs' ),
970 'default' => 1,
971 'priority' => 13
972 ],
973 'breadcrumb_home_text' => [
974 'name' => 'breadcrumb_home_text',
975 'type' => 'text',
976 'label' => __( 'Breadcrumb Home Text', 'betterdocs' ),
977 'default' => __( 'Home', 'betterdocs' ),
978 'priority' => 14,
979 'rules' => Rules::is( 'enable_breadcrumb', true )
980
981 ],
982 'breadcrumb_home_url' => [
983 'name' => 'breadcrumb_home_url',
984 'type' => 'text',
985 'label' => __( 'Breadcrumb Home URL', 'betterdocs' ),
986 'priority' => 15,
987 'default' => get_home_url(),
988 'rules' => Rules::is( 'enable_breadcrumb', true )
989 ],
990 'enable_breadcrumb_category' => [
991 'name' => 'enable_breadcrumb_category',
992 'type' => 'checkbox',
993 'label' => __( 'Enable Category on Breadcrumb', 'betterdocs' ),
994 'default' => 1,
995 'priority' => 16,
996 'rules' => Rules::is( 'enable_breadcrumb', true )
997 ],
998 'enable_breadcrumb_title' => [
999 'name' => 'enable_breadcrumb_title',
1000 'type' => 'checkbox',
1001 'label' => __( 'Enable Title on Breadcrumb', 'betterdocs' ),
1002 'default' => 1,
1003 'priority' => 17,
1004 'rules' => Rules::is( 'enable_breadcrumb', true )
1005 ],
1006 'enable_sidebar_cat_list' => [
1007 'name' => 'enable_sidebar_cat_list',
1008 'type' => 'checkbox',
1009 'label' => __( 'Enable Sidebar Category List', 'betterdocs' ),
1010 'default' => 1,
1011 'priority' => 18
1012 ],
1013 'enable_print_icon' => [
1014 'name' => 'enable_print_icon',
1015 'type' => 'checkbox',
1016 'label' => __( 'Enable Print Icon', 'betterdocs' ),
1017 'default' => 1,
1018 'priority' => 19
1019 ],
1020 'enable_tags' => [
1021 'name' => 'enable_tags',
1022 'type' => 'checkbox',
1023 'label' => __( 'Enable Tags', 'betterdocs' ),
1024 'default' => 1,
1025 'priority' => 20
1026 ],
1027 'email_feedback' => [
1028 'name' => 'email_feedback',
1029 'type' => 'checkbox',
1030 'label' => __( 'Enable Email Feedback', 'betterdocs' ),
1031 'default' => 1,
1032 'priority' => 21
1033 ],
1034 'feedback_link_text' => [
1035 'name' => 'feedback_link_text',
1036 'type' => 'text',
1037 'label' => __( 'Feedback Link Text', 'betterdocs' ),
1038 'default' => __( 'Still stuck? How can we help?', 'betterdocs' ),
1039 'priority' => 22,
1040 'rules' => Rules::is( 'email_feedback', true )
1041 ],
1042 'feedback_url' => [
1043 'name' => 'feedback_url',
1044 'type' => 'text',
1045 'label' => __( 'Feedback URL', 'betterdocs' ),
1046 'default' => '',
1047 'priority' => 23,
1048 'rules' => Rules::is( 'email_feedback', true )
1049 ],
1050 'feedback_form_title' => [
1051 'name' => 'feedback_form_title',
1052 'type' => 'text',
1053 'label' => __( 'Feedback Form Title', 'betterdocs' ),
1054 'default' => __( 'How can we help?', 'betterdocs' ),
1055 'priority' => 24,
1056 'rules' => Rules::is( 'email_feedback', true )
1057 ],
1058 'email_address' => [
1059 'name' => 'email_address',
1060 'type' => 'text',
1061 'label' => __( 'Email Address', 'betterdocs' ),
1062 'default' => get_option( 'admin_email' ),
1063 'priority' => 25,
1064 'description' => __( 'The email address where the Feedback from will be sent', 'betterdocs' ),
1065 'rules' => Rules::is( 'email_feedback', true )
1066 ],
1067 'show_last_update_time' => [
1068 'name' => 'show_last_update_time',
1069 'type' => 'checkbox',
1070 'label' => __( 'Show Last Update Time', 'betterdocs' ),
1071 'default' => 1,
1072 'priority' => 26
1073 ],
1074 'enable_navigation' => [
1075 'name' => 'enable_navigation',
1076 'type' => 'checkbox',
1077 'label' => __( 'Enable Navigation', 'betterdocs' ),
1078 'default' => 1,
1079 'priority' => 27
1080 ],
1081 'enable_comment' => [
1082 'name' => 'enable_comment',
1083 'type' => 'checkbox',
1084 'label' => __( 'Enable Comment', 'betterdocs' ),
1085 'default' => '',
1086 'priority' => 28
1087 ],
1088 'enable_credit' => [
1089 'name' => 'enable_credit',
1090 'type' => 'checkbox',
1091 'label' => __( 'Enable Credit', 'betterdocs' ),
1092 'default' => 1,
1093 'priority' => 29
1094 ]
1095 ]
1096 ],
1097 'layout_archive_page' => [
1098 'id' => 'layout_archive_page',
1099 'name' => 'layout_archive_page',
1100 'type' => 'section',
1101 'label' => __( 'Archive Page', 'betterdocs' ),
1102 'priority' => 7,
1103 'fields' => [
1104 'enable_archive_sidebar' => [
1105 'name' => 'enable_archive_sidebar',
1106 'type' => 'checkbox',
1107 'label' => __( 'Enable Sidebar Category List', 'betterdocs' ),
1108 'default' => 1,
1109 'priority' => 31
1110 ],
1111 'archive_nested_subcategory' => [
1112 'name' => 'archive_nested_subcategory',
1113 'type' => 'checkbox',
1114 'label' => __( 'Nested Subcategory', 'betterdocs' ),
1115 'default' => 1,
1116 'priority' => 32
1117 ]
1118 ]
1119 ]
1120 ]
1121 ] )
1122 ]
1123 ] ),
1124 'tab-design' => apply_filters( 'betterdocs_settings_tab_design', [
1125 'id' => 'tab-design',
1126 'label' => __( 'Design', 'betterdocs' ),
1127 'priority' => 21,
1128 'fields' => [
1129 'customizer_link' => [
1130 'name' => 'customizer_link',
1131 'type' => 'action',
1132 'action' => 'betterdocs_settings_customizer_link',
1133 'label' => __( 'Customize BetterDocs', 'betterdocs' ),
1134 'url' => $this->customizer_link(),
1135 'customizer_img' => betterdocs()->assets->icon( 'customizer/betterdocs-customize.svg', true ),
1136 'priority' => 1
1137 ]
1138 ]
1139 ] ),
1140 'tab-shortcodes' => apply_filters( 'betterdocs_settings_tab_shortcodes', [
1141 'label' => __( 'Shortcodes', 'betterdocs' ),
1142 'id' => 'tab-shortcodes',
1143 'classes' => 'tab-shortcodes',
1144 'priority' => 30,
1145 'fields' => apply_filters( 'betterdocs_shortcode_fields', [
1146 'search_form' => [
1147 'name' => 'search_form',
1148 'type' => 'text',
1149 'label' => __( 'Search Form', 'betterdocs' ),
1150 'default' => '[betterdocs_search_form]',
1151 'readOnly' => true,
1152 'copyOnClick' => true,
1153 'priority' => 1,
1154 'help' => __( '<strong>You can use:</strong> [betterdocs_search_form placeholder="Search..." heading="Heading" subheading="Subheading" category_search="true" search_button="true" popular_search="true"]', 'betterdocs' )
1155 ],
1156 'feedback_form' => [
1157 'name' => 'feedback_form',
1158 'type' => 'text',
1159 'label' => __( 'Feedback Form', 'betterdocs' ),
1160 'default' => '[betterdocs_feedback_form]',
1161 'readOnly' => true,
1162 'copyOnClick' => true,
1163 'priority' => 2,
1164 'help' => __( '<strong>You can use:</strong> [betterdocs_feedback_form button_text="Send"]', 'betterdocs' )
1165 ],
1166 'category_grid' => [
1167 'name' => 'category_grid',
1168 'type' => 'text',
1169 'label' => __( 'Category Grid- Layout 1', 'betterdocs' ),
1170 'default' => '[betterdocs_category_grid]',
1171 'readOnly' => true,
1172 'copyOnClick' => true,
1173 'priority' => 3,
1174 'help' => __( '<strong>You can use:</strong> [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' )
1175 ],
1176 'category_box' => [
1177 'name' => 'category_box',
1178 'type' => 'text',
1179 'label' => __( 'Category Box- Layout 2', 'betterdocs' ),
1180 'default' => '[betterdocs_category_box]',
1181 'readOnly' => true,
1182 'copyOnClick' => true,
1183 'priority' => 4,
1184 'help' => __( '<strong>You can use:</strong> [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' )
1185 ],
1186 'category_list' => [
1187 'name' => 'category_list',
1188 'type' => 'text',
1189 'label' => __( 'Category List', 'betterdocs' ),
1190 'default' => '[betterdocs_category_list]',
1191 'readOnly' => true,
1192 'copyOnClick' => true,
1193 'priority' => 5,
1194 'help' => __( '<strong>You can use:</strong> [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' )
1195 ],
1196 'faq_modern_layout' => [
1197 'name' => 'faq_modern_layout',
1198 'type' => 'text',
1199 'label' => __( 'FAQ Layout - 1', 'betterdocs' ),
1200 'default' => '[betterdocs_faq_list_modern]',
1201 'readOnly' => true,
1202 'copyOnClick' => true,
1203 'priority' => 15,
1204 'help' => __( '<strong>You can use:</strong> [betterdocs_faq_list_modern groups="group_id" class="" group_exclude="group_id" faq_heading="Frequently Asked Questions"]', 'betterdocs' )
1205 ],
1206 'faq_classic_layout' => [
1207 'name' => 'faq_classic_layout',
1208 'type' => 'text',
1209 'label' => __( 'FAQ Layout - 2', 'betterdocs' ),
1210 'default' => '[betterdocs_faq_list_classic]',
1211 'readOnly' => true,
1212 'copyOnClick' => true,
1213 'priority' => 16,
1214 'help' => __( '<strong>You can use:</strong> [betterdocs_faq_list_classic groups="group_id" class="" group_exclude="group_id" faq_heading="Frequently Asked Questions"]', 'betterdocs' )
1215 ]
1216 ] )
1217 ] ),
1218 'tab-advance-settings' => apply_filters( 'betterdocs_settings_tab_advance', [
1219 'id' => 'tab-advance-settings',
1220 'label' => __( 'Advanced Settings', 'betterdocs' ),
1221 'priority' => 40,
1222 'fields' => [
1223 'role_management' => [
1224 'name' => 'role_management',
1225 'type' => 'section',
1226 'label' => __( 'Role Management', 'betterdocs' ),
1227 'priority' => 5,
1228 'fields' => [
1229 'article_roles' => [
1230 'name' => 'article_roles',
1231 'type' => 'select',
1232 'label' => __( 'Who Can Write Docs?', 'betterdocs' ),
1233 'priority' => 1,
1234 'multiple' => true,
1235 'search' => true,
1236 'is_pro' => true,
1237 'default' => ['administrator'],
1238 'options' => $wp_roles
1239 ],
1240 'settings_roles' => [
1241 'name' => 'settings_roles',
1242 'type' => 'select',
1243 'label' => __( 'Who Can Edit Settings?', 'betterdocs' ),
1244 'priority' => 2,
1245 'multiple' => true,
1246 'is_pro' => true,
1247 'search' => true,
1248 'default' => ['administrator'],
1249 'options' => $wp_roles
1250 ],
1251 'analytics_roles' => [
1252 'name' => 'analytics_roles',
1253 'type' => 'select',
1254 'label' => __( 'Who Can Check Analytics?', 'betterdocs' ),
1255 'priority' => 3,
1256 'multiple' => true,
1257 'is_pro' => true,
1258 'search' => true,
1259 'default' => ['administrator'],
1260 'options' => $wp_roles
1261 ]
1262 ]
1263 ],
1264 'internal_kb' => [
1265 'name' => 'internal_kb',
1266 'type' => 'section',
1267 'label' => __( 'Internal Knowledge Base', 'betterdocs' ),
1268 'priority' => 6,
1269 'fields' => apply_filters( 'betterdocs_internal_kb_fields', [
1270 'enable_content_restriction' => [
1271 'name' => 'enable_content_restriction',
1272 'type' => 'checkbox',
1273 'is_pro' => true,
1274 'priority' => 1,
1275 'label' => __( 'Enable/Disable', 'betterdocs' ),
1276 'default' => ''
1277 ],
1278 'content_visibility' => [
1279 'name' => 'content_visibility',
1280 'type' => 'select',
1281 'label' => __( 'Restrict Access to', 'betterdocs' ),
1282 'help' => __( '<strong>Note:</strong> Only selected User Roles will be able to view your Knowledge Base', 'betterdocs' ),
1283 'is_pro' => true,
1284 'priority' => 2,
1285 'multiple' => true,
1286 'search' => true,
1287 'default' => 'all',
1288 'placeholder' => __( 'Select any', 'betterdocs' ),
1289 'options' => $this->normalize_options( array_merge( [
1290 'all' => __( 'All logged in users', 'betterdocs' )
1291 ], wp_roles()->role_names ) ),
1292 'rules' => Rules::is( 'enable_content_restriction', true ),
1293 'filterValue' => 'all'
1294 ],
1295 'restrict_template' => [
1296 'name' => 'restrict_template',
1297 'type' => 'select',
1298 'label' => __( 'Restriction on Docs', 'betterdocs' ),
1299 'help' => __( '<strong>Note:</strong> Selected Docs pages will be restricted', 'betterdocs' ),
1300 'is_pro' => true,
1301 'priority' => 3,
1302 'multiple' => true,
1303 'search' => true,
1304 'default' => 'all',
1305 'placeholder' => __( 'Select any', 'betterdocs' ),
1306 'options' => $this->get_texanomy(),
1307 'rules' => Rules::is( 'enable_content_restriction', true ),
1308 'filterValue' => 'all'
1309 ],
1310 'restrict_category' => [
1311 'name' => 'restrict_category',
1312 'type' => 'select',
1313 'label' => __( 'Restriction on Docs Categories', 'betterdocs' ),
1314 'help' => __( '<strong>Note:</strong> Selected Docs categories will be restricted ', 'betterdocs' ),
1315 'is_pro' => true,
1316 'priority' => 5,
1317 'multiple' => true,
1318 'search' => true,
1319 'default' => 'all',
1320 'placeholder' => __( 'Select any', 'betterdocs' ),
1321 'options' => $this->get_terms( 'doc_category' ),
1322 'rules' => Rules::is( 'enable_content_restriction', true ),
1323 'filterValue' => 'all'
1324 ],
1325 'restricted_redirect_url' => [
1326 'name' => 'restricted_redirect_url',
1327 'type' => 'text',
1328 'label' => __( 'Redirect URL', 'betterdocs' ),
1329 'help' => __( '<strong>Note:</strong> 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' ),
1330 'default' => '',
1331 'placeholder' => 'https://',
1332 'is_pro' => true,
1333 'priority' => 6,
1334 'rules' => Rules::is( 'enable_content_restriction', true )
1335 ]
1336 ] )
1337 ]
1338 ]
1339 ] ),
1340 'tab-email-reporting' => apply_filters( 'betterdocs_settings_tab_email_reporting', [
1341 'id' => 'tab-email-reporting',
1342 'label' => __( 'Email Reporting', 'betterdocs' ),
1343 'fields' => [
1344 'enable_reporting' => [
1345 'name' => 'enable_reporting',
1346 'label' => __( 'Enable Reporting', 'betterdocs' ),
1347 'type' => 'checkbox',
1348 'priority' => 0,
1349 'default' => 0
1350 ],
1351 'reporting_frequency' => apply_filters( 'betterdocs_reporting_frequency_settings', [
1352 'name' => 'reporting_frequency',
1353 'type' => 'select',
1354 'label' => __( 'Reporting Frequency', 'betterdocs' ),
1355 'default' => 'betterdocs_weekly',
1356 'priority' => 1,
1357 'is_pro' => true,
1358 'options' => $this->normalize_options( [
1359 'betterdocs_daily' => __( 'Once Daily', 'betterdocs' ),
1360 'betterdocs_weekly' => __( 'Once Weekly', 'betterdocs' ),
1361 'betterdocs_monthly' => __( 'Once Monthly', 'betterdocs' )
1362 ] ),
1363 'rules' => Rules::is( 'enable_reporting', true )
1364 ] ),
1365 'reporting_day' => [
1366 'name' => 'reporting_day',
1367 'type' => 'select',
1368 'label' => __( 'Select Reporting Day', 'betterdocs' ),
1369 'default' => 'monday',
1370 'rules' => Rules::logicalRule( [
1371 Rules::is( 'enable_reporting', true ),
1372 Rules::is( 'reporting_frequency', 'betterdocs_weekly' )
1373 ], 'and' ),
1374 'priority' => 2,
1375 'options' => $this->normalize_options( [
1376 'sunday' => __( 'Sunday', 'betterdocs' ),
1377 'monday' => __( 'Monday', 'betterdocs' ),
1378 'tuesday' => __( 'Tuesday', 'betterdocs' ),
1379 'wednesday' => __( 'Wednesday', 'betterdocs' ),
1380 'thursday' => __( 'Thursday', 'betterdocs' ),
1381 'friday' => __( 'Friday', 'betterdocs' ),
1382 'saturday' => __( 'Saturday', 'betterdocs' )
1383 ] ),
1384 'help' => __( '<strong>Note:</strong> This is only applicable for the <strong>“Weekly”</strong> report', 'betterdocs' )
1385 ],
1386 'reporting_email' => [
1387 'name' => 'reporting_email',
1388 'type' => 'text',
1389 'label' => __( 'Reporting Email', 'betterdocs' ),
1390 'default' => get_option( 'admin_email' ),
1391 'priority' => 3,
1392 'rules' => Rules::is( 'enable_reporting', true )
1393 ],
1394 'reporting_subject' => apply_filters( 'betterdocs_reporting_subject_settings', [
1395 'name' => 'reporting_subject',
1396 'type' => 'text',
1397 'label' => __( 'Reporting Email Subject', 'betterdocs' ),
1398 'default' => wp_sprintf( __( 'Your Documentation Performance of %s Website', 'betterdocs' ), get_bloginfo( 'name' ) ),
1399 'priority' => 4,
1400 'is_pro' => true,
1401 'rules' => Rules::is( 'enable_reporting', true )
1402 ] ),
1403 'select_reporting_data' => apply_filters( 'betterdocs_select_reporting_data_settings', [
1404 'name' => 'select_reporting_data',
1405 'type' => 'select',
1406 'label' => __( 'Select Reporting Data', 'betterdocs' ),
1407 'priority' => 5,
1408 'multiple' => true,
1409 'options' => $this->normalize_options( [
1410 'overview' => 'Overview',
1411 'top-docs' => 'Top Docs',
1412 'most-search' => 'Most Searched Keywords'
1413 ] ),
1414 'default' => ['overview', 'top-docs', 'most-search'],
1415 'is_pro' => true,
1416 'rules' => Rules::is( 'enable_reporting', true )
1417 ] ),
1418 'test_report' => [
1419 'name' => 'test_report',
1420 'label' => __( 'Reporting Test', 'betterdocs' ),
1421 'text' => __( 'Test Report', 'betterdocs' ),
1422 'type' => 'button',
1423 'priority' => 6,
1424 'rules' => Rules::is( 'enable_reporting', true ),
1425 'ajax' => [
1426 'on' => 'click',
1427 'api' => '/betterdocs/v1/reporting-test',
1428 'data' => [
1429 'enable_reporting' => '@enable_reporting',
1430 'select_reporting_data' => '@select_reporting_data',
1431 'reporting_subject' => '@reporting_subject',
1432 'reporting_email' => '@reporting_email',
1433 'reporting_day' => '@reporting_day',
1434 'reporting_frequency' => '@reporting_frequency'
1435 ],
1436 'swal' => [
1437 'text' => __( 'Successfully Sent a Test Report in Your Email.', 'betterdocs' ),
1438 'icon' => 'success',
1439 'autoClose' => 2000
1440 ]
1441 ]
1442 ]
1443 ]
1444 ] ),
1445 'tab-instant-answer' => apply_filters( 'betterdocs_settings_tab_instant_answer', [
1446 'id' => 'tab-instant-answer',
1447 'name' => 'tab-instant-answer',
1448 'type' => 'section',
1449 'label' => __( 'Instant Answer', 'betterdocs' ),
1450 'priority' => 6,
1451 'fields' => [
1452 'enable_instant_answer' => [
1453 'name' => 'layout-documentation-page',
1454 'type' => 'section',
1455 'label' => __( 'Enable/Disable Instant Answer', 'betterdocs-pro' ),
1456 'priority' => 0,
1457 'fields' => [
1458 'ia_description' => [
1459 'name' => 'ia_description',
1460 'type' => 'html',
1461 'priority' => 1,
1462 'html' => wp_sprintf( '<p>%s</p>', __( 'Display a list of docs or categories in a chat-like widget to give your visitors a chance of self-learning about your website.' ) )
1463 ],
1464 'enable_disable' => [
1465 'name' => 'enable_disable',
1466 'type' => 'checkbox',
1467 'priority' => 2,
1468 'label' => __( 'Enable/Disable', 'betterdocs-pro' ),
1469 'default' => true,
1470 'is_pro' => true
1471 ],
1472 'ia_enable_preview' => [
1473 'name' => 'ia_enable_preview',
1474 'type' => 'checkbox',
1475 'label' => __( 'Enable IA Live Preview', 'betterdocs-pro' ),
1476 'priority' => 3,
1477 'default' => false,
1478 'is_pro' => true,
1479 'rules' => Rules::is( 'enable_disable', true )
1480 ]
1481 ]
1482 ],
1483 'ia_image' => [
1484 'name' => 'ia_image',
1485 'type' => 'image',
1486 'media' => [
1487 'url' => betterdocs()->assets->icon( 'ia-preview.gif', true ),
1488 'alt' => __( 'Instant Answer', 'betterdocs' )
1489 ],
1490 'priority' => 3,
1491 'rules' => Rules::logicalRule( [
1492 Rules::is( 'is_pro_active', false ),
1493 Rules::is( 'enable_disable', true, true )
1494 ], 'or' )
1495 ]
1496 ]
1497 ] )
1498 ] )
1499 ];
1500
1501 return apply_filters( 'betterdocs_settings_args', $settings );
1502 }
1503
1504 public function normalize_options( $options ) {
1505 return GlobalFields::normalize_fields( $options );
1506 }
1507
1508 public function get_texanomy() {
1509 $docs_tax = $this->database->get_cache( 'betterdocs::settings::taxonomies' );
1510
1511 if ( $docs_tax ) {
1512 return $docs_tax;
1513 }
1514
1515 $taxonomies = get_taxonomies( [
1516 'object_type' => ['docs']
1517 ], 'objects' );
1518
1519 $docs_tax = [
1520 'all' => 'All Docs Archive',
1521 'docs' => 'Docs Page'
1522 ];
1523 foreach ( $taxonomies as $key => $value ) {
1524 $docs_tax[$key] = $value->label;
1525 }
1526 unset( $docs_tax['doc_tag'] );
1527
1528 $docs_tax = $this->normalize_options( $docs_tax );
1529 if ( count( $docs_tax ) > 2 ) {
1530 $this->database->set_cache( 'betterdocs::settings::taxonomies', $docs_tax );
1531 }
1532
1533 return $docs_tax;
1534 }
1535
1536 public function get_terms( $taxonomy ) {
1537 $_cache_key = 'betterdocs::settings::terms::' . trim( $taxonomy );
1538 $docs_tax = $this->database->get_cache( $_cache_key );
1539
1540 if ( $docs_tax ) {
1541 return $docs_tax;
1542 }
1543
1544 $get_terms = get_terms( [
1545 'taxonomy' => $taxonomy,
1546 'hide_empty' => false
1547 ] );
1548
1549 $terms = [
1550 'all' => 'All'
1551 ];
1552
1553 if ( ! empty( $get_terms ) && ! is_wp_error( $get_terms ) ) {
1554 foreach ( $get_terms as $value ) {
1555 if ( isset( $value->slug ) && isset( $value->name ) ) {
1556 $terms[$value->slug] = $value->name;
1557 }
1558 }
1559 }
1560
1561 $terms = $this->normalize_options( $terms );
1562 if ( count( $terms ) > 1 ) {
1563 $this->database->set_cache( $_cache_key, $terms );
1564 }
1565
1566 return $terms;
1567 }
1568
1569 public function hide_roles_management( $tabData = [] ){
1570 global $current_user;
1571
1572 if( $current_user instanceof WP_User && ! in_array( 'administrator', $current_user->roles ) ) {
1573 unset( $tabData['fields']['role_management'] );
1574 }
1575
1576 return $tabData;
1577 }
1578 }
1579