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

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