PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 4.9.2
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v4.9.2
4.9.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 All 200 releases
← All changes | includes/Core/Settings.php +2637 -1605 3.5.14.9.2 View file →
@@ -1,14 +1,23 @@
1 1 <?php
2 +namespace WPDeveloper\BetterDocs\Core;
2 3
3 -namespace WPDeveloper\BetterDocs\Core;
4 +if ( ! defined( 'ABSPATH' ) ) {
5 + exit;
6 +}
4 7
8 +
9 +use WP_Error;
5 10 use WP_User;
6 -use WP_Error;
11 +use WPDeveloper\BetterDocs\Admin\Builder\GlobalFields;
12 +use WPDeveloper\BetterDocs\Admin\Builder\Rules;
13 +use WPDeveloper\BetterDocs\AI\ModelRegistry;
14 +use WPDeveloper\BetterDocs\AI\ProviderFactory;
15 +use WPDeveloper\BetterDocs\REST\AIEdit;
16 +use WPDeveloper\BetterDocs\Utils\AIHelper;
7 17 use WPDeveloper\BetterDocs\Utils\Base;
8 18 use WPDeveloper\BetterDocs\Utils\Database;
9 -use WPDeveloper\BetterDocs\Admin\Builder\Rules;
10 -use WPDeveloper\BetterDocs\Admin\Builder\GlobalFields;
19 +use WPDeveloper\BetterDocs\Utils\Helper;
11 20
12 21 class Settings extends Base {
13 22 public $base_key = 'betterdocs_settings';
14 23
@@ -17,11 +26,11 @@
17 26 * @var Database
18 27 */
19 28 protected $database;
20 29
21 - private $deprecated = [];
30 + private $deprecated = array();
22 31
23 - private $cannot_be_empty = [
32 + private $cannot_be_empty = array(
24 33 'breadcrumb_doc_title',
25 34 'docs_slug',
26 35 'category_slug',
27 36 'tag_slug',
@@ -26,37 +35,39 @@
26 35 'category_slug',
27 36 'tag_slug',
28 37 'permalink_structure',
29 38 'docs_page'
30 - ];
39 + );
31 40
32 41 public function __construct( Database $database ) {
33 42 $this->database = $database;
34 43 $this->deprecated = $this->deprecated_settings();
35 44
36 - add_filter( 'betterdocs_settings_tabs', [$this, 'import_export_settings'] );
45 + add_filter( 'betterdocs_settings_tabs', array( $this, 'import_export_settings' ) );
46 + add_filter( 'betterdocs_settings_tabs', array( $this, 'maybe_remove_git_tab' ), 20 );
37 47
38 - add_action( 'admin_enqueue_scripts', [$this, 'enqueue'] );
48 + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_old' ), 99 );
49 + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ), 99 );
39 50
40 - if ( isset( $_GET['page'] ) && $_GET['page'] === 'betterdocs-settings' && ! has_action( 'betterdocs_settings_header' ) ) {
41 - add_action( 'betterdocs_settings_header', [$this, 'header'] );
42 - }
51 + // if ( isset( $_GET['page'] ) && $_GET['page'] === 'betterdocs-settings' && ! has_action( 'betterdocs_settings_header' ) ) {
52 + // add_action( 'betterdocs_settings_header', [ $this, 'header' ] );
53 + // }
43 54
44 - add_action( 'wp_ajax_betterdocs_dark_mode', [$this, 'dark_mode'] );
45 - add_filter( 'betterdocs_settings_tab_advance', [$this, 'hide_roles_management'], 11, 1 );
46 - add_action( 'betterdocs::settings::saved', [$this, 'fallback_slugs'], 99, 3 );
55 + add_action( 'wp_ajax_betterdocs_dark_mode', array( $this, 'dark_mode' ) );
56 + add_filter( 'betterdocs_settings_tab_advance', array( $this, 'hide_roles_management' ), 11, 1 );
57 + add_action( 'betterdocs::settings::saved', array( $this, 'fallback_slugs' ), 99, 3 );
47 58 }
48 59
49 - public function fallback_slugs( $_saved, $_settings, $_old_settings = [] ) {
60 + public function fallback_slugs( $_saved, $_settings, $_old_settings = array() ) {
50 61 $_default = $this->get_default();
51 62 foreach ( $this->cannot_be_empty as $key ) {
52 - if ( $key === 'docs_page' && ! $_settings['builtin_doc_page'] && empty( $_settings[$key] ) ) {
63 + if ( 'docs_page' === $key && ! $_settings[ 'builtin_doc_page' ] && empty( $_settings[ $key ] ) ) {
53 64 $this->save( 'builtin_doc_page', true );
54 65 continue;
55 66 }
56 67
57 - if ( empty( $_settings[$key] ) ) {
58 - $this->save( $key, $_default[$key] );
68 + if ( empty( $_settings[ $key ] ) ) {
69 + $this->save( $key, $_default[ $key ] );
59 70 }
60 71 }
61 72 }
62 73
@@ -68,8 +79,31 @@
68 79 return esc_url( admin_url( 'admin.php?page=betterdocs-settings' ) );
69 80 }
70 81
71 82 /**
83 + * Settings keys holding secret API keys. These are masked before reaching
84 + * the browser, stripped for non-admins, and never persisted as their mask.
85 + *
86 + * Covers the AI Chatbot key plus every content-suite platform key. OpenAI's
87 + * is `ai_autowrite_api_key` (see ProviderFactory::key_field_for), hence the
88 + * dedupe.
89 + *
90 + * @return array<int,string>
91 + */
92 + public static function sensitive_api_key_fields() {
93 + $fields = array(
94 + ProviderFactory::OPENAI_KEY_FIELD,
95 + 'ai_chatbot_api_key',
96 + );
97 + foreach ( array_keys( ModelRegistry::platforms() ) as $platform ) {
98 + $fields[] = ProviderFactory::key_field_for( $platform );
99 + }
100 + // Add-ons (e.g. the AI Chatbot) register their own per-platform keys here
101 + // so they are masked in the browser and stripped for non-admins.
102 + return apply_filters( 'betterdocs_sensitive_api_key_fields', array_values( array_unique( $fields ) ) );
103 + }
104 +
105 + /**
72 106 * This method is responsible for enqueueing scripts in settings panel
73 107 *
74 108 * @param string $hook
75 109 *
@@ -76,19 +110,54 @@
76 110 * @return void
77 111 * @since 2.5.0
78 112 */
79 113 public function enqueue( $hook ) {
80 - if ( $hook !== 'betterdocs_page_betterdocs-settings' ) {
114 + if ( ! betterdocs()->is_betterdocs_screen( $hook ) ) {
81 115 return;
82 116 }
83 117
118 + wp_enqueue_media();
84 119 wp_enqueue_script( 'betterdocs-admin' );
85 - betterdocs()->assets->enqueue( 'betterdocs-settings', 'admin/css/settings.css' );
120 +
121 + $settings = GlobalFields::normalize( $this->settings_args() );
122 +
123 + // Mask sensitive API keys before they reach the browser. Non-admins still get them stripped entirely below.
124 + $sensitive_api_keys = self::sensitive_api_key_fields();
125 + foreach ( $sensitive_api_keys as $api_key_field ) {
126 + if ( ! empty( $settings[ 'values' ][ $api_key_field ] ) ) {
127 + $settings[ 'values' ][ $api_key_field ] = Helper::mask_api_key( $settings[ 'values' ][ $api_key_field ] );
128 + }
129 + }
130 +
131 + if ( ! current_user_can( 'edit_docs_settings' ) ) {
132 + foreach ( $sensitive_api_keys as $api_key_field ) {
133 + if ( isset( $settings[ 'values' ][ $api_key_field ] ) ) {
134 + unset( $settings[ 'values' ][ $api_key_field ] );
135 + }
136 + }
137 + }
138 +
139 + // Inject raw git settings to bypass get() fallback (e.g., '' -> 'docs')
140 + if ( isset( $settings[ 'values' ] ) ) {
141 + $settings[ 'values' ][ 'git_provider' ] = $this->get_raw_field( 'git_provider', 'github' );
142 + $settings[ 'values' ][ 'git_repository_url' ] = $this->get_raw_field( 'git_repository_url', '' );
143 + $settings[ 'values' ][ 'git_branch' ] = $this->get_raw_field( 'git_branch', '' );
144 + $settings[ 'values' ][ 'git_docs_directory' ] = $this->get_raw_field( 'git_docs_directory', '' );
145 + }
146 +
147 + betterdocs()->assets->localize( 'betterdocs-admin', 'betterdocsAdminSettings', $settings );
86 148 betterdocs()->assets->enqueue( 'betterdocs-icons', 'admin/btd-icon/style.css' );
87 - betterdocs()->assets->enqueue( 'betterdocs-settings', 'admin/js/settings.js' );
88 - betterdocs()->assets->localize( 'betterdocs-settings', 'betterdocsAdminSettings', GlobalFields::normalize( $this->settings_args() ) );
89 149 }
90 150
151 + public function enqueue_old( $hook ) {
152 + // FREE & Pro Version Compatibility Check
153 + if ( ! betterdocs()->is_betterdocs_screen( $hook ) ) {
154 + return;
155 + }
156 +
157 + $this->enqueue( 'betterdocs_page_betterdocs-settings' );
158 + }
159 +
91 160 /**
92 161 * This method is responsible for printing header in dashboard settings page.
93 162 *
94 163 * @param string $hook
@@ -96,9 +165,9 @@
96 165 * @return void
97 166 * @since 2.5.0
98 167 */
99 168 public function header( $hook ) {
100 - if ( $hook !== 'settings' ) {
169 + if ( 'settings' !== $hook ) {
101 170 return;
102 171 }
103 172
104 173 betterdocs()->views->get( 'admin/template-parts/settings-header' );
@@ -111,9 +180,9 @@
111 180 * @return array
112 181 * @since 2.5.0
113 182 */
114 183 public function deprecated_settings() {
115 - return [];
184 + return array();
116 185 }
117 186
118 187 /**
119 188 * Dynamic migration caller.
@@ -122,12 +191,12 @@
122 191 * @since 2.5.0
123 192 */
124 193 public function migration( $version ) {
125 194 if ( $version > 250 ) {
126 - for ( $v = 250; $v <= $version; $v++ ) {
195 + for ( $v = 250; $v <= $version; ++$v ) {
127 196 $_func = "v{$v}";
128 197 if ( method_exists( $this, $_func ) ) {
129 - call_user_func( [$this, $_func] );
198 + call_user_func( array( $this, $_func ) );
130 199 }
131 200 }
132 201 }
133 202 }
@@ -143,9 +212,9 @@
143 212 $this->save( 'terms_orderby', 'name' );
144 213 }
145 214
146 215 if ( $orderby = $this->get( 'alphabetically_order_post', false ) ) {
147 - if ( $orderby === '1' ) {
216 + if ( '1' === $orderby ) {
148 217 $this->save( 'alphabetically_order_post', 'title' );
149 218 }
150 219 }
151 220 }
@@ -157,82 +226,143 @@
157 226 * @since 1.0.0
158 227 *
159 228 */
160 229 public function get_default() {
161 - $_default = [
162 - 'multiple_kb' => '',
163 - 'builtin_doc_page' => true,
164 - 'breadcrumb_doc_title' => __( 'Docs', 'betterdocs' ),
165 - 'docs_slug' => 'docs',
166 - 'docs_page' => 0,
167 - 'category_slug' => 'docs-category',
168 - 'tag_slug' => 'docs-tag',
169 - 'permalink_structure' => 'docs/',
170 - 'enable_faq_schema' => false,
171 - 'live_search' => true,
172 - 'advance_search' => false,
173 - 'popular_keyword_limit' => 5,
174 - 'search_letter_limit' => 3,
175 - 'search_placeholder' => __( 'Search...', 'betterdocs' ),
176 - 'search_not_found_text' => __( 'Sorry, no docs were found.', 'betterdocs' ),
177 - 'search_result_image' => true,
178 - 'masonry_layout' => true,
179 - 'category_title_link' => false,
180 - 'terms_orderby' => 'betterdocs_order',
181 - 'alphabetically_order_term' => false,
182 - 'terms_order' => 'ASC',
183 - 'alphabetically_order_post' => 'betterdocs_order',
184 - 'docs_order' => 'ASC',
185 - 'nested_subcategory' => false,
186 - 'column_number' => 3,
187 - 'posts_number' => 10,
188 - 'post_count' => true,
189 - 'count_text' => __( 'docs', 'betterdocs' ),
190 - 'count_text_singular' => __( 'doc', 'betterdocs' ),
191 - 'exploremore_btn' => true,
192 - 'exploremore_btn_txt' => __( 'Explore More', 'betterdocs' ),
193 - 'doc_single' => 1,
194 - 'enable_toc' => true,
195 - 'toc_title' => __( 'Table of Contents', 'betterdocs' ),
196 - 'toc_hierarchy' => true,
197 - 'toc_list_number' => true,
198 - 'toc_dynamic_title' => false,
199 - 'enable_sticky_toc' => true,
200 - 'sticky_toc_offset' => 100,
201 - 'collapsible_toc_mobile' => false,
202 - 'supported_heading_tag' => ['1', '2', '3', '4', '5', '6'],
203 - 'enable_post_title' => true,
204 - 'title_link_ctc' => true,
205 - 'enable_breadcrumb' => true,
206 - 'breadcrumb_home_text' => __( 'Home', 'betterdocs' ),
207 - 'breadcrumb_home_url' => get_home_url(),
230 + $_default = array(
231 + 'multiple_kb' => '',
232 + 'enable_ai_sample_docs' => true,
233 + 'enable_export_faq' => true,
234 + 'builtin_doc_page' => true,
235 + 'breadcrumb_doc_title' => __( 'Docs', 'betterdocs' ),
236 + 'enable_category_hierarchy_slugs' => false,
237 + 'docs_slug' => 'docs',
238 + 'docs_page' => 0,
239 + 'category_slug' => 'docs-category',
240 + 'tag_slug' => 'docs-tag',
241 + 'permalink_structure' => 'docs/',
242 + 'enable_faq_schema' => false,
243 + 'live_search' => true,
244 + 'advance_search' => false,
245 + 'popular_keyword_limit' => 5,
246 + 'search_letter_limit' => 3,
247 + 'search_placeholder' => __( 'Search...', 'betterdocs' ),
248 + 'search_not_found_text' => __( 'Sorry, no docs were found.', 'betterdocs' ),
249 + 'search_result_image' => true,
250 + 'search_modal_search_type' => 'all',
251 + 'masonry_layout' => true,
252 + 'docs_list_icon' => array(),
253 + 'category_title_link' => false,
254 + 'terms_orderby' => 'betterdocs_order',
255 + 'alphabetically_order_term' => false,
256 + 'terms_order' => 'ASC',
257 + 'alphabetically_order_post' => 'betterdocs_order',
258 + 'docs_order' => 'ASC',
259 + 'nested_subcategory' => false,
260 + 'column_number' => 3,
261 + 'posts_number' => 10,
262 + 'post_count' => true,
263 + 'count_text' => __( 'Docs', 'betterdocs' ),
264 + 'count_text_singular' => __( 'Doc', 'betterdocs' ),
265 + 'exploremore_btn' => true,
266 + 'exploremore_btn_txt' => __( 'Explore More', 'betterdocs' ),
267 + 'doc_single' => 1,
268 + 'enable_toc' => true,
269 + 'toc_title' => __( 'Table of Contents', 'betterdocs' ),
270 + 'toc_hierarchy' => true,
271 + 'toc_list_number' => false,
272 + 'toc_dynamic_title' => false,
273 + 'enable_sticky_toc' => true,
274 + 'sticky_toc_offset' => 100,
275 + 'collapsible_toc_mobile' => false,
276 + 'supported_heading_tag' => array( '1', '2', '3', '4', '5', '6' ),
277 + 'enable_post_title' => true,
278 + 'title_link_ctc' => true,
279 + 'enable_breadcrumb' => true,
280 + 'breadcrumb_home_text' => __( 'Home', 'betterdocs' ),
281 + 'enable_breadcrumb_home_text' => true,
282 + 'breadcrumb_home_url' => get_home_url(),
208 283 'enable_breadcrumb_category' => true,
209 - 'enable_breadcrumb_title' => true,
210 - 'enable_sidebar_cat_list' => true,
211 - 'enable_print_icon' => true,
212 - 'enable_tags' => true,
213 - 'email_feedback' => true,
214 - 'feedback_link_text' => __( 'Still stuck? How can we help?', 'betterdocs' ),
215 - 'feedback_url' => '',
216 - 'feedback_form_title' => __( 'How can we help?', 'betterdocs' ),
217 - 'email_address' => get_option( 'admin_email' ),
218 - 'show_last_update_time' => true,
219 - 'enable_navigation' => true,
220 - 'enable_comment' => true,
221 - 'enable_credit' => true,
222 - 'enable_archive_sidebar' => true,
284 + 'enable_breadcrumb_title' => true,
285 + 'enable_sidebar_cat_list' => true,
286 + 'enable_print_icon' => true,
287 + 'print_enable_logo' => false,
288 + 'print_logo' => array(),
289 + 'print_enable_footer' => false,
290 + 'print_footer_text' => '',
291 + 'enable_tags' => true,
292 + 'email_feedback' => true,
293 + 'feedback_link_text' => __( 'Still stuck? How can we help?', 'betterdocs' ),
294 + 'reaction_feedback_text' => __( 'Thanks for your feedback', 'betterdocs' ),
295 + 'feedback_url' => '',
296 + 'feedback_form_title' => __( 'How can we help?', 'betterdocs' ),
297 + 'email_address' => get_option( 'admin_email' ),
298 + 'show_last_update_time' => true,
299 + 'enable_navigation' => true,
300 + 'enable_comment' => true,
301 + 'enable_credit' => false,
302 + 'enable_archive_sidebar' => true,
223 303 'archive_nested_subcategory' => true,
304 + 'archive_enable_pagination' => false,
305 + 'archive_lazy_load_descendants' => false,
224 306 'enable_content_restriction' => false,
225 - 'enable_reporting' => false,
226 - 'enable_sample_data' => false,
227 - 'reporting_day' => 'monday',
228 - 'reporting_email' => get_option( 'admin_email' ),
229 - 'enable_write_with_ai' => true,
230 - 'enable_faq_write_with_ai' => true,
231 - 'ai_autowrite_api_key' => '',
232 - 'ai_autowrite_max_token' => 1500,
233 - 'enable_estimated_reading_time' => false
234 - ];
307 + 'enable_reporting' => false,
308 + 'enable_sample_data' => false,
309 + 'reporting_day' => 'monday',
310 + 'reporting_email' => get_option( 'admin_email' ),
311 + 'enable_write_with_ai' => true,
312 + 'enable_faq_write_with_ai' => true,
313 + 'enable_glossaries_write_with_ai' => true,
314 + 'enable_docs_ai_suite' => true,
315 + 'write_with_ai_model' => 'gpt-4o-mini',
316 + 'ai_autowrite_api_key' => '',
317 + 'ai_autowrite_max_token' => 2500,
318 + 'write_with_ai_instructions' => array(
319 + array(
320 + 'id' => 'default',
321 + 'title' => __( 'Default/Core', 'betterdocs' ),
322 + 'content' => WriteWithAI::default_instruction_content()
323 + )
324 + ),
325 + 'ai_edit_actions' => AIEdit::default_actions(),
326 + 'enable_article_summary' => false,
327 + 'article_summary_model' => 'gpt-4o-mini',
328 + 'article_summary_max_token' => 1500,
329 + // Multi-platform AI (content suite). `ai_platform` selects the active
330 + // provider; `ai_model` is the single global model; keys are stored
331 + // per platform so switching never loses a saved key. OpenAI reuses
332 + // `ai_autowrite_api_key` above — it has always held an OpenAI key,
333 + // so nothing needs migrating.
334 + 'ai_platform' => 'openai',
335 + 'ai_model' => 'gpt-4o-mini',
336 + 'ai_api_key_gemini' => '',
337 + 'ai_api_key_claude' => '',
338 + 'ai_api_key_deepseek' => '',
339 + 'ai_api_key_openrouter' => '',
340 + 'enable_estimated_reading_time' => true,
341 + 'enable_encyclopedia' => false,
342 + 'enable_glossaries' => false,
343 + 'show_glossary_suggestions' => true,
344 + 'enable_ai_chatbot' => false,
345 + 'estimated_reading_time_title' => '',
346 + 'estimated_reading_time_text' => __( 'min read', 'betterdocs' ),
347 + 'singular_estimated_reading_time_text' => __( 'min read', 'betterdocs' ),
348 + 'betterdocs_access_control_repeater' => array(),
349 + 'internal_knowledge_base_type' => 'basic',
350 + 'betterdocs_access_control_repeater_kb' => array(),
351 + 'enable_git_integration' => false,
352 + /**
353 + * MCP master switch. Off by default; the toggle lives on the
354 + * BetterDocs → MCP page, not in the settings tree, and writes
355 + * through POST betterdocs/v1/settings.
356 + *
357 + * The key has to be listed here or `get()` cannot see it at all:
358 + * it answers `$default` for anything absent from the defaults
359 + * array, whatever the stored option holds.
360 + *
361 + * @since 4.9.0
362 + */
363 + 'enable_mcp' => ''
364 + );
235 365
236 366 $_default = apply_filters( 'betterdocs_default_settings', $_default );
237 367 // $_default = apply_filters_deprecated(
238 368 // 'betterdocs_option_default_settings', [$_default], '2.5.0',
@@ -248,34 +378,98 @@
248 378 * @return array
249 379 * @since 2.5.0
250 380 */
251 381 public function get_pro_defaults() {
252 - return [];
382 + return array();
253 383 }
254 384
385 + public function is_elementor_pro() {
386 + return is_plugin_active( 'elementor-pro/elementor-pro.php' );
387 + }
388 +
255 389 /**
256 - * Get customizer links for docs page.
390 + * Get full site editor links for docs page.
257 391 *
258 392 * @return string
259 - * @since 1.0.0
393 + * @since 3.5.8
260 394 */
395 + public function gutenberg_link() {
396 + if ( betterdocs()->helper->current_theme_is_fse_theme() ) {
397 + return admin_url( 'site-editor.php?postType=wp_template&postId=betterdocs/betterdocs//archive-docs' );
398 + } else {
399 + return 'https://betterdocs.co/docs/betterdocs-provides-full-site-editor-support/';
400 + }
401 + }
402 +
403 + /**
404 + * Get elementor theme builder link for docs page.
405 + *
406 + * @return string
407 + * @since 3.5.8
408 + */
409 + public function elementor_link() {
410 + if ( $this->is_elementor_pro() ) {
411 + return admin_url( 'admin.php?page=elementor-app#/site-editor/templates/doc-archive' );
412 + } else {
413 + return 'https://betterdocs.co/docs/docs-page-with-elementor/';
414 + }
415 + }
416 +
261 417 public function customizer_link() {
262 - $query['autofocus[panel]'] = 'betterdocs_customize_options';
263 - $query['return'] = admin_url( 'edit.php?post_type=docs' );
264 - $builtin_doc_page = betterdocs()->settings->get( 'builtin_doc_page' );
265 - $docs_slug = betterdocs()->settings->get( 'docs_slug' );
266 - $docs_page = betterdocs()->settings->get( 'builtin_doc_page' );
418 + $query[ 'autofocus[panel]' ] = 'betterdocs_customize_options';
419 + $query[ 'return' ] = admin_url( 'edit.php?post_type=docs' );
420 + $builtin_doc_page = betterdocs()->settings->get( 'builtin_doc_page' );
421 + $docs_slug = betterdocs()->settings->get( 'docs_slug' );
422 + $docs_page = betterdocs()->settings->get( 'builtin_doc_page' );
267 423
268 - if ( $builtin_doc_page == 1 && $docs_slug ) {
269 - $query['url'] = site_url( '/' . $docs_slug );
270 - } elseif ( $builtin_doc_page != 1 && $docs_page ) {
271 - $post_info = get_post( $docs_page );
272 - $query['url'] = site_url( '/' . $post_info->post_name );
424 + if ( 1 == $builtin_doc_page && $docs_slug ) {
425 + $query[ 'url' ] = site_url( '/' . $docs_slug );
426 + } elseif ( 1 != $builtin_doc_page && $docs_page ) {
427 + $post_info = get_post( $docs_page );
428 + $query[ 'url' ] = site_url( '/' . $post_info->post_name );
273 429 }
274 430
275 431 return add_query_arg( $query, admin_url( 'customize.php' ) );
276 432 }
277 433
434 + public function design_tab() {
435 + $settings = array();
436 +
437 + $settings[ 'gutenberg_link' ] = array(
438 + 'name' => 'gutenberg_link',
439 + 'type' => 'action',
440 + 'action' => 'betterdocs_settings_gutenberg_link',
441 + 'button' => betterdocs()->helper->current_theme_is_fse_theme() ? __( 'Design with Gutenberg', 'betterdocs' ) : __( 'Learn More', 'betterdocs' ),
442 + 'url' => $this->gutenberg_link(),
443 + 'customizer_img' => betterdocs()->assets->icon( 'customizer/gutenberg-preview.png', true ),
444 + 'priority' => 1
445 + );
446 +
447 + $settings[ 'elementor_link' ] = array(
448 + 'name' => 'elementor_link',
449 + 'type' => 'action',
450 + 'action' => 'betterdocs_settings_elementor_link',
451 + 'button' => $this->is_elementor_pro() ? __( 'Design with Elementor', 'betterdocs' ) : __( 'Learn More', 'betterdocs' ),
452 + 'url' => $this->elementor_link(),
453 + 'customizer_img' => betterdocs()->assets->icon( 'customizer/elementor-preview.png', true ),
454 + 'priority' => 2
455 + );
456 +
457 + if ( ! betterdocs()->helper->current_theme_is_fse_theme() ) {
458 + $settings[ 'customizer_link' ] = array(
459 + 'name' => 'customizer_link',
460 + 'type' => 'action',
461 + 'action' => 'betterdocs_settings_customizer_link',
462 + 'button' => __( 'Customize in BetterDocs', 'betterdocs' ),
463 + 'url' => $this->customizer_link(),
464 + 'customizer_img' => betterdocs()->assets->icon( 'customizer/customizer-preview.png', true ),
465 + 'priority' => 3
466 + );
467 + }
468 +
469 + return $settings;
470 + }
471 +
278 472 /**
279 473 * Get All Roles
280 474 * dynamically
281 475 *
@@ -282,9 +476,9 @@
282 476 * @return array
283 477 */
284 478 public function get_roles() {
285 479 $roles = wp_roles()->role_names;
286 - unset( $roles['subscriber'] );
480 + unset( $roles[ 'subscriber' ] );
287 481
288 482 return $roles;
289 483 }
290 484
@@ -298,10 +492,11 @@
298 492 if ( ! check_ajax_referer( 'doc_cat_order_nonce', 'nonce', false ) ) {
299 493 wp_send_json_error();
300 494 }
301 495
302 - if ( isset( $_POST['mode'] ) ) {
303 - if ( $this->save( 'dark_mode', rest_sanitize_boolean( $_POST['mode'] ) ) ) {
496 + if ( isset( $_POST[ 'mode' ] ) ) {
497 + $mode = sanitize_text_field( wp_unslash( $_POST[ 'mode' ] ) );
498 + if ( $this->save( 'dark_mode', rest_sanitize_boolean( $mode ) ) ) {
304 499 wp_send_json_success();
305 500 }
306 501 }
307 502
@@ -310,9 +505,9 @@
310 505
311 506 public function get_normalized_value( $key, $value, $default = null ) {
312 507 $_origin_value = $_value = $value;
313 508
314 - if ( in_array( $_value, ['on', 'off', '1', 'false', 'true'], true ) ) {
509 + if ( in_array( $_value, array( 'on', 'off', '1', 'false', 'true' ), true ) ) {
315 510 switch ( $_value ) {
316 511 case 'on':
317 512 case 'ON':
318 513 case '1':
@@ -332,17 +527,17 @@
332 527
333 528 return $_value;
334 529 }
335 530
336 - public function get_normalized_values( $values, $default_values = [] ) {
531 + public function get_normalized_values( $values, $default_values = array() ) {
337 532 if ( empty( $values ) ) {
338 - return [];
533 + return array();
339 534 }
340 535
341 - $_settings = [];
536 + $_settings = array();
342 537 foreach ( $values as $key => $value ) {
343 - $_default_value = isset( $default_values[$key] ) ? $default_values[$key] : null;
344 - $_settings[$key] = $this->get_normalized_value( $key, $value, $_default_value );
538 + $_default_value = isset( $default_values[ $key ] ) ? $default_values[ $key ] : null;
539 + $_settings[ $key ] = $this->get_normalized_value( $key, $value, $_default_value );
345 540 }
346 541
347 542 return $_settings;
348 543 }
@@ -347,9 +542,9 @@
347 542 return $_settings;
348 543 }
349 544
350 545 public function get_all( $raw = false ) {
351 - $_default_settings = $raw ? [] : array_merge( $this->get_default(), $this->get_pro_defaults() );
546 + $_default_settings = $raw ? array() : array_merge( $this->get_default(), $this->get_pro_defaults() );
352 547 $_settings = $this->database->get( $this->base_key, $_default_settings );
353 548
354 549 return $this->get_normalized_values( $_settings, $_default_settings );
355 550 }
@@ -354,9 +549,9 @@
354 549 return $this->get_normalized_values( $_settings, $_default_settings );
355 550 }
356 551
357 552 public function type_validation( &$value, $defaultValue = null ) {
358 - if ( $defaultValue !== null ) {
553 + if ( null !== $defaultValue ) {
359 554 /**
360 555 * Check if value is not in same type
361 556 */
362 557 $_default_type = gettype( $defaultValue );
@@ -386,28 +581,28 @@
386 581
387 582 $_value = $default;
388 583 switch ( true ) {
389 584 // Check if it's a PRO Option
390 - case ! isset( $_default_settings[$key] ):
585 + case ! isset( $_default_settings[ $key ] ):
391 586 $_value = $default;
392 587 break;
393 588 // Check if it's a FREE Option and not in DB.
394 - case ! isset( $_settings[$key] ) && isset( $_default_settings[$key] ):
395 - $_value = $default !== null ? $default : $_default_settings[$key];
589 + case ! isset( $_settings[ $key ] ) && isset( $_default_settings[ $key ] ):
590 + $_value = null !== $default ? $default : $_default_settings[ $key ];
396 591 break;
397 592 // Check if it's a FREE Option
398 - case isset( $_settings[$key] ) && isset( $_default_settings[$key] ):
399 - $_value = $_settings[$key];
593 + case isset( $_settings[ $key ] ) && isset( $_default_settings[ $key ] ):
594 + $_value = $_settings[ $key ];
400 595 break;
401 596 }
402 597
403 - $_value = $this->get_normalized_value( $key, $_value, isset( $_default_settings[$key] ) ? $_default_settings[$key] : null );
598 + $_value = $this->get_normalized_value( $key, $_value, isset( $_default_settings[ $key ] ) ? $_default_settings[ $key ] : null );
404 599
405 600 if ( gettype( $_value ) === 'string' ) {
406 - if ( empty( $_value ) && $default != null ) {
601 + if ( empty( $_value ) && null != $default ) {
407 602 $_value = $default;
408 - } elseif ( empty( $_value ) && $default === null && isset( $_default_settings[$key] ) ) {
409 - $_value = $_default_settings[$key];
603 + } elseif ( empty( $_value ) && null === $default && isset( $_default_settings[ $key ] ) ) {
604 + $_value = $_default_settings[ $key ];
410 605 }
411 606 }
412 607
413 608 return $_value;
@@ -413,12 +608,12 @@
413 608 return $_value;
414 609 }
415 610
416 611 public function get_raw_field( $key, $default = null ) {
417 - $_settings = $this->database->get( $this->base_key, [] );
612 + $_settings = $this->database->get( $this->base_key, array() );
418 613
419 - if ( isset( $_settings[$key] ) ) {
420 - return $this->get_normalized_value( $key, $_settings[$key], $default );
614 + if ( isset( $_settings[ $key ] ) ) {
615 + return $this->get_normalized_value( $key, $_settings[ $key ], $default );
421 616 }
422 617
423 618 return $default;
424 619 }
@@ -423,10 +618,10 @@
423 618 return $default;
424 619 }
425 620
426 621 public function save( $key, $value ) {
427 - $_settings = $this->database->get( $this->base_key, [] );
428 - $_settings[$key] = $value;
622 + $_settings = $this->database->get( $this->base_key, array() );
623 + $_settings[ $key ] = $value;
429 624
430 625 return $this->database->save( $this->base_key, $_settings );
431 626 }
432 627
@@ -435,20 +630,124 @@
435 630 if ( ! current_user_can( 'edit_docs_settings' ) ) {
436 631 return new WP_Error( 'unauthorized_action', __( 'You don\'t have any rights for saving settings.', 'betterdocs' ) );
437 632 }
438 633
634 + // The frontend sends the currently-active settings tab as a transport-only hint so
635 + // tab-scoped validation (the AI min-token floor below) only runs when that tab is being
636 + // saved. It must never be persisted into the settings option.
637 + $active_tab = '';
638 + if ( array_key_exists( '_active_tab', $settings ) ) {
639 + $active_tab = (string) $settings[ '_active_tab' ];
640 + unset( $settings[ '_active_tab' ] );
641 + }
642 +
643 + // Quickbuilder sends back the full UI-loaded payload. To avoid overwriting values that we
644 + // asynchronously updated in the DB via AJAX (like Git integration fields), we strictly remove them
645 + // from the incoming save payload so that the freshly loaded `$_old_settings` values persist.
646 + $exclude_ajax_keys = array( 'git_provider', 'git_repository_url', 'git_branch', 'git_docs_directory' );
647 + foreach ( $exclude_ajax_keys as $key ) {
648 + if ( array_key_exists( $key, $settings ) ) {
649 + unset( $settings[ $key ] );
650 + }
651 + if ( isset( $settings[ 'values' ] ) && is_array( $settings[ 'values' ] ) && array_key_exists( $key, $settings[ 'values' ] ) ) {
652 + unset( $settings[ 'values' ][ $key ] );
653 + }
654 + }
655 +
439 656 $_old_settings = $this->database->get( $this->base_key, $this->get_default() );
657 +
658 + // The frontend only ever sees masked API keys. A submitted value that still looks like a
659 + // mask (contains a run of asterisks — no real key does) means "unchanged": restore the
660 + // stored original so a mask string is never persisted. Guarding on the mask SHAPE rather
661 + // than strict equality with mask(stored) closes the corruption loop QA hit: once a mask
662 + // slips into storage, mask(mask) === mask, so an equality-only guard would faithfully
663 + // preserve the corrupted value forever (round-2 follow-up #1). When the stored value is
664 + // itself mask-shaped it is unrecoverable — clear it so the UI and the GeoIP/GA4 status
665 + // surfaces honestly report a missing key instead of failing downstream with 401s.
666 + $sensitive_api_keys = self::sensitive_api_key_fields();
667 + foreach ( $sensitive_api_keys as $api_key_field ) {
668 + if ( ! isset( $settings[ $api_key_field ] ) ) {
669 + continue;
670 + }
671 + $incoming = trim( (string) $settings[ $api_key_field ] );
672 + $stored = isset( $_old_settings[ $api_key_field ] ) ? (string) $_old_settings[ $api_key_field ] : '';
673 + $stored_is_mask = '' !== $stored && preg_match( '/\*{4,}/', $stored );
674 +
675 + if ( '' !== $incoming && preg_match( '/\*{4,}/', $incoming ) ) {
676 + $settings[ $api_key_field ] = $stored_is_mask ? '' : $stored;
677 + }
678 + }
679 +
680 + // Minimum-token policy: reject saves where a feature's max_token field is below the
681 + // per-model floor defined by AIHelper::get_min_tokens(). The model may be unchanged in
682 + // this submission, so fall back to the stored value when it isn't part of the payload.
683 + // Both token fields live under the AI Content Suite tab, so enforce the floor only when
684 + // that tab is the one being saved — saving any other settings page never trips it (e.g.
685 + // old users whose stored value predates the floor). When the active-tab hint is absent
686 + // (stale cached JS, the quick-setup wizard, or any programmatic caller) the loop is
687 + // skipped and the save is allowed through.
688 + $token_pairs = array(
689 + array(
690 + 'tab' => 'tab-betterdocs-ai',
691 + 'context' => 'write_with_ai',
692 + 'token_key' => 'ai_autowrite_max_token',
693 + 'model_key' => 'ai_model',
694 + 'label' => __( 'Write with AI', 'betterdocs' )
695 + ),
696 + array(
697 + 'tab' => 'tab-betterdocs-ai',
698 + 'context' => 'article_summary',
699 + 'token_key' => 'article_summary_max_token',
700 + 'model_key' => 'ai_model',
701 + 'label' => __( 'AI Doc Summarizer', 'betterdocs' )
702 + )
703 + );
704 + foreach ( $token_pairs as $pair ) {
705 + if ( $active_tab !== $pair[ 'tab' ] ) {
706 + continue;
707 + }
708 + if ( ! array_key_exists( $pair[ 'token_key' ], $settings ) ) {
709 + continue;
710 + }
711 + $incoming_tokens = (int) $settings[ $pair[ 'token_key' ] ];
712 + $incoming_model = isset( $settings[ $pair[ 'model_key' ] ] )
713 + ? $settings[ $pair[ 'model_key' ] ]
714 + : ( isset( $_old_settings[ $pair[ 'model_key' ] ] ) ? $_old_settings[ $pair[ 'model_key' ] ] : '' );
715 + $min = AIHelper::get_min_tokens( $pair[ 'context' ], $incoming_model );
716 + if ( $min > 0 && $incoming_tokens < $min ) {
717 + return new WP_Error(
718 + 'min_tokens_below_threshold',
719 + sprintf(
720 + /* translators: 1: feature label, 2: minimum tokens, 3: model id */
721 + __( '%1$s max tokens must be at least %2$d for %3$s.', 'betterdocs' ),
722 + $pair[ 'label' ],
723 + $min,
724 + $incoming_model
725 + )
726 + );
727 + }
728 + }
729 +
440 730 // @todo: sanitize the data before inject in DB.
441 731 $_normalized_settings = $this->get_normalized_values( $settings );
442 - if ( $existing_plugins && isset( $_normalized_settings['migration_step'] ) && $_normalized_settings['migration_step'] == true ) {
732 + if ( $existing_plugins && isset( $_normalized_settings[ 'migration_step' ] ) && true == $_normalized_settings[ 'migration_step' ] ) {
443 733 betterdocs()->kbmigration->migrate();
444 734 }
445 735 $_settings = wp_parse_args( $_normalized_settings, $_old_settings );
446 - $_saved = $this->database->save( $this->base_key, $_settings );
447 736
448 - do_action_ref_array( 'betterdocs::settings::saved', [$_saved, $_settings, $_old_settings, &$this] );
737 + // Check if there are actual changes before saving.
738 + // update_option returns false when values serialize identically, which can happen
739 + // due to object caching or type normalization even when user made changes.
740 + $_has_changes = $_settings != $_old_settings;
449 741
450 - return $_saved;
742 + $_saved = $this->database->save( $this->base_key, $_settings );
743 +
744 + do_action_ref_array( 'betterdocs::settings::saved', array( $_saved, $_settings, $_old_settings, &$this ) );
745 +
746 + // Return true if save succeeded OR if there were changes to attempt saving.
747 + // This handles cases where update_option returns false due to identical serialization
748 + // (e.g., object caching, type coercion during serialization).
749 + return $_saved || $_has_changes;
451 750 }
452 751
453 752 public function views( $hook ) {
454 753 return betterdocs()->views->get( 'admin/settings' );
@@ -460,21 +759,21 @@
460 759 return $this->database->save( $this->base_key, $_settings );
461 760 }
462 761
463 762 public function get_pages() {
464 - $_pages = betterdocs()->query->get_posts( [
465 - 'post_type' => 'page',
466 - 'numberposts' => -1,
467 - 'post_status' => 'publish',
763 + $_pages = betterdocs()->query->get_posts( array(
764 + 'post_type' => 'page',
765 + 'numberposts' => -1,
766 + 'post_status' => 'publish',
468 767 'posts_per_page' => -1
469 - ] );
768 + ) );
470 769
471 - $__pages = [];
770 + $__pages = array();
472 771
473 772 if ( ! empty( $_pages ) ) {
474 - $__pages[0] = __( 'Select a Page', 'betterdocs' );
773 + $__pages[ 0 ] = __( 'Select a Page', 'betterdocs' );
475 774 foreach ( $_pages->posts as $page ) {
476 - $__pages[$page->ID] = esc_html( $page->post_title );
775 + $__pages[ $page->ID ] = esc_html( $page->post_title );
477 776 }
478 777 }
479 778
480 779 return $__pages;
@@ -482,685 +781,836 @@
482 781
483 782 public function settings_args() {
484 783 $wp_roles = $this->normalize_options( $this->get_roles() );
485 784
486 - $settings = [
487 - 'id' => 'betterdocs_settings_metabox_wrapper',
488 - 'title' => __( 'betterdocs', 'betterdocs' ),
489 - 'object_types' => ['betterdocs'],
490 - 'context' => 'normal',
491 - 'priority' => 'high',
492 - 'show_header' => false,
493 - 'tabnumber' => false,
785 + $roles_for_ikb = $this->normalize_options( array_merge( array( 'all' => __( 'All logged in users', 'betterdocs' ) ), wp_roles()->role_names ) );
786 +
787 + unset( $roles_for_ikb[ 'administrator' ] );
788 +
789 + $settings = array(
790 + 'id' => 'betterdocs_settings_metabox_wrapper',
791 + 'title' => __( 'betterdocs', 'betterdocs' ),
792 + 'object_types' => array( 'betterdocs' ),
793 + 'context' => 'normal',
794 + 'priority' => 'high',
795 + 'show_header' => false,
796 + 'tabnumber' => false,
494 797 'is_pro_active' => betterdocs()->is_pro_active(),
495 - 'logoURL' => betterdocs()->assets->icon( 'betterdocs-icon.svg', true ),
496 - 'layout' => 'vertical',
497 - 'config' => [
498 - 'active' => 'tab-general',
798 + 'logoURL' => betterdocs()->assets->icon( 'betterdocs-icon.svg', true ),
799 + 'layout' => 'vertical',
800 + 'config' => array(
801 + 'active' => 'tab-general',
499 802 'sidebar' => true,
500 - 'title' => false
501 - ],
502 - 'submit' => [
503 - 'show' => true,
504 - 'label' => __( 'Save', 'betterdocs' ),
803 + 'title' => false
804 + ),
805 + 'submit' => array(
806 + 'show' => true,
807 + 'label' => __( 'Save', 'betterdocs' ),
505 808 'loadingLabel' => __( 'Saving...', 'betterdocs' ),
506 - 'class' => 'save-settings',
507 - 'rules' => Rules::logicalRule( [
809 + 'class' => 'save-settings',
810 + 'rules' => Rules::logicalRule( array(
508 811 Rules::is( 'config.active', 'tab-design', true ),
509 812 Rules::is( 'config.active', 'tab-shortcodes', true ),
510 813 Rules::is( 'config.active', 'tab-instant-answer', true ),
511 814 Rules::is( 'config.active', 'tab-import-export', true ),
512 815 Rules::is( 'config.active', 'tab-migration', true )
513 - ], 'and' )
514 - ],
515 - 'values' => $this->get_all(),
516 - 'tabs' => apply_filters( 'betterdocs_settings_tabs', [
517 - 'tab-general' => apply_filters( 'betterdocs_settings_tab_general', [
518 - 'id' => 'tab-general',
519 - 'label' => __( 'General', 'betterdocs' ),
520 - 'classes' => 'tab-general',
816 + ), 'and' )
817 + ),
818 + 'values' => betterdocs()->is_pro_active() ? $this->get_all() : array_merge( $this->get_all(), $this->pro_settings_default_values() ),
819 + 'tabs' => apply_filters( 'betterdocs_settings_tabs', array(
820 + 'tab-general' => apply_filters( 'betterdocs_settings_tab_general', array(
821 + 'id' => 'tab-general',
822 + 'label' => __( 'General', 'betterdocs' ),
823 + 'classes' => 'tab-general',
521 824 'priority' => 10,
522 - 'fields' => [
523 - 'title-general' => [
524 - 'name' => 'title-general-tab',
525 - 'type' => 'section',
526 - 'label' => __( 'General Settings', 'betterdocs' ),
825 + 'fields' => array(
826 + 'title-general' => apply_filters( 'betterdocs_encyclopedia_settings', array(
827 + 'name' => 'title-general-tab',
828 + 'type' => 'section',
829 + 'label' => __( 'General Settings', 'betterdocs' ),
527 830 'priority' => 10,
528 - 'fields' => [
529 - 'multiple_kb' => apply_filters( 'betterdocs_multi_kb_settings', [
530 - 'name' => 'multiple_kb',
531 - 'type' => 'toggle',
532 - 'label' => __( 'Multiple Knowledge Base', 'betterdocs' ),
831 + 'fields' => array(
832 + 'multiple_kb' => apply_filters( 'betterdocs_multi_kb_settings', array(
833 + 'name' => 'multiple_kb',
834 + 'type' => 'toggle',
835 + 'label' => __( 'Multiple Knowledge Base', 'betterdocs' ),
533 836 'enable_disable_text_active' => true,
534 - 'default' => '',
535 - 'priority' => 1,
536 - 'is_pro' => true
537 - ] ),
538 - 'builtin_doc_page' => [
539 - 'name' => 'builtin_doc_page',
540 - 'type' => 'toggle',
541 - 'label' => __( 'Built-in Documentation Page', 'betterdocs' ),
837 + 'default' => '',
838 + 'priority' => 1,
839 + 'is_pro' => true
840 + ) ),
841 + 'builtin_doc_page' => array(
842 + 'name' => 'builtin_doc_page',
843 + 'type' => 'toggle',
844 + 'label' => __( 'Built-in Documentation Page', 'betterdocs' ),
542 845 'enable_disable_text_active' => true,
543 - 'default' => 1,
544 - 'priority' => 2,
545 - 'label_subtitle' => __( 'If you disable root slug for KB Archives, your individual knowledge base URL will be like this: https://example.com/knowledgebase-1', 'betterdocs' )
546 - ],
547 - 'breadcrumb_doc_title' => [
548 - 'name' => 'breadcrumb_doc_title',
549 - 'type' => 'text',
550 - 'label' => __( 'Documentation Page Title', 'betterdocs' ),
551 - 'default' => 'Docs',
552 - 'priority' => 3
553 - ],
554 - 'docs_slug' => [
555 - 'name' => 'docs_slug',
556 - 'type' => 'text',
557 - 'label' => __( 'BetterDocs Root Slug', 'betterdocs' ),
558 - 'default' => 'docs',
846 + 'default' => 1,
847 + 'priority' => 2
848 + ),
849 + 'enable_category_hierarchy_slugs' => array(
850 + 'name' => 'enable_category_hierarchy_slugs',
851 + 'type' => 'toggle',
852 + 'label' => __( 'Enable Category Hierarchy Slug', 'betterdocs' ),
853 + 'enable_disable_text_active' => true,
854 + 'default' => false,
855 + 'priority' => 3,
856 + 'label_subtitle' => __( "Shows Hierarchy Based Permalink Slugs For Doc Categories & Single Doc Page", 'betterdocs' )
857 + ),
858 + 'breadcrumb_doc_title' => array(
859 + 'name' => 'breadcrumb_doc_title',
860 + 'type' => 'text',
861 + 'label' => __( 'Documentation Page Title', 'betterdocs' ),
862 + 'default' => __( 'Docs', 'betterdocs' ),
559 863 'priority' => 4,
560 - 'rules' => Rules::is( 'builtin_doc_page', true )
561 - ],
562 - 'docs_page' => [
563 - 'name' => 'docs_page',
564 - 'label' => __( 'Docs Page', 'betterdocs' ),
565 - 'type' => 'select',
566 - 'default' => 0,
567 - 'priority' => 5,
568 - 'search' => true,
569 - 'options' => $this->normalize_options( $this->get_pages() ),
864 + 'rules' => Rules::is( 'builtin_doc_page', true )
865 + ),
866 + 'docs_slug' => array(
867 + 'name' => 'docs_slug',
868 + 'type' => 'text',
869 + 'label' => __( 'BetterDocs Root Slug', 'betterdocs' ),
870 + 'default' => 'docs',
871 + 'priority' => 5,
872 + 'rules' => Rules::is( 'builtin_doc_page', true )
873 + ),
874 + 'docs_page' => array(
875 + 'name' => 'docs_page',
876 + 'label' => __( 'Docs Page', 'betterdocs' ),
877 + 'type' => 'select',
878 + 'default' => 0,
879 + 'priority' => 6,
880 + 'search' => true,
881 + 'options' => $this->normalize_options( $this->get_pages() ),
570 882 'label_subtitle' => __( 'You will need to insert BetterDocs Shortcode inside the page. This page will be used as docs permalink.', 'betterdocs' ),
571 - 'rules' => Rules::is( 'builtin_doc_page', false )
572 - ],
573 - 'category_slug' => [
574 - 'name' => 'category_slug',
575 - 'type' => 'text',
576 - 'label' => __( 'Custom Category Slug', 'betterdocs' ),
577 - 'default' => 'docs-category',
578 - 'priority' => 6
579 - ],
580 - 'tag_slug' => [
581 - 'name' => 'tag_slug',
582 - 'type' => 'text',
583 - 'label' => __( 'Custom Tag Slug', 'betterdocs' ),
584 - 'default' => 'docs-tag',
883 + 'rules' => Rules::is( 'builtin_doc_page', false )
884 + ),
885 +
886 + 'category_slug' => array(
887 + 'name' => 'category_slug',
888 + 'type' => 'text',
889 + 'label' => __( 'Custom Category Slug', 'betterdocs' ),
890 + 'default' => 'docs-category',
585 891 'priority' => 7
586 - ],
587 - 'permalink_structure' => [
588 - 'name' => 'permalink_structure',
589 - 'type' => 'permalink_structure',
590 - 'label' => __( 'Single Docs Permalink', 'betterdocs' ),
591 - 'default' => PostType::permalink_structure(),
592 - 'priority' => 9,
593 - 'tags' => $this->normalize_options( [
594 - '%doc_category%' => '%doc_category%',
892 + ),
893 + 'tag_slug' => array(
894 + 'name' => 'tag_slug',
895 + 'type' => 'text',
896 + 'label' => __( 'Custom Tag Slug', 'betterdocs' ),
897 + 'default' => 'docs-tag',
898 + 'priority' => 8
899 + ),
900 + 'permalink_structure' => array(
901 + 'name' => 'permalink_structure',
902 + 'type' => 'permalink_structure',
903 + 'label' => __( 'Single Docs Permalink', 'betterdocs' ),
904 + 'default' => PostType::permalink_structure(),
905 + 'priority' => 9,
906 + 'tags' => $this->normalize_options( array(
907 + '%doc_category%' => '%doc_category%',
595 908 '%knowledge_base%' => '%knowledge_base%'
596 - ] ),
909 + ) ),
597 910 'label_subtitle' => __( 'Make sure to keep Docs Root Slug in the Single Docs Permalink. You are not able to keep it blank. You can use the available tags from below.', 'betterdocs' )
598 - ],
599 - 'enable_faq_schema' => [
600 - 'name' => 'enable_faq_schema',
601 - 'type' => 'toggle',
602 - 'label' => __( 'FAQ Schema', 'betterdocs' ),
911 + ),
912 + 'enable_glossaries' => array(
913 + 'name' => 'enable_glossaries',
914 + 'type' => 'toggle',
915 + 'label' => __( 'Show Glossary', 'betterdocs' ),
916 + 'label_subtitle' => __( 'Enable the glossary feature to allow users to look up definitions for terms used within your encyclopedia or glossaries themselves.', 'betterdocs' ),
603 917 'enable_disable_text_active' => true,
604 - 'default' => '',
605 - 'priority' => 10
606 - ],
607 - 'analytics_from' => [
608 - 'name' => 'analytics_from',
609 - 'type' => 'select',
610 - 'label' => __( 'Analytics From', 'betterdocs' ),
611 - 'options' => $this->normalize_options( [
612 - 'everyone' => __( 'Everyone', 'betterdocs' ),
613 - 'guests' => __( 'Guests Only', 'betterdocs' ),
918 + 'default' => false,
919 + 'priority' => 10,
920 + 'is_pro' => true
921 + ),
922 + 'enable_encyclopedia' => array(
923 + 'name' => 'enable_encyclopedia',
924 + 'type' => 'toggle',
925 + 'label' => __( 'Built-in Encyclopedia Page', 'betterdocs' ),
926 + 'enable_disable_text_active' => true,
927 + 'default' => false,
928 + 'priority' => 11,
929 + 'is_pro' => true
930 + ),
931 + 'enable_faq_schema' => array(
932 + 'name' => 'enable_faq_schema',
933 + 'type' => 'toggle',
934 + 'label' => __( 'FAQ Schema', 'betterdocs' ),
935 + 'enable_disable_text_active' => true,
936 + 'default' => '',
937 + 'priority' => 12
938 + ),
939 + 'analytics_from' => array(
940 + 'name' => 'analytics_from',
941 + 'type' => 'select',
942 + 'label' => __( 'Analytics From', 'betterdocs' ),
943 + 'options' => $this->normalize_options( array(
944 + 'everyone' => __( 'Everyone', 'betterdocs' ),
945 + 'guests' => __( 'Guests Only', 'betterdocs' ),
614 946 'registered_users' => __( 'Registered Users Only', 'betterdocs' )
615 - ] ),
616 - 'default' => 'everyone',
617 - 'priority' => 11,
618 - 'is_pro' => true
619 - ],
620 - 'exclude_bot_analytics' => [
621 - 'name' => 'exclude_bot_analytics',
622 - 'type' => 'toggle',
623 - 'label' => __( 'Exclude Bot Analytics', 'betterdocs' ),
947 + ) ),
948 + 'default' => 'everyone',
949 + 'priority' => 13,
950 + 'is_pro' => true
951 + ),
952 + 'unique_visitor_count' => array(
953 + 'name' => 'unique_visitor_count',
954 + 'type' => 'toggle',
955 + 'label' => __( 'Unique Visitor Count', 'betterdocs' ),
624 956 'enable_disable_text_active' => true,
625 - 'default' => true,
626 - 'priority' => 12,
627 - 'is_pro' => true
628 - ]
629 - ]
630 - ]
631 - ]
632 - ] ),
633 - 'tab-layout' => apply_filters( 'betterdocs_settings_tab_layout', [
634 - 'id' => 'tab-layout',
635 - 'label' => __( 'Layout', 'betterdocs' ),
636 - 'classes' => 'tab-layout',
957 + 'default' => false,
958 + 'priority' => 14,
959 + 'is_pro' => true
960 + ),
961 + 'exclude_bot_analytics' => array(
962 + 'name' => 'exclude_bot_analytics',
963 + 'type' => 'toggle',
964 + 'label' => __( 'Exclude Bot Analytics', 'betterdocs' ),
965 + 'enable_disable_text_active' => true,
966 + 'default' => false,
967 + 'priority' => 15,
968 + 'is_pro' => true
969 + )
970 +
971 + )
972 + ) )
973 + )
974 + ) ),
975 + 'tab-layout' => apply_filters( 'betterdocs_settings_tab_layout', array(
976 + 'id' => 'tab-layout',
977 + 'label' => __( 'Layout', 'betterdocs' ),
978 + 'classes' => 'tab-layout',
637 979 'priority' => 20,
638 - 'fields' => [
639 - 'title-layout' => [
640 - 'name' => 'title-layout-tab',
641 - 'type' => 'section',
642 - 'label' => __( 'Layout Settings', 'betterdocs' ),
980 + 'fields' => array(
981 + 'title-layout' => array(
982 + 'name' => 'title-layout-tab',
983 + 'type' => 'section',
984 + 'label' => __( 'Layout Settings', 'betterdocs' ),
643 985 'priority' => 20,
644 - 'fields' => [
645 - 'tab-sidebar-layout' => apply_filters( 'betterdocs_settings_tab_sidebar_layout', [
646 - 'id' => 'tab-sidebar-layout',
647 - 'name' => 'tab_sidebar_layout',
648 - 'label' => __( 'Layout Settings', 'betterdocs' ),
649 - 'classes' => 'tab-layout',
650 - 'type' => "tab",
651 - 'active' => "layout_documentation_page",
986 + 'fields' => array(
987 + 'tab-sidebar-layout' => apply_filters( 'betterdocs_settings_tab_sidebar_layout', array(
988 + 'id' => 'tab-sidebar-layout',
989 + 'name' => 'tab_sidebar_layout',
990 + 'label' => __( 'Layout Settings', 'betterdocs' ),
991 + 'classes' => 'tab-layout',
992 + 'type' => 'tab',
993 + 'active' => 'layout_documentation_page',
652 994 'completionTrack' => true,
653 - 'sidebar' => false,
654 - 'save' => false,
655 - 'title' => false,
656 - 'config' => [
657 - 'active' => 'layout_documentation_page',
995 + 'sidebar' => false,
996 + 'save' => false,
997 + 'title' => false,
998 + 'config' => array(
999 + 'active' => 'layout_documentation_page',
658 1000 'sidebar' => false,
659 - 'title' => false
660 - ],
661 - 'submit' => [
1001 + 'title' => false
1002 + ),
1003 + 'submit' => array(
662 1004 'show' => false
663 - ],
664 - 'step' => [
1005 + ),
1006 + 'step' => array(
665 1007 'show' => false
666 - ],
667 - 'priority' => 20,
668 - 'fields' => [
669 - 'layout_documentation_page' => [
670 - 'id' => 'layout_documentation_page',
671 - 'name' => 'layout_documentation_page',
672 - 'type' => 'section',
673 - 'label' => __( 'Documentation Page', 'betterdocs' ),
1008 + ),
1009 + 'priority' => 20,
1010 + 'fields' => array(
1011 + 'layout_documentation_page' => array(
1012 + 'id' => 'layout_documentation_page',
1013 + 'name' => 'layout_documentation_page',
1014 + 'type' => 'section',
1015 + 'label' => __( 'Documentation Page', 'betterdocs' ),
674 1016 'priority' => 1,
675 - 'fields' => [
676 - 'tab-nested-layout-1' => [
677 - 'id' => 'tab-nested-layout-1',
678 - 'name' => 'tab_nested_layout_1',
679 - 'label' => __( 'Documentation Page', 'betterdocs' ),
680 - 'classes' => 'tab-nested-layout',
681 - 'type' => "tab",
682 - 'active' => "layout_documentation_page_general",
1017 + 'fields' => array(
1018 + 'tab-nested-layout-1' => array(
1019 + 'id' => 'tab-nested-layout-1',
1020 + 'name' => 'tab_nested_layout_1',
1021 + 'label' => __( 'Documentation Page', 'betterdocs' ),
1022 + 'classes' => 'tab-nested-layout',
1023 + 'type' => 'tab',
1024 + 'active' => 'layout_documentation_page_general',
683 1025 'completionTrack' => true,
684 - 'sidebar' => false,
685 - 'save' => false,
686 - 'title' => false,
687 - 'config' => [
688 - 'active' => 'layout_documentation_page_general',
1026 + 'sidebar' => false,
1027 + 'save' => false,
1028 + 'title' => false,
1029 + 'config' => array(
1030 + 'active' => 'layout_documentation_page_general',
689 1031 'sidebar' => false,
690 - 'title' => false
691 - ],
692 - 'submit' => [
1032 + 'title' => false
1033 + ),
1034 + 'submit' => array(
693 1035 'show' => false
694 - ],
695 - 'step' => [
1036 + ),
1037 + 'step' => array(
696 1038 'show' => false
697 - ],
698 - 'priority' => 1,
699 - 'fields' => [
700 - 'layout_documentation_page_general' => [
701 - 'id' => 'layout_documentation_page_general',
702 - 'name' => 'layout_documentation_page_general',
703 - 'type' => 'section',
704 - 'label' => __( 'General', 'betterdocs' ),
1039 + ),
1040 + 'priority' => 1,
1041 + 'fields' => array(
1042 + 'layout_documentation_page_general' => array(
1043 + 'id' => 'layout_documentation_page_general',
1044 + 'name' => 'layout_documentation_page_general',
1045 + 'type' => 'section',
1046 + 'label' => __( 'General', 'betterdocs' ),
705 1047 'priority' => 1,
706 - 'fields' => [
707 - 'category_title_link' => [
708 - 'name' => 'category_title_link',
709 - 'type' => 'toggle',
710 - 'label' => __( 'Category Title Link', 'betterdocs' ),
711 - 'label_subtitle' => __( 'This setting is applicable for category grid layout', 'betterdocs' ),
1048 + 'fields' => array(
1049 + 'docs_list_icon' => array(
1050 + 'name' => 'docs_list_icon',
1051 + 'type' => 'media',
1052 + 'value' => '',
1053 + 'label' => __( 'Docs List Icon', 'betterdocs' ),
1054 + 'label_subtitle' => __( 'Upload your own preferred document list icon', 'betterdocs' ),
1055 + 'priority' => 0
1056 + ),
1057 + 'category_title_link' => array(
1058 + 'name' => 'category_title_link',
1059 + 'type' => 'toggle',
1060 + 'label' => __( 'Category Title Link', 'betterdocs' ),
1061 + 'label_subtitle' => __( 'This setting is applicable for category grid layout', 'betterdocs' ),
712 1062 'enable_disable_text_active' => true,
713 - 'default' => false,
714 - 'priority' => 0
715 - ],
716 - 'masonry_layout' => [
717 - 'name' => 'masonry_layout',
718 - 'type' => 'toggle',
719 - 'label' => __( 'Masonry', 'betterdocs' ),
1063 + 'default' => false,
1064 + 'priority' => 0
1065 + ),
1066 + 'masonry_layout' => array(
1067 + 'name' => 'masonry_layout',
1068 + 'type' => 'toggle',
1069 + 'label' => __( 'Masonry', 'betterdocs' ),
720 1070 'enable_disable_text_active' => true,
721 - 'default' => 1,
722 - 'priority' => 1
723 - ],
724 - 'nested_subcategory' => [
725 - 'name' => 'nested_subcategory',
726 - 'type' => 'toggle',
727 - 'label' => __( 'Nested Sub Category', 'betterdocs' ),
1071 + 'default' => 1,
1072 + 'priority' => 1
1073 + ),
1074 + 'archive_lazy_load_descendants' => array(
1075 + 'name' => 'archive_lazy_load_descendants',
1076 + 'type' => 'toggle',
1077 + 'label' => __( 'Lazy Load Sidebar Docs & Subcategories', 'betterdocs' ),
1078 + 'label_subtitle' => __( 'Applies to the Sidebar layout wherever it appears — single docs, category archives, and the Sidebar widget/block. Off by default: enable to render only the active category upfront and fetch the rest on click (or on scroll for the Memphis layout), cutting initial HTML size on large knowledge bases.', 'betterdocs' ),
728 1079 'enable_disable_text_active' => true,
729 - 'default' => '',
730 - 'priority' => 2
731 - ],
732 - 'column_number' => [
733 - 'name' => 'column_number',
734 - 'type' => 'number',
735 - 'label' => __( 'Number Of Columns', 'betterdocs' ),
736 - 'default' => 3,
1080 + 'default' => false,
1081 + 'priority' => 2
1082 + ),
1083 + 'nested_subcategory' => array(
1084 + 'name' => 'nested_subcategory',
1085 + 'type' => 'toggle',
1086 + 'label' => __( 'Nested Sub Category', 'betterdocs' ),
1087 + 'enable_disable_text_active' => true,
1088 + 'default' => '',
737 1089 'priority' => 3
738 - ],
739 - 'posts_number' => apply_filters( 'betterdocs_posts_number', [
740 - 'name' => 'posts_number',
741 - 'type' => 'number',
742 - 'label' => __( 'Number Of Docs', 'betterdocs' ),
1090 + ),
1091 + 'column_number' => array(
1092 + 'name' => 'column_number',
1093 + 'type' => 'number',
1094 + 'label' => __( 'Number Of Columns', 'betterdocs' ),
1095 + 'label_subtitle' => __( 'This setting is not applicable for sleek layout.', 'betterdocs' ),
1096 + 'default' => 3,
1097 + 'priority' => 4
1098 + ),
1099 + 'posts_number' => apply_filters( 'betterdocs_posts_number', array(
1100 + 'name' => 'posts_number',
1101 + 'type' => 'number',
1102 + 'label' => __( 'Number Of Docs', 'betterdocs' ),
743 1103 'label_subtitle' => __( 'This setting is not applicable for handbook layout.', 'betterdocs' ),
744 - 'default' => 10,
745 - 'priority' => 4
746 - ] ),
747 - 'post_count' => [
748 - 'name' => 'post_count',
749 - 'type' => 'toggle',
750 - 'label' => __( 'Doc Count', 'betterdocs' ),
1104 + 'default' => 10,
1105 + 'priority' => 5
1106 + ) ),
1107 + 'post_count' => array(
1108 + 'name' => 'post_count',
1109 + 'type' => 'toggle',
1110 + 'label' => __( 'Doc Count', 'betterdocs' ),
751 1111 'enable_disable_text_active' => true,
752 - 'default' => 1,
753 - 'priority' => 5
754 - ],
755 - 'count_text' => [
756 - 'name' => 'count_text',
757 - 'type' => 'text',
758 - 'label' => __( 'Count Text', 'betterdocs' ),
759 - 'default' => __( 'docs', 'betterdocs' ),
1112 + 'default' => 1,
760 1113 'priority' => 6
761 - ],
762 - 'count_text_singular' => [
763 - 'name' => 'count_text_singular',
764 - 'type' => 'text',
765 - 'label' => __( 'Count Text Singular', 'betterdocs' ),
766 - 'default' => __( 'doc', 'betterdocs' ),
1114 + ),
1115 + 'count_text' => array(
1116 + 'name' => 'count_text',
1117 + 'type' => 'text',
1118 + 'label' => __( 'Count Text', 'betterdocs' ),
1119 + 'default' => __( 'Docs', 'betterdocs' ),
767 1120 'priority' => 7
768 - ],
769 - 'exploremore_btn' => [
770 - 'name' => 'exploremore_btn',
771 - 'type' => 'toggle',
772 - 'label' => __( 'Explore More Button', 'betterdocs' ),
1121 + ),
1122 + 'count_text_singular' => array(
1123 + 'name' => 'count_text_singular',
1124 + 'type' => 'text',
1125 + 'label' => __( 'Count Text Singular', 'betterdocs' ),
1126 + 'default' => __( 'Doc', 'betterdocs' ),
1127 + 'priority' => 8
1128 + ),
1129 + 'exploremore_btn' => array(
1130 + 'name' => 'exploremore_btn',
1131 + 'type' => 'toggle',
1132 + 'label' => __( 'Explore More Button', 'betterdocs' ),
773 1133 'enable_disable_text_active' => true,
774 - 'default' => true,
775 - 'priority' => 8
776 - ],
777 - 'exploremore_btn_txt' => [
778 - 'name' => 'exploremore_btn_txt',
779 - 'type' => 'text',
780 - 'label' => __( 'Explore More Button Text', 'betterdocs' ),
781 - 'default' => __( 'Explore More', 'betterdocs' ),
782 - 'priority' => 9,
783 - 'rules' => Rules::is( 'exploremore_btn', true )
784 - ],
785 - 'betterdocs_popular_docs_text' => [
786 - 'name' => 'betterdocs_popular_docs_text',
787 - 'type' => 'text',
788 - 'label' => __( 'Popular Docs Text', 'betterdocs' ),
789 - 'default' => __( 'Popular Docs', 'betterdocs' ),
1134 + 'default' => true,
1135 + 'priority' => 9
1136 + ),
1137 + 'exploremore_btn_txt' => array(
1138 + 'name' => 'exploremore_btn_txt',
1139 + 'type' => 'text',
1140 + 'label' => __( 'Explore More Button Text', 'betterdocs' ),
1141 + 'default' => __( 'Explore More', 'betterdocs' ),
790 1142 'priority' => 10,
791 - "is_pro" => true
792 - ],
793 - 'betterdocs_popular_docs_number' => [
794 - 'name' => 'betterdocs_popular_docs_number',
795 - 'type' => 'number',
796 - 'label' => __( 'Popular Docs Number', 'betterdocs' ),
797 - 'default' => 10,
1143 + 'rules' => Rules::is( 'exploremore_btn', true )
1144 + ),
1145 + 'betterdocs_popular_docs_text' => array(
1146 + 'name' => 'betterdocs_popular_docs_text',
1147 + 'type' => 'text',
1148 + 'label' => __( 'Popular Docs Text', 'betterdocs' ),
1149 + 'default' => __( 'Popular Docs', 'betterdocs' ),
798 1150 'priority' => 11,
799 - "is_pro" => true
800 - ]
801 - ]
802 - ],
803 - 'layout_documentation_page_search' => [
804 - 'id' => 'layout_documentation_page_search',
805 - 'name' => 'layout_documentation_page_search',
806 - 'type' => 'section',
807 - 'label' => __( 'Search', 'betterdocs' ),
1151 + 'is_pro' => true
1152 + ),
1153 + 'betterdocs_popular_docs_number' => array(
1154 + 'name' => 'betterdocs_popular_docs_number',
1155 + 'type' => 'number',
1156 + 'label' => __( 'Popular Docs Number', 'betterdocs' ),
1157 + 'default' => 10,
1158 + 'priority' => 12,
1159 + 'is_pro' => true
1160 + )
1161 + )
1162 + ),
1163 + 'layout_documentation_page_search' => array(
1164 + 'id' => 'layout_documentation_page_search',
1165 + 'name' => 'layout_documentation_page_search',
1166 + 'type' => 'section',
1167 + 'label' => __( 'Search', 'betterdocs' ),
808 1168 'priority' => 2,
809 - 'fields' => [
810 - 'live_search' => [
811 - 'name' => 'live_search',
812 - 'type' => 'toggle',
813 - 'label' => __( 'Live Search', 'betterdocs' ),
1169 + 'fields' => array(
1170 + 'live_search' => array(
1171 + 'name' => 'live_search',
1172 + 'type' => 'toggle',
1173 + 'label' => __( 'Live Search', 'betterdocs' ),
814 1174 'enable_disable_text_active' => true,
815 - 'default' => 1,
816 - 'priority' => 1
817 - ],
818 - 'advance_search' => apply_filters( 'betterdocs_advance_search_settings', [
819 - 'name' => 'advance_search',
820 - 'type' => 'toggle',
821 - 'label' => __( 'Advanced Search', 'betterdocs' ),
1175 + 'default' => 1,
1176 + 'priority' => 1
1177 + ),
1178 + 'advance_search' => apply_filters( 'betterdocs_advance_search_settings', array(
1179 + 'name' => 'advance_search',
1180 + 'type' => 'toggle',
1181 + 'label' => __( 'Advanced Search', 'betterdocs' ),
822 1182 'enable_disable_text_active' => true,
823 - 'default' => '',
824 - 'priority' => 2,
825 - 'is_pro' => true
826 - ] ),
827 - 'child_category_exclude' => apply_filters( 'child_category_exclude', [
828 - 'name' => 'child_category_exclude',
829 - 'type' => 'toggle',
830 - 'label' => __( 'Category Search', 'betterdocs' ),
1183 + 'default' => '',
1184 + 'priority' => 2,
1185 + 'is_pro' => true
1186 + ) ),
1187 + // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- legacy public filter name for category-exclude settings field, retained for back-compat.
1188 + 'child_category_exclude' => apply_filters( 'child_category_exclude', array(
1189 + 'name' => 'child_category_exclude',
1190 + 'type' => 'toggle',
1191 + 'label' => __( 'Exclude Child Terms In Category Search', 'betterdocs' ),
831 1192 'enable_disable_text_active' => true,
832 - 'default' => '',
833 - 'priority' => 3,
834 - 'is_pro' => true
835 - ] ),
836 - 'popular_keyword_limit' => apply_filters( 'betterdocs_popular_keyword_limit_settings', [
837 - 'name' => 'popular_keyword_limit',
838 - 'type' => 'number',
839 - 'label' => __( 'Minimum amount of Keywords Search', 'betterdocs' ),
840 - 'default' => 5,
1193 + 'default' => '',
1194 + 'priority' => 3,
1195 + 'is_pro' => true
1196 + ) ),
1197 + 'popular_keyword_limit' => apply_filters( 'betterdocs_popular_keyword_limit_settings', array(
1198 + 'name' => 'popular_keyword_limit',
1199 + 'type' => 'number',
1200 + 'label' => __( 'Minimum amount of Keywords Search', 'betterdocs' ),
1201 + 'default' => 5,
841 1202 'priority' => 4,
842 - 'is_pro' => true
843 - ] ),
844 - 'search_letter_limit' => [
845 - 'name' => 'search_letter_limit',
846 - 'type' => 'number',
847 - 'label' => __( 'Minimum Character Limit For Search Result', 'betterdocs' ),
1203 + 'is_pro' => true
1204 + ) ),
1205 + 'search_letter_limit' => array(
1206 + 'name' => 'search_letter_limit',
1207 + 'type' => 'number',
1208 + 'label' => __( 'Minimum Character Limit For Search Result', 'betterdocs' ),
848 1209 'priority' => 5,
849 - 'default' => 3
850 - ],
851 - 'search_placeholder' => [
852 - 'name' => 'search_placeholder',
853 - 'type' => 'text',
854 - 'label' => __( 'Search Placeholder', 'betterdocs' ),
855 - 'default' => __( 'Search..', 'betterdocs' ),
1210 + 'default' => 3
1211 + ),
1212 + 'search_placeholder' => array(
1213 + 'name' => 'search_placeholder',
1214 + 'type' => 'text',
1215 + 'label' => __( 'Search Placeholder', 'betterdocs' ),
1216 + 'default' => __( 'Search..', 'betterdocs' ),
856 1217 'priority' => 6
857 - ],
858 - 'search_button_text' => apply_filters( 'betterdocs_search_button_text', [
859 - 'name' => 'search_button_text',
860 - 'type' => 'text',
861 - 'label' => __( 'Search Button Text', 'betterdocs' ),
1218 + ),
1219 + 'search_button_text' => apply_filters( 'betterdocs_search_button_text', array(
1220 + 'name' => 'search_button_text',
1221 + 'type' => 'text',
1222 + 'label' => __( 'Search Button Text', 'betterdocs' ),
862 1223 'priority' => 7,
863 - 'default' => __( 'Search', 'betterdocs' ),
864 - 'is_pro' => true
865 - ] ),
866 - 'search_not_found_text' => [
867 - 'name' => 'search_not_found_text',
868 - 'type' => 'text',
869 - 'label' => __( 'Search Not Found Text', 'betterdocs' ),
870 - 'default' => 'Sorry, no docs were found.',
1224 + 'default' => __( 'Search', 'betterdocs' )
1225 + ) ),
1226 + 'search_not_found_text' => array(
1227 + 'name' => 'search_not_found_text',
1228 + 'type' => 'text',
1229 + 'label' => __( 'Search Not Found Text', 'betterdocs' ),
1230 + 'default' => 'Sorry, no docs were found.',
871 1231 'priority' => 8
872 - ],
873 - 'search_result_image' => [
874 - 'name' => 'search_result_image',
875 - 'type' => 'toggle',
876 - 'label' => __( 'Search Result Image', 'betterdocs' ),
1232 + ),
1233 + 'search_result_image' => array(
1234 + 'name' => 'search_result_image',
1235 + 'type' => 'toggle',
1236 + 'label' => __( 'Search Result Image', 'betterdocs' ),
877 1237 'enable_disable_text_active' => true,
878 - 'default' => 1,
879 - 'priority' => 9
880 - ],
881 - 'kb_based_search' => apply_filters( 'betterdocs_kb_based_search_settings', [
882 - 'name' => 'kb_based_search',
883 - 'type' => 'toggle',
884 - 'label' => __( 'KB Based Search', 'betterdocs' ),
1238 + 'default' => 1,
1239 + 'priority' => 9
1240 + ),
1241 + 'kb_based_search' => apply_filters( 'betterdocs_kb_based_search_settings', array(
1242 + 'name' => 'kb_based_search',
1243 + 'type' => 'toggle',
1244 + 'label' => __( 'KB Based Search', 'betterdocs' ),
885 1245 'enable_disable_text_active' => true,
886 - 'default' => '',
887 - 'priority' => 10,
888 - 'is_pro' => true,
889 - 'rules' => Rules::is( 'multiple_kb', true )
890 - ] )
891 - ]
892 - ],
893 - 'layout_documentation_page_order_by' => [
894 - 'id' => 'layout_documentation_page_order_by',
895 - 'name' => 'layout_documentation_page_order_by',
896 - 'type' => 'section',
897 - 'label' => __( 'Order By', 'betterdocs' ),
1246 + 'default' => '',
1247 + 'priority' => 10,
1248 + 'is_pro' => true,
1249 + 'rules' => Rules::is( 'multiple_kb', true )
1250 + ) ),
1251 + 'search_modal_search_type' => array(
1252 + 'name' => 'search_modal_search_type',
1253 + 'type' => 'select',
1254 + 'label' => __( 'Search Modal Source', 'betterdocs' ),
1255 + 'label_subtitle' => __( 'Choose the content type to be shown in the search modal. <br> <b>Note:</b> This is only applicable on Modal Search.', 'betterdocs' ),
1256 + 'default' => 'all',
1257 + 'options' => $this->normalize_options( array(
1258 + 'all' => __( 'Both (Docs + FAQs)', 'betterdocs' ),
1259 + 'docs' => __( 'Docs only', 'betterdocs' ),
1260 + 'faq' => __( 'FAQs only', 'betterdocs' )
1261 + ) ),
1262 + 'priority' => 11
1263 + )
1264 + )
1265 + ),
1266 + 'layout_documentation_page_order_by' => array(
1267 + 'id' => 'layout_documentation_page_order_by',
1268 + 'name' => 'layout_documentation_page_order_by',
1269 + 'type' => 'section',
1270 + 'label' => __( 'Order By', 'betterdocs' ),
898 1271 'priority' => 3,
899 - 'fields' => [
900 - 'terms_orderby' => [
901 - 'name' => 'terms_orderby',
902 - 'type' => 'select',
903 - 'label' => __( 'Terms Order By', 'betterdocs' ),
904 - 'default' => 'betterdocs_order',
905 - 'options' => $this->normalize_options( apply_filters( 'betterdocs_terms_orderby_options', [
906 - 'none' => __( 'No order', 'betterdocs' ),
907 - 'name' => __( 'Name', 'betterdocs' ),
908 - 'slug' => __( 'Slug', 'betterdocs' ),
909 - 'term_group' => __( 'Term Group', 'betterdocs' ),
910 - 'term_id' => __( 'Term ID', 'betterdocs' ),
911 - 'id' => __( 'ID', 'betterdocs' ),
912 - 'description' => __( 'Description', 'betterdocs' ),
913 - 'parent' => __( 'Parent', 'betterdocs' ),
1272 + 'fields' => array(
1273 + 'terms_orderby' => array(
1274 + 'name' => 'terms_orderby',
1275 + 'type' => 'select',
1276 + 'label' => __( 'Terms Order By', 'betterdocs' ),
1277 + 'default' => 'betterdocs_order',
1278 + 'options' => $this->normalize_options( apply_filters( 'betterdocs_terms_orderby_options', array(
1279 + 'none' => __( 'No order', 'betterdocs' ),
1280 + 'name' => __( 'Name', 'betterdocs' ),
1281 + 'slug' => __( 'Slug', 'betterdocs' ),
1282 + 'term_group' => __( 'Term Group', 'betterdocs' ),
1283 + 'term_id' => __( 'Term ID', 'betterdocs' ),
1284 + 'id' => __( 'ID', 'betterdocs' ),
1285 + 'description' => __( 'Description', 'betterdocs' ),
1286 + 'parent' => __( 'Parent', 'betterdocs' ),
914 1287 'betterdocs_order' => __( 'BetterDocs Order', 'betterdocs' )
915 - ] ) ),
1288 + ) ) ),
916 1289 'priority' => 1
917 - ],
918 - 'terms_order' => [
919 - 'name' => 'terms_order',
920 - 'type' => 'select',
921 - 'label' => __( 'Terms Order', 'betterdocs' ),
922 - 'default' => 'ASC',
923 - 'options' => $this->normalize_options( [
924 - 'ASC' => 'Ascending',
1290 + ),
1291 + 'terms_order' => array(
1292 + 'name' => 'terms_order',
1293 + 'type' => 'select',
1294 + 'label' => __( 'Terms Order', 'betterdocs' ),
1295 + 'default' => 'ASC',
1296 + 'options' => $this->normalize_options( array(
1297 + 'ASC' => 'Ascending',
925 1298 'DESC' => 'Descending'
926 - ] ),
927 - 'priority' => 3
928 - ],
929 - 'alphabetically_order_post' => [
930 - 'name' => 'alphabetically_order_post',
931 - 'type' => 'select',
932 - 'label' => __( 'Docs Order By', 'betterdocs' ),
933 - 'default' => 'betterdocs_order',
934 - 'options' => $this->normalize_options( [
935 - 'none' => __( 'No order', 'betterdocs' ),
936 - 'ID' => __( 'Docs ID', 'betterdocs' ),
937 - 'author' => __( 'Docs Author', 'betterdocs' ),
938 - 'title' => __( 'Title', 'betterdocs' ),
939 - 'date' => __( 'Date', 'betterdocs' ),
940 - 'modified' => __( 'Last Modified Date', 'betterdocs' ),
941 - 'parent' => __( 'Parent Id', 'betterdocs' ),
942 - 'rand' => __( 'Random', 'betterdocs' ),
943 - 'comment_count' => __( 'Comment Count', 'betterdocs' ),
944 - 'menu_order' => __( 'Menu Order', 'betterdocs' ),
1299 + ) ),
1300 + 'priority' => 3,
1301 + 'rules' => Rules::includes( 'terms_orderby', 'betterdocs_order', true )
1302 + ),
1303 + 'alphabetically_order_post' => array(
1304 + 'name' => 'alphabetically_order_post',
1305 + 'type' => 'select',
1306 + 'label' => __( 'Docs Order By', 'betterdocs' ),
1307 + 'default' => 'betterdocs_order',
1308 + 'options' => $this->normalize_options( array(
1309 + 'none' => __( 'No order', 'betterdocs' ),
1310 + 'ID' => __( 'Docs ID', 'betterdocs' ),
1311 + 'author' => __( 'Docs Author', 'betterdocs' ),
1312 + 'title' => __( 'Title', 'betterdocs' ),
1313 + 'date' => __( 'Date', 'betterdocs' ),
1314 + 'modified' => __( 'Last Modified Date', 'betterdocs' ),
1315 + 'parent' => __( 'Parent Id', 'betterdocs' ),
1316 + 'rand' => __( 'Random', 'betterdocs' ),
1317 + 'comment_count' => __( 'Comment Count', 'betterdocs' ),
1318 + 'menu_order' => __( 'Menu Order', 'betterdocs' ),
945 1319 'betterdocs_order' => __( 'BetterDocs Order', 'betterdocs' )
946 - ] ),
1320 + ) ),
947 1321 'priority' => 4
948 - ],
949 - 'docs_order' => [
950 - 'name' => 'docs_order',
951 - 'type' => 'select',
952 - 'label' => __( 'Docs Order', 'betterdocs' ),
953 - 'default' => 'ASC',
954 - 'options' => $this->normalize_options( [
955 - 'ASC' => 'Ascending',
1322 + ),
1323 + 'docs_order' => array(
1324 + 'name' => 'docs_order',
1325 + 'type' => 'select',
1326 + 'label' => __( 'Docs Order', 'betterdocs' ),
1327 + 'default' => 'ASC',
1328 + 'options' => $this->normalize_options( array(
1329 + 'ASC' => 'Ascending',
956 1330 'DESC' => 'Descending'
957 - ] ),
958 - 'priority' => 5
959 - ]
960 - ]
961 - ]
962 - ]
963 - ]
964 - ]
965 - ],
966 - 'layout_single_doc' => apply_filters( 'single_doc_setting_section', [
967 - 'id' => 'layout_single_doc',
968 - 'name' => 'layout_single_doc',
969 - 'type' => 'section',
970 - 'label' => __( 'Single Doc', 'betterdocs' ),
1331 + ) ),
1332 + 'priority' => 5,
1333 + 'rules' => Rules::includes( 'alphabetically_order_post', 'betterdocs_order', true )
1334 + )
1335 + )
1336 + )
1337 + )
1338 + )
1339 + )
1340 + ),
1341 + // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- legacy public filter name for single-doc setting section, retained for back-compat.
1342 + 'layout_single_doc' => apply_filters( 'single_doc_setting_section', array(
1343 + 'id' => 'layout_single_doc',
1344 + 'name' => 'layout_single_doc',
1345 + 'type' => 'section',
1346 + 'label' => __( 'Single Doc', 'betterdocs' ),
971 1347 'priority' => 2,
972 - 'fields' => [
973 - 'tab-nested-layout-2' => [
974 - 'id' => 'tab-nested-layout-2',
975 - 'name' => 'tab_nested_layout_2',
976 - 'label' => __( 'Single Doc', 'betterdocs' ),
977 - 'classes' => 'tab-nested-layout',
978 - 'type' => "tab",
979 - 'active' => "layout_single_doc_general",
1348 + 'fields' => array(
1349 + 'tab-nested-layout-2' => array(
1350 + 'id' => 'tab-nested-layout-2',
1351 + 'name' => 'tab_nested_layout_2',
1352 + 'label' => __( 'Single Doc', 'betterdocs' ),
1353 + 'classes' => 'tab-nested-layout',
1354 + 'type' => 'tab',
1355 + 'active' => 'layout_single_doc_general',
980 1356 'completionTrack' => true,
981 - 'sidebar' => false,
982 - 'save' => false,
983 - 'title' => false,
984 - 'config' => [
985 - 'active' => 'layout_single_doc_general',
1357 + 'sidebar' => false,
1358 + 'save' => false,
1359 + 'title' => false,
1360 + 'config' => array(
1361 + 'active' => 'layout_single_doc_general',
986 1362 'sidebar' => false,
987 - 'title' => false
988 - ],
989 - 'submit' => [
1363 + 'title' => false
1364 + ),
1365 + 'submit' => array(
990 1366 'show' => false
991 - ],
992 - 'step' => [
1367 + ),
1368 + 'step' => array(
993 1369 'show' => false
994 - ],
995 - 'priority' => 20,
996 - 'fields' => [
997 - 'layout_single_doc_general' => [
998 - 'id' => 'layout_single_doc_general',
999 - 'name' => 'layout_single_doc_general',
1000 - 'type' => 'section',
1001 - 'label' => __( 'General', 'betterdocs' ),
1370 + ),
1371 + 'priority' => 20,
1372 + 'fields' => array(
1373 + 'layout_single_doc_general' => array(
1374 + 'id' => 'layout_single_doc_general',
1375 + 'name' => 'layout_single_doc_general',
1376 + 'type' => 'section',
1377 + 'label' => __( 'General', 'betterdocs' ),
1002 1378 'priority' => 5,
1003 - 'fields' => [
1004 - 'enable_post_title' => [
1005 - 'name' => 'enable_post_title',
1006 - 'type' => 'toggle',
1007 - 'label' => __( 'Doc Title', 'betterdocs' ),
1379 + 'fields' => array(
1380 + 'enable_post_title' => array(
1381 + 'name' => 'enable_post_title',
1382 + 'type' => 'toggle',
1383 + 'label' => __( 'Doc Title', 'betterdocs' ),
1008 1384 'enable_disable_text_active' => true,
1009 - 'default' => 1,
1010 - 'priority' => 1
1011 - ],
1012 - 'enable_sidebar_cat_list' => [
1013 - 'name' => 'enable_sidebar_cat_list',
1014 - 'type' => 'toggle',
1015 - 'label' => __( 'Sidebar Category List', 'betterdocs' ),
1385 + 'default' => 1,
1386 + 'priority' => 1
1387 + ),
1388 + 'enable_sidebar_cat_list' => array(
1389 + 'name' => 'enable_sidebar_cat_list',
1390 + 'type' => 'toggle',
1391 + 'label' => __( 'Sidebar Category List', 'betterdocs' ),
1016 1392 'enable_disable_text_active' => true,
1017 - 'default' => 1,
1018 - 'priority' => 2
1019 - ],
1020 - 'enable_print_icon' => [
1021 - 'name' => 'enable_print_icon',
1022 - 'type' => 'toggle',
1023 - 'label' => __( 'Print Icon', 'betterdocs' ),
1393 + 'default' => 1,
1394 + 'priority' => 2
1395 + ),
1396 + 'enable_print_icon' => array(
1397 + 'name' => 'enable_print_icon',
1398 + 'type' => 'toggle',
1399 + 'label' => __( 'Print Icon', 'betterdocs' ),
1024 1400 'enable_disable_text_active' => true,
1025 - 'default' => 1,
1026 - 'priority' => 3
1027 - ],
1028 - 'enable_tags' => [
1029 - 'name' => 'enable_tags',
1030 - 'type' => 'toggle',
1031 - 'label' => __( 'Tags', 'betterdocs' ),
1401 + 'default' => 1,
1402 + 'priority' => 3
1403 + ),
1404 + 'print_enable_logo' => array(
1405 + 'name' => 'print_enable_logo',
1406 + 'type' => 'toggle',
1407 + 'label' => __( 'Logo on Printed Doc', 'betterdocs' ),
1408 + 'label_subtitle' => __( 'Show a logo at the top of the printed / PDF page', 'betterdocs' ),
1032 1409 'enable_disable_text_active' => true,
1033 - 'default' => 1,
1034 - 'priority' => 4
1035 - ],
1036 - 'show_last_update_time' => [
1037 - 'name' => 'show_last_update_time',
1038 - 'type' => 'toggle',
1039 - 'label' => __( 'Last Update Time', 'betterdocs' ),
1410 + 'default' => 0,
1411 + 'priority' => 4
1412 + ),
1413 + 'print_logo' => array(
1414 + 'name' => 'print_logo',
1415 + 'type' => 'media',
1416 + 'value' => '',
1417 + 'label' => __( 'Print Logo', 'betterdocs' ),
1418 + 'label_subtitle' => __( 'Leave empty to use your site logo, or the site icon when no site logo is set', 'betterdocs' ),
1419 + 'priority' => 5,
1420 + 'rules' => Rules::is( 'print_enable_logo', true )
1421 + ),
1422 + 'print_enable_footer' => array(
1423 + 'name' => 'print_enable_footer',
1424 + 'type' => 'toggle',
1425 + 'label' => __( 'Footer on Printed Doc', 'betterdocs' ),
1426 + 'label_subtitle' => __( 'Show a footer on every page of the printed / PDF document', 'betterdocs' ),
1040 1427 'enable_disable_text_active' => true,
1041 - 'default' => 1,
1042 - 'priority' => 5
1043 - ],
1044 - 'enable_navigation' => [
1045 - 'name' => 'enable_navigation',
1046 - 'type' => 'toggle',
1047 - 'label' => __( 'Navigation', 'betterdocs' ),
1428 + 'default' => 0,
1429 + 'priority' => 6
1430 + ),
1431 + 'print_footer_text' => array(
1432 + 'name' => 'print_footer_text',
1433 + 'type' => 'textarea',
1434 + 'label' => __( 'Print Footer Text', 'betterdocs' ),
1435 + 'label_subtitle' => __( 'Leave empty to use the site name and current year', 'betterdocs' ),
1436 + 'default' => '',
1437 + 'priority' => 7,
1438 + 'rules' => Rules::is( 'print_enable_footer', true )
1439 + ),
1440 + 'enable_tags' => array(
1441 + 'name' => 'enable_tags',
1442 + 'type' => 'toggle',
1443 + 'label' => __( 'Tags', 'betterdocs' ),
1048 1444 'enable_disable_text_active' => true,
1049 - 'default' => 1,
1050 - 'priority' => 6
1051 - ],
1052 - 'enable_comment' => [
1053 - 'name' => 'enable_comment',
1054 - 'type' => 'toggle',
1055 - 'label' => __( 'Comment', 'betterdocs' ),
1445 + 'default' => 1,
1446 + 'priority' => 8
1447 + ),
1448 + 'show_last_update_time' => array(
1449 + 'name' => 'show_last_update_time',
1450 + 'type' => 'toggle',
1451 + 'label' => __( 'Last Update Time', 'betterdocs' ),
1056 1452 'enable_disable_text_active' => true,
1057 - 'default' => '',
1058 - 'priority' => 7
1059 - ],
1060 - 'enable_credit' => [
1061 - 'name' => 'enable_credit',
1062 - 'type' => 'toggle',
1063 - 'label' => __( 'Credit', 'betterdocs' ),
1453 + 'default' => 1,
1454 + 'priority' => 9
1455 + ),
1456 + 'enable_navigation' => array(
1457 + 'name' => 'enable_navigation',
1458 + 'type' => 'toggle',
1459 + 'label' => __( 'Navigation', 'betterdocs' ),
1064 1460 'enable_disable_text_active' => true,
1065 - 'default' => 1,
1066 - 'priority' => 8
1067 - ],
1068 - 'enable_estimated_reading_time' => [
1069 - 'name' => 'enable_estimated_reading_time',
1070 - 'type' => 'toggle',
1071 - 'label' => __( 'Estimated Reading Time', 'betterdocs' ),
1461 + 'default' => 1,
1462 + 'priority' => 10
1463 + ),
1464 + 'enable_comment' => array(
1465 + 'name' => 'enable_comment',
1466 + 'type' => 'toggle',
1467 + 'label' => __( 'Comment', 'betterdocs' ),
1072 1468 'enable_disable_text_active' => true,
1073 - 'default' => 0,
1074 - 'priority' => 9
1075 - ],
1076 - ]
1077 - ],
1078 - 'layout_single_doc_TOC' => [
1079 - 'id' => 'layout_single_doc_TOC',
1080 - 'name' => 'layout_single_doc_TOC',
1081 - 'type' => 'section',
1082 - 'label' => __( 'TOC', 'betterdocs' ),
1469 + 'default' => '',
1470 + 'priority' => 11
1471 + ),
1472 + 'enable_credit' => array(
1473 + 'name' => 'enable_credit',
1474 + 'type' => 'toggle',
1475 + 'label' => __( 'Show Powered by BetterDocs', 'betterdocs' ),
1476 + 'enable_disable_text_active' => true,
1477 + 'default' => '',
1478 + 'priority' => 12
1479 + ),
1480 + 'reaction_feedback_text' => array(
1481 + 'name' => 'reaction_feedback_text',
1482 + 'type' => 'text',
1483 + 'label' => __( 'Reaction Feedback Text', 'betterdocs' ),
1484 + 'default' => __( 'Thanks for your feedback.', 'betterdocs' ),
1485 + 'priority' => 13
1486 + ),
1487 + 'enable_estimated_reading_time' => array(
1488 + 'name' => 'enable_estimated_reading_time',
1489 + 'type' => 'toggle',
1490 + 'label' => __( 'Estimated Reading Time', 'betterdocs' ),
1491 + 'enable_disable_text_active' => true,
1492 + 'default' => 0,
1493 + 'priority' => 14
1494 + ),
1495 + 'estimated_reading_time_title' => array(
1496 + 'name' => 'estimated_reading_time_title',
1497 + 'type' => 'text',
1498 + 'label' => __( 'Estimated Reading Time Title', 'betterdocs' ),
1499 + 'default' => '',
1500 + 'priority' => 15,
1501 + 'rules' => Rules::is( 'enable_estimated_reading_time', true )
1502 + ),
1503 + 'estimated_reading_time_text' => array(
1504 + 'name' => 'estimated_reading_time_text',
1505 + 'type' => 'text',
1506 + 'label' => __( 'Estimated Reading Time Text', 'betterdocs' ),
1507 + 'default' => __( 'min read', 'betterdocs' ),
1508 + 'priority' => 16,
1509 + 'rules' => Rules::is( 'enable_estimated_reading_time', true )
1510 + ),
1511 + 'singular_estimated_reading_time_text' => array(
1512 + 'name' => 'singular_estimated_reading_time_text',
1513 + 'type' => 'text',
1514 + 'label' => __( 'Estimated Reading Time Text Singular', 'betterdocs' ),
1515 + 'default' => __( 'min read', 'betterdocs' ),
1516 + 'priority' => 17,
1517 + 'rules' => Rules::is( 'enable_estimated_reading_time', true )
1518 + )
1519 + )
1520 + ),
1521 + 'layout_single_doc_TOC' => array(
1522 + 'id' => 'layout_single_doc_TOC',
1523 + 'name' => 'layout_single_doc_TOC',
1524 + 'type' => 'section',
1525 + 'label' => __( 'TOC', 'betterdocs' ),
1083 1526 'priority' => 5,
1084 - 'fields' => [
1085 - 'enable_toc' => [
1086 - 'name' => 'enable_toc',
1087 - 'type' => 'toggle',
1088 - 'label' => __( 'Table of Contents', 'betterdocs' ),
1527 + 'fields' => array(
1528 + 'enable_toc' => array(
1529 + 'name' => 'enable_toc',
1530 + 'type' => 'toggle',
1531 + 'label' => __( 'Table of Contents', 'betterdocs' ),
1089 1532 'enable_disable_text_active' => true,
1090 - 'default' => 1,
1091 - 'priority' => 1
1092 - ],
1093 - 'toc_title' => [
1094 - 'name' => 'toc_title',
1095 - 'type' => 'text',
1096 - 'label' => __( 'TOC Title', 'betterdocs' ),
1097 - 'default' => __( 'Table of Contents', 'betterdocs' ),
1533 + 'default' => 1,
1534 + 'priority' => 1
1535 + ),
1536 + 'toc_title' => array(
1537 + 'name' => 'toc_title',
1538 + 'type' => 'text',
1539 + 'label' => __( 'TOC Title', 'betterdocs' ),
1540 + 'default' => __( 'Table of Contents', 'betterdocs' ),
1098 1541 'priority' => 2,
1099 - 'rules' => Rules::is( 'enable_toc', true )
1542 + 'rules' => Rules::is( 'enable_toc', true )
1100 1543
1101 - ],
1102 - 'toc_hierarchy' => [
1103 - 'name' => 'toc_hierarchy',
1104 - 'type' => 'toggle',
1105 - 'label' => __( 'TOC Hierarchy', 'betterdocs' ),
1544 + ),
1545 + 'toc_hierarchy' => array(
1546 + 'name' => 'toc_hierarchy',
1547 + 'type' => 'toggle',
1548 + 'label' => __( 'TOC Hierarchy', 'betterdocs' ),
1106 1549 'enable_disable_text_active' => true,
1107 - 'default' => 1,
1108 - 'priority' => 3,
1109 - 'rules' => Rules::is( 'enable_toc', true )
1110 - ],
1111 - 'toc_list_number' => [
1112 - 'name' => 'toc_list_number',
1113 - 'type' => 'toggle',
1114 - 'label' => __( 'TOC List Number', 'betterdocs' ),
1550 + 'default' => 1,
1551 + 'priority' => 3,
1552 + 'rules' => Rules::is( 'enable_toc', true )
1553 + ),
1554 + 'toc_list_number' => array(
1555 + 'name' => 'toc_list_number',
1556 + 'type' => 'toggle',
1557 + 'label' => __( 'TOC List Number', 'betterdocs' ),
1115 1558 'enable_disable_text_active' => true,
1116 - 'default' => 1,
1117 - 'priority' => 4,
1118 - 'rules' => Rules::is( 'enable_toc', true )
1119 - ],
1120 - 'toc_dynamic_title' => [
1121 - 'name' => 'toc_dynamic_title',
1122 - 'type' => 'toggle',
1123 - 'label' => __( 'Show TOC Title in Anchor Links', 'betterdocs' ),
1559 + 'default' => 1,
1560 + 'priority' => 4,
1561 + 'rules' => Rules::is( 'enable_toc', true )
1562 + ),
1563 + 'toc_dynamic_title' => array(
1564 + 'name' => 'toc_dynamic_title',
1565 + 'type' => 'toggle',
1566 + 'label' => __( 'Show TOC Title in Anchor Links', 'betterdocs' ),
1124 1567 'enable_disable_text_active' => true,
1125 - 'default' => 0,
1126 - 'priority' => 5,
1127 - 'rules' => Rules::is( 'enable_toc', true )
1128 - ],
1129 - 'enable_sticky_toc' => [
1130 - 'name' => 'enable_sticky_toc',
1131 - 'type' => 'toggle',
1132 - 'label' => __( 'Sticky TOC', 'betterdocs' ),
1568 + 'default' => 0,
1569 + 'priority' => 5,
1570 + 'rules' => Rules::is( 'enable_toc', true )
1571 + ),
1572 + 'enable_sticky_toc' => array(
1573 + 'name' => 'enable_sticky_toc',
1574 + 'type' => 'toggle',
1575 + 'label' => __( 'Sticky TOC', 'betterdocs' ),
1133 1576 'enable_disable_text_active' => true,
1134 - 'default' => 1,
1135 - 'priority' => 6,
1136 - 'rules' => Rules::is( 'enable_toc', true )
1137 - ],
1138 - 'collapsible_toc_mobile' => [
1139 - 'name' => 'collapsible_toc_mobile',
1140 - 'type' => 'toggle',
1141 - 'label' => __( 'Collapsible TOC on small devices', 'betterdocs' ),
1577 + 'default' => 1,
1578 + 'priority' => 6,
1579 + 'rules' => Rules::is( 'enable_toc', true )
1580 + ),
1581 + 'collapsible_toc_mobile' => array(
1582 + 'name' => 'collapsible_toc_mobile',
1583 + 'type' => 'toggle',
1584 + 'label' => __( 'Collapsible TOC on small devices', 'betterdocs' ),
1142 1585 'enable_disable_text_active' => true,
1143 - 'default' => '',
1144 - 'priority' => 7,
1145 - 'rules' => Rules::is( 'enable_toc', true )
1146 - ],
1147 - 'title_link_ctc' => [
1148 - 'name' => 'title_link_ctc',
1149 - 'type' => 'toggle',
1150 - 'label' => __( 'Title Link Copy To Clipboard', 'betterdocs' ),
1586 + 'default' => '',
1587 + 'priority' => 7,
1588 + 'rules' => Rules::is( 'enable_toc', true )
1589 + ),
1590 + 'title_link_ctc' => array(
1591 + 'name' => 'title_link_ctc',
1592 + 'type' => 'toggle',
1593 + 'label' => __( 'Title Link Copy To Clipboard', 'betterdocs' ),
1151 1594 'enable_disable_text_active' => true,
1152 - 'default' => 1,
1153 - 'priority' => 8
1154 - ],
1155 - 'supported_heading_tag' => [
1156 - 'name' => 'supported_heading_tag',
1157 - 'label' => __( 'TOC Supported Heading Tag', 'betterdocs' ),
1158 - 'type' => 'checkbox-select',
1595 + 'default' => 1,
1596 + 'priority' => 8
1597 + ),
1598 + 'supported_heading_tag' => array(
1599 + 'name' => 'supported_heading_tag',
1600 + 'label' => __( 'TOC Supported Heading Tag', 'betterdocs' ),
1601 + 'type' => 'checkbox-select',
1159 1602 'multiple' => true,
1160 1603 'priority' => 10,
1161 - 'default' => ['1', '2', '3', '4', '5', '6'],
1162 - 'options' => $this->normalize_options( [
1604 + 'default' => array(
1605 + '1',
1606 + '2',
1607 + '3',
1608 + '4',
1609 + '5',
1610 + '6'
1611 + ),
1612 + 'options' => $this->normalize_options( array(
1163 1613 '1' => 'H1',
1164 1614 '2' => 'H2',
1165 1615 '3' => 'H3',
1166 1616 '4' => 'H4',
@@ -1165,963 +1615,1512 @@
1165 1615 '3' => 'H3',
1166 1616 '4' => 'H4',
1167 1617 '5' => 'H5',
1168 1618 '6' => 'H6'
1169 - ] ),
1619 + ) ),
1170 1620 'priority' => 9,
1171 - 'rules' => Rules::is( 'enable_toc', true )
1172 - ],
1173 - 'sticky_toc_offset' => [
1174 - 'name' => 'sticky_toc_offset',
1175 - 'type' => 'number',
1176 - 'label' => __( 'Content Offset', 'betterdocs' ),
1177 - 'default' => 100,
1178 - 'priority' => 10,
1621 + 'rules' => Rules::is( 'enable_toc', true )
1622 + ),
1623 + 'sticky_toc_offset' => array(
1624 + 'name' => 'sticky_toc_offset',
1625 + 'type' => 'number',
1626 + 'label' => __( 'Content Offset', 'betterdocs' ),
1627 + 'default' => 100,
1628 + 'priority' => 10,
1179 1629 'label_subtitle' => __( 'content offset from top on scroll.', 'betterdocs' ),
1180 - 'rules' => Rules::is( 'enable_toc', true )
1181 - ]
1182 - ]
1183 - ],
1184 - 'layout_single_doc_breadcrumb' => [
1185 - 'id' => 'layout_single_doc_breadcrumb',
1186 - 'name' => 'layout_single_doc_breadcrumb',
1187 - 'type' => 'section',
1188 - 'label' => __( 'Breadcrumb', 'betterdocs' ),
1630 + 'rules' => Rules::is( 'enable_toc', true )
1631 + )
1632 + )
1633 + ),
1634 + 'layout_single_doc_breadcrumb' => array(
1635 + 'id' => 'layout_single_doc_breadcrumb',
1636 + 'name' => 'layout_single_doc_breadcrumb',
1637 + 'type' => 'section',
1638 + 'label' => __( 'Breadcrumb', 'betterdocs' ),
1189 1639 'priority' => 5,
1190 - 'fields' => [
1191 - 'enable_breadcrumb' => [
1192 - 'name' => 'enable_breadcrumb',
1193 - 'type' => 'toggle',
1194 - 'label' => __( 'Breadcrumb', 'betterdocs' ),
1640 + 'fields' => array(
1641 + 'enable_breadcrumb' => array(
1642 + 'name' => 'enable_breadcrumb',
1643 + 'type' => 'toggle',
1644 + 'label' => __( 'Breadcrumb', 'betterdocs' ),
1195 1645 'enable_disable_text_active' => true,
1196 - 'default' => 1,
1197 - 'priority' => 1
1198 - ],
1199 - 'breadcrumb_home_text' => [
1200 - 'name' => 'breadcrumb_home_text',
1201 - 'type' => 'text',
1202 - 'label' => __( 'Breadcrumb Home Text', 'betterdocs' ),
1203 - 'default' => __( 'Home', 'betterdocs' ),
1646 + 'default' => 1,
1647 + 'priority' => 1
1648 + ),
1649 + 'enable_breadcrumb_home_text' => array(
1650 + 'name' => 'enable_breadcrumb_home_text',
1651 + 'type' => 'toggle',
1652 + 'label' => __( 'Enable Breadcrumb Home Text', 'betterdocs' ),
1653 + 'enable_disable_text_active' => true,
1654 + 'default' => true,
1204 1655 'priority' => 2,
1205 - 'rules' => Rules::is( 'enable_breadcrumb', true )
1206 - ],
1207 - 'breadcrumb_home_url' => [
1208 - 'name' => 'breadcrumb_home_url',
1209 - 'type' => 'text',
1210 - 'label' => __( 'Breadcrumb Home URL', 'betterdocs' ),
1656 + 'rules' => Rules::is( 'enable_breadcrumb', true )
1657 + ),
1658 + 'breadcrumb_home_text' => array(
1659 + 'name' => 'breadcrumb_home_text',
1660 + 'type' => 'text',
1661 + 'label' => __( 'Breadcrumb Home Text', 'betterdocs' ),
1662 + 'default' => __( 'Home', 'betterdocs' ),
1211 1663 'priority' => 3,
1212 - 'default' => get_home_url(),
1213 - 'rules' => Rules::is( 'enable_breadcrumb', true )
1214 - ],
1215 - 'enable_breadcrumb_category' => [
1216 - 'name' => 'enable_breadcrumb_category',
1217 - 'type' => 'toggle',
1218 - 'label' => __( 'Category on Breadcrumb', 'betterdocs' ),
1664 + 'rules' => Rules::logicalRule(
1665 + array(
1666 + Rules::is( 'enable_breadcrumb', true ),
1667 + Rules::is( 'enable_breadcrumb_home_text', true )
1668 + ),
1669 + 'and'
1670 + )
1671 + ),
1672 + 'breadcrumb_home_url' => array(
1673 + 'name' => 'breadcrumb_home_url',
1674 + 'type' => 'text',
1675 + 'label' => __( 'Breadcrumb Home URL', 'betterdocs' ),
1676 + 'priority' => 4,
1677 + 'default' => get_home_url(),
1678 + 'rules' => Rules::is( 'enable_breadcrumb', true )
1679 + ),
1680 + 'enable_breadcrumb_category' => array(
1681 + 'name' => 'enable_breadcrumb_category',
1682 + 'type' => 'toggle',
1683 + 'label' => __( 'Category on Breadcrumb', 'betterdocs' ),
1219 1684 'enable_disable_text_active' => true,
1220 - 'default' => 1,
1221 - 'priority' => 4,
1222 - 'rules' => Rules::is( 'enable_breadcrumb', true )
1223 - ],
1224 - 'enable_breadcrumb_title' => [
1225 - 'name' => 'enable_breadcrumb_title',
1226 - 'type' => 'toggle',
1227 - 'label' => __( 'Title on Breadcrumb', 'betterdocs' ),
1685 + 'default' => 1,
1686 + 'priority' => 5,
1687 + 'rules' => Rules::is( 'enable_breadcrumb', true )
1688 + ),
1689 + 'enable_breadcrumb_title' => array(
1690 + 'name' => 'enable_breadcrumb_title',
1691 + 'type' => 'toggle',
1692 + 'label' => __( 'Title on Breadcrumb', 'betterdocs' ),
1228 1693 'enable_disable_text_active' => true,
1229 - 'default' => 1,
1230 - 'priority' => 5,
1231 - 'rules' => Rules::is( 'enable_breadcrumb', true )
1232 - ]
1233 - ]
1234 - ],
1235 - 'layout_single_doc_email_feedback' => [
1236 - 'id' => 'layout_single_doc_email_feedback',
1237 - 'name' => 'layout_single_doc_email_feedback',
1238 - 'type' => 'section',
1239 - 'label' => __( 'Email Feedback', 'betterdocs' ),
1694 + 'default' => 1,
1695 + 'priority' => 6,
1696 + 'rules' => Rules::is( 'enable_breadcrumb', true )
1697 + )
1698 + )
1699 + ),
1700 + 'layout_single_doc_email_feedback' => array(
1701 + 'id' => 'layout_single_doc_email_feedback',
1702 + 'name' => 'layout_single_doc_email_feedback',
1703 + 'type' => 'section',
1704 + 'label' => __( 'Email Feedback', 'betterdocs' ),
1240 1705 'priority' => 5,
1241 - 'fields' => [
1242 - 'email_feedback' => [
1243 - 'name' => 'email_feedback',
1244 - 'type' => 'toggle',
1245 - 'label' => __( 'Email Feedback', 'betterdocs' ),
1706 + 'fields' => array(
1707 + 'email_feedback' => array(
1708 + 'name' => 'email_feedback',
1709 + 'type' => 'toggle',
1710 + 'label' => __( 'Email Feedback', 'betterdocs' ),
1246 1711 'enable_disable_text_active' => true,
1247 - 'default' => 1,
1248 - 'priority' => 1
1249 - ],
1250 - 'feedback_link_text' => [
1251 - 'name' => 'feedback_link_text',
1252 - 'type' => 'text',
1253 - 'label' => __( 'Feedback Link Text', 'betterdocs' ),
1254 - 'default' => __( 'Still stuck? How can we help?', 'betterdocs' ),
1712 + 'default' => 1,
1713 + 'priority' => 1
1714 + ),
1715 + 'feedback_link_text' => array(
1716 + 'name' => 'feedback_link_text',
1717 + 'type' => 'text',
1718 + 'label' => __( 'Feedback Link Text', 'betterdocs' ),
1719 + 'default' => __( 'Still stuck? How can we help?', 'betterdocs' ),
1255 1720 'priority' => 2,
1256 - 'rules' => Rules::is( 'email_feedback', true )
1257 - ],
1258 - 'feedback_form_title' => [
1259 - 'name' => 'feedback_form_title',
1260 - 'type' => 'text',
1261 - 'label' => __( 'Feedback Form Title', 'betterdocs' ),
1262 - 'default' => __( 'Still stuck? How can we help?', 'betterdocs' ),
1721 + 'rules' => Rules::is( 'email_feedback', true )
1722 + ),
1723 + 'feedback_form_title' => array(
1724 + 'name' => 'feedback_form_title',
1725 + 'type' => 'text',
1726 + 'label' => __( 'Feedback Form Title', 'betterdocs' ),
1727 + 'default' => __( 'Still stuck? How can we help?', 'betterdocs' ),
1263 1728 'priority' => 3,
1264 - 'rules' => Rules::is( 'email_feedback', true )
1265 - ],
1266 - 'email_address' => [
1267 - 'name' => 'email_address',
1268 - 'type' => 'text',
1269 - 'label' => __( 'Email Address', 'betterdocs' ),
1270 - 'default' => get_option( 'admin_email' ),
1271 - 'priority' => 4,
1729 + 'rules' => Rules::is( 'email_feedback', true )
1730 + ),
1731 + 'email_address' => array(
1732 + 'name' => 'email_address',
1733 + 'type' => 'text',
1734 + 'label' => __( 'Email Address', 'betterdocs' ),
1735 + 'default' => get_option( 'admin_email' ),
1736 + 'priority' => 4,
1272 1737 'label_subtitle' => __( 'The email address where the Feedback form will be sent', 'betterdocs' ),
1273 - 'rules' => Rules::is( 'email_feedback', true )
1274 - ],
1275 - 'feedback_url' => [
1276 - 'name' => 'feedback_url',
1277 - 'type' => 'text',
1278 - 'label' => __( 'Feedback URL', 'betterdocs' ),
1279 - 'default' => '',
1738 + 'rules' => Rules::is( 'email_feedback', true )
1739 + ),
1740 + 'feedback_url' => array(
1741 + 'name' => 'feedback_url',
1742 + 'type' => 'text',
1743 + 'label' => __( 'Feedback URL', 'betterdocs' ),
1744 + 'default' => '',
1280 1745 'priority' => 5,
1281 - 'rules' => Rules::is( 'email_feedback', true )
1282 - ]
1283 - ]
1284 - ],
1285 - [
1286 - 'id' => 'layout_single_doc_attachments',
1287 - 'name' => 'layout_single_doc_attachments',
1288 - 'type' => 'section',
1289 - 'label' => __( 'Attachments', 'betterdocs-pro' ),
1746 + 'rules' => Rules::is( 'email_feedback', true )
1747 + )
1748 + )
1749 + ),
1750 + array(
1751 + 'id' => 'layout_single_doc_attachments',
1752 + 'name' => 'layout_single_doc_attachments',
1753 + 'type' => 'section',
1754 + 'label' => __( 'Attachments', 'betterdocs' ),
1290 1755 'priority' => 6,
1291 - 'fields' => apply_filters( 'betterdocs_single_doc_attachments', [
1292 - 'show_attachment' => [
1293 - 'name' => 'show_attachment',
1294 - 'type' => 'toggle',
1295 - 'is_pro' => true,
1296 - 'priority' => 1,
1297 - 'label' => __( 'Show Attachment', 'betterdocs-pro' ),
1756 + 'fields' => apply_filters( 'betterdocs_single_doc_attachments', array(
1757 + 'show_attachment' => array(
1758 + 'name' => 'show_attachment',
1759 + 'type' => 'toggle',
1760 + 'is_pro' => true,
1761 + 'priority' => 1,
1762 + 'label' => __( 'Show Attachment', 'betterdocs' ),
1298 1763 'enable_disable_text_active' => true,
1299 - 'default' => false
1300 - ]
1301 - ] )
1302 - ],
1303 - [
1304 - 'id' => 'layout_single_doc_related_docs',
1305 - 'name' => 'layout_single_doc_related_docs',
1306 - 'type' => 'section',
1307 - 'label' => __( 'Related Docs', 'betterdocs-pro' ),
1764 + 'default' => false
1765 + )
1766 + ) )
1767 + ),
1768 + array(
1769 + 'id' => 'layout_single_doc_related_docs',
1770 + 'name' => 'layout_single_doc_related_docs',
1771 + 'type' => 'section',
1772 + 'label' => __( 'Related Docs', 'betterdocs' ),
1308 1773 'priority' => 7,
1309 - 'fields' => apply_filters( 'betterdocs_single_doc_related_docs', [
1310 - 'show_related_docs' => [
1311 - 'name' => 'show_related_docs',
1312 - 'type' => 'toggle',
1313 - 'is_pro' => true,
1314 - 'priority' => 1,
1315 - 'label' => __( 'Show Related Docs', 'betterdocs-pro' ),
1774 + 'fields' => apply_filters( 'betterdocs_single_doc_related_docs', array(
1775 + 'show_related_docs' => array(
1776 + 'name' => 'show_related_docs',
1777 + 'type' => 'toggle',
1778 + 'is_pro' => true,
1779 + 'priority' => 1,
1780 + 'label' => __( 'Show Related Docs', 'betterdocs' ),
1316 1781 'enable_disable_text_active' => true,
1317 - 'default' => false
1318 - ]
1319 - ] )
1320 - ]
1321 - ]
1322 - ]
1323 - ]
1324 - ] ),
1325 - 'layout_archive_page' => [
1326 - 'id' => 'layout_archive_page',
1327 - 'name' => 'layout_archive_page',
1328 - 'type' => 'section',
1329 - 'label' => __( 'Archive Page', 'betterdocs' ),
1782 + 'default' => false
1783 + )
1784 + ) )
1785 + )
1786 + )
1787 + )
1788 + )
1789 + ) ),
1790 + 'layout_archive_page' => array(
1791 + 'id' => 'layout_archive_page',
1792 + 'name' => 'layout_archive_page',
1793 + 'type' => 'section',
1794 + 'label' => __( 'Archive Page', 'betterdocs' ),
1330 1795 'priority' => 3,
1331 - 'fields' => [
1332 - 'enable_archive_sidebar' => [
1333 - 'name' => 'enable_archive_sidebar',
1334 - 'type' => 'toggle',
1335 - 'label' => __( 'Sidebar Category List', 'betterdocs' ),
1796 + 'fields' => array(
1797 + 'enable_archive_sidebar' => array(
1798 + 'name' => 'enable_archive_sidebar',
1799 + 'type' => 'toggle',
1800 + 'label' => __( 'Sidebar Category List', 'betterdocs' ),
1336 1801 'enable_disable_text_active' => true,
1337 - 'default' => 1,
1338 - 'priority' => 31
1339 - ],
1340 - 'archive_nested_subcategory' => [
1341 - 'name' => 'archive_nested_subcategory',
1342 - 'type' => 'toggle',
1343 - 'label' => __( 'Nested Subcategory', 'betterdocs' ),
1802 + 'default' => 1,
1803 + 'priority' => 31
1804 + ),
1805 + 'archive_nested_subcategory' => array(
1806 + 'name' => 'archive_nested_subcategory',
1807 + 'type' => 'toggle',
1808 + 'label' => __( 'Nested Subcategory', 'betterdocs' ),
1344 1809 'enable_disable_text_active' => true,
1345 - 'default' => 1,
1346 - 'priority' => 32
1347 - ]
1348 - ]
1349 - ]
1350 - ]
1351 - ] )
1352 - ]
1353 - ]
1354 - ]
1355 - ] ),
1356 - 'tab-design' => apply_filters( 'betterdocs_settings_tab_design', [
1357 - 'id' => 'tab-design',
1358 - 'label' => __( 'Design', 'betterdocs' ),
1810 + 'default' => 1,
1811 + 'priority' => 32
1812 + ),
1813 + 'archive_enable_pagination' => array(
1814 + 'name' => 'archive_enable_pagination',
1815 + 'type' => 'toggle',
1816 + 'label' => __( 'Enable Pagination', 'betterdocs' ),
1817 + 'enable_disable_text_active' => true,
1818 + 'default' => false,
1819 + 'priority' => 33
1820 + )
1821 + )
1822 + )
1823 + )
1824 + ) )
1825 + )
1826 + )
1827 + )
1828 + ) ),
1829 + 'tab-design' => apply_filters( 'betterdocs_settings_tab_design', array(
1830 + 'id' => 'tab-design',
1831 + 'label' => __( 'Design', 'betterdocs' ),
1359 1832 'priority' => 30,
1360 - 'fields' => [
1361 - 'title-design' => [
1362 - 'name' => 'title-design-tab',
1363 - 'type' => 'section',
1364 - 'label' => __( 'Design', 'betterdocs' ),
1833 + 'fields' => array(
1834 + 'title-design' => array(
1835 + 'name' => 'title-design-tab',
1836 + 'type' => 'section',
1837 + 'label' => __( 'Design', 'betterdocs' ),
1365 1838 'priority' => 30,
1366 - 'fields' => [
1367 - 'customizer_link' => [
1368 - 'name' => 'customizer_link',
1369 - 'type' => 'action',
1370 - 'action' => 'betterdocs_settings_customizer_link',
1371 - 'label' => __( 'Customize BetterDocs', 'betterdocs' ),
1372 - 'url' => $this->customizer_link(),
1373 - 'customizer_img' => betterdocs()->assets->icon( 'customizer/betterdocs-customize.png', true ),
1374 - 'priority' => 1
1375 - ]
1376 - ]
1377 - ]
1378 - ]
1379 - ] ),
1380 - 'tab-shortcodes' => apply_filters( 'betterdocs_settings_tab_shortcodes', [
1381 - 'label' => __( 'Shortcodes', 'betterdocs' ),
1382 - 'id' => 'tab-shortcodes',
1383 - 'classes' => 'tab-shortcodes',
1839 + 'fields' => $this->design_tab()
1840 + )
1841 + )
1842 + ) ),
1843 + 'tab-shortcodes' => apply_filters( 'betterdocs_settings_tab_shortcodes', array(
1844 + 'label' => __( 'Shortcodes', 'betterdocs' ),
1845 + 'id' => 'tab-shortcodes',
1846 + 'classes' => 'tab-shortcodes',
1384 1847 'priority' => 40,
1385 - 'fields' => [
1386 - 'title-shortcodes' => [
1387 - 'name' => 'title-shortcodes-tab',
1388 - 'type' => 'section',
1389 - 'label' => __( 'Shortcodes', 'betterdocs' ),
1390 - 'priority' => 40,
1391 - 'searchable' => true,
1392 - 'searchPlaceholder' => __( 'Search for shortcode', 'betterdocs' ),
1848 + 'fields' => array(
1849 + 'title-shortcodes' => array(
1850 + 'name' => 'title-shortcodes-tab',
1851 + 'type' => 'section',
1852 + 'label' => __( 'Shortcodes', 'betterdocs' ),
1853 + 'priority' => 40,
1854 + 'searchable' => true,
1855 + 'searchPlaceholder' => __( 'Search for shortcode', 'betterdocs' ),
1393 1856 'searchNotFoundMessage' => '<img src="' . betterdocs()->assets->icon( 'not-found.svg', true ) . '"/><p>' . __( 'No Shortcodes Found with these keywords', 'betterdocs' ) . '</p>',
1394 - 'fields' => apply_filters( 'betterdocs_shortcode_fields', [
1395 - 'search_form' => [
1396 - 'name' => 'search_form',
1397 - 'type' => 'copy-to-clipboard',
1398 - 'label' => __( 'Search Form', 'betterdocs' ),
1399 - 'default' => '[betterdocs_search_form]',
1400 - 'readOnly' => true,
1401 - 'priority' => 1,
1402 - 'description' => __( '[betterdocs_search_form placeholder="Search..." heading="Heading" subheading="Subheading" category_search="true" search_button="true" popular_search="true"]', 'betterdocs' ),
1403 - 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1857 + 'fields' => apply_filters( 'betterdocs_shortcode_fields', array(
1858 + 'search_form' => array(
1859 + 'name' => 'search_form',
1860 + 'type' => 'copy-to-clipboard',
1861 + 'label' => __( 'Search Form', 'betterdocs' ),
1862 + 'default' => '[betterdocs_search_form]',
1863 + 'readOnly' => true,
1864 + 'priority' => 1,
1865 + 'description' => __( '[betterdocs_search_form placeholder="Search..." heading="Heading" subheading="Subheading" category_search="true" search_button="true" popular_search="true"]', 'betterdocs' ),
1866 + 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1404 1867 'descriptionCopyable' => true
1405 - ],
1406 - 'feedback_form' => [
1407 - 'name' => 'feedback_form',
1408 - 'type' => 'copy-to-clipboard',
1409 - 'label' => __( 'Feedback Form', 'betterdocs' ),
1410 - 'default' => '[betterdocs_feedback_form]',
1411 - 'readOnly' => true,
1412 - 'priority' => 2,
1413 - 'description' => __( '[betterdocs_feedback_form button_text="Send"]', 'betterdocs' ),
1414 - 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1868 + ),
1869 + 'feedback_form' => array(
1870 + 'name' => 'feedback_form',
1871 + 'type' => 'copy-to-clipboard',
1872 + 'label' => __( 'Feedback Form', 'betterdocs' ),
1873 + 'default' => '[betterdocs_feedback_form]',
1874 + 'readOnly' => true,
1875 + 'priority' => 2,
1876 + 'description' => __( '[betterdocs_feedback_form button_text="Send"]', 'betterdocs' ),
1877 + 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1415 1878 'descriptionCopyable' => true
1416 - ],
1417 - 'category_grid' => [
1418 - 'name' => 'category_grid',
1419 - 'type' => 'copy-to-clipboard',
1420 - 'label' => __( 'Category Grid- Layout 1', 'betterdocs' ),
1421 - 'default' => '[betterdocs_category_grid]',
1422 - 'readOnly' => true,
1423 - 'priority' => 3,
1424 - 'description' => __( '[betterdocs_category_grid post_counter="true" show_icon="true" masonry="true" column="3" posts_per_page="5" nested_subcategory="true" terms="term_ID, term_ID" terms_orderby="" terms_order="" multiple_knowledge_base="" kb_slug="" title_tag="h2" orderby="" order="" ]', 'betterdocs' ),
1425 - 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1879 + ),
1880 + 'category_grid' => array(
1881 + 'name' => 'category_grid',
1882 + 'type' => 'copy-to-clipboard',
1883 + 'label' => __( 'Category Grid- Layout 1', 'betterdocs' ),
1884 + 'default' => '[betterdocs_category_grid]',
1885 + 'readOnly' => true,
1886 + 'priority' => 3,
1887 + 'description' => __( '[betterdocs_category_grid show_count="true" show_icon="true" masonry="true" column="3" posts_per_page="5" nested_subcategory="true" terms="term_ID, term_ID" terms_orderby="" terms_order="" multiple_knowledge_base="" kb_slug="" title_tag="h2" orderby="" order="" ]', 'betterdocs' ),
1888 + 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1426 1889 'descriptionCopyable' => true
1427 - ],
1428 - 'category_box' => [
1429 - 'name' => 'category_box',
1430 - 'type' => 'copy-to-clipboard',
1431 - 'label' => __( 'Category Box- Layout 2', 'betterdocs' ),
1432 - 'default' => '[betterdocs_category_box]',
1433 - 'readOnly' => true,
1434 - 'priority' => 4,
1435 - 'description' => __( '[betterdocs_category_box orderby="" column="" nested_subcategory="" terms="" terms_orderby="" show_icon="" kb_slug="" title_tag="h2" multiple_knowledge_base="false" border_bottom="false"]', 'betterdocs' ),
1436 - 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1890 + ),
1891 + 'category_box' => array(
1892 + 'name' => 'category_box',
1893 + 'type' => 'copy-to-clipboard',
1894 + 'label' => __( 'Category Box- Layout 2', 'betterdocs' ),
1895 + 'default' => '[betterdocs_category_box]',
1896 + 'readOnly' => true,
1897 + 'priority' => 4,
1898 + 'description' => __( '[betterdocs_category_box orderby="" column="" nested_subcategory="" terms="" terms_orderby="" show_icon="" kb_slug="" title_tag="h2" multiple_knowledge_base="false" border_bottom="false"]', 'betterdocs' ),
1899 + 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1437 1900 'descriptionCopyable' => true
1438 - ],
1439 - 'category_list' => [
1440 - 'name' => 'category_list',
1441 - 'type' => 'copy-to-clipboard',
1442 - 'label' => __( 'Category List', 'betterdocs' ),
1443 - 'default' => '[betterdocs_category_list]',
1444 - 'readOnly' => true,
1445 - 'priority' => 5,
1446 - 'description' => __( '[betterdocs_category_list orderby="" order="" posts_per_page="" nested_subcategory="" terms="" terms_orderby="" terms_order="" kb_slug="" multiple_knowledge_base="false" title_tag="h2"]', 'betterdocs' ),
1447 - 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1901 + ),
1902 + 'category_list' => array(
1903 + 'name' => 'category_list',
1904 + 'type' => 'copy-to-clipboard',
1905 + 'label' => __( 'Category List', 'betterdocs' ),
1906 + 'default' => '[betterdocs_category_list]',
1907 + 'readOnly' => true,
1908 + 'priority' => 5,
1909 + 'description' => __( '[betterdocs_category_list orderby="" order="" posts_per_page="" nested_subcategory="" terms="" terms_orderby="" terms_order="" kb_slug="" multiple_knowledge_base="false" title_tag="h2"]', 'betterdocs' ),
1910 + 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1448 1911 'descriptionCopyable' => true
1449 - ],
1450 - 'faq_modern_layout' => [
1451 - 'name' => 'faq_modern_layout',
1452 - 'type' => 'copy-to-clipboard',
1453 - 'label' => __( 'FAQ Layout - 1', 'betterdocs' ),
1454 - 'default' => '[betterdocs_faq_list_modern]',
1455 - 'readOnly' => true,
1456 - 'priority' => 13,
1457 - 'description' => __( '[betterdocs_faq_list_modern groups="group_id" class="" group_exclude="group_id" faq_heading="Frequently Asked Questions"]', 'betterdocs' ),
1458 - 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1912 + ),
1913 + 'faq_modern_layout' => array(
1914 + 'name' => 'faq_modern_layout',
1915 + 'type' => 'copy-to-clipboard',
1916 + 'label' => __( 'FAQ Layout - 1', 'betterdocs' ),
1917 + 'default' => '[betterdocs_faq_list_modern]',
1918 + 'readOnly' => true,
1919 + 'priority' => 13,
1920 + 'description' => __( '[betterdocs_faq_list_modern groups="group_id" class="" group_exclude="group_id" faq_heading="Frequently Asked Questions"]', 'betterdocs' ),
1921 + 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1459 1922 'descriptionCopyable' => true
1460 - ],
1461 - 'faq_classic_layout' => [
1462 - 'name' => 'faq_classic_layout',
1463 - 'type' => 'copy-to-clipboard',
1464 - 'label' => __( 'FAQ Layout - 2', 'betterdocs' ),
1465 - 'default' => '[betterdocs_faq_list_classic]',
1466 - 'readOnly' => true,
1467 - 'priority' => 14,
1468 - 'description' => __( '[betterdocs_faq_list_classic groups="group_id" class="" group_exclude="group_id" faq_heading="Frequently Asked Questions"]', 'betterdocs' ),
1469 - 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1923 + ),
1924 + 'faq_classic_layout' => array(
1925 + 'name' => 'faq_classic_layout',
1926 + 'type' => 'copy-to-clipboard',
1927 + 'label' => __( 'FAQ Layout - 2', 'betterdocs' ),
1928 + 'default' => '[betterdocs_faq_list_classic]',
1929 + 'readOnly' => true,
1930 + 'priority' => 14,
1931 + 'description' => __( '[betterdocs_faq_list_classic groups="group_id" class="" group_exclude="group_id" faq_heading="Frequently Asked Questions"]', 'betterdocs' ),
1932 + 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1470 1933 'descriptionCopyable' => true
1471 - ]
1472 - ] )
1473 - ]
1474 - ]
1475 - ] ),
1476 - 'tab-advance-settings' => apply_filters( 'betterdocs_settings_tab_advance', [
1477 - 'id' => 'tab-advance-settings',
1478 - 'label' => __( 'Advanced Settings', 'betterdocs' ),
1934 + ),
1935 + 'betterdocs_faq_list_layout_3' => array(
1936 + 'name' => 'betterdocs_faq_list_layout_3',
1937 + 'type' => 'copy-to-clipboard',
1938 + 'label' => __( 'FAQ Layout - 3', 'betterdocs' ),
1939 + 'default' => '[betterdocs_faq_list_layout_3 class="faq-doc betterdocs-faq-layout-3"]',
1940 + 'readOnly' => true,
1941 + 'priority' => 15,
1942 + 'description' => __( '[betterdocs_faq_list_layout_3 class="faq-doc betterdocs-faq-layout-3" groups="group_id" class="" group_exclude="group_id" faq_heading="Frequently Asked Questions"]', 'betterdocs' ),
1943 + 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1944 + 'descriptionCopyable' => true
1945 + ),
1946 + 'betterdocs_faq_tab' => array(
1947 + 'name' => 'betterdocs_faq_tab',
1948 + 'type' => 'copy-to-clipboard',
1949 + 'label' => __( 'FAQ Layout - 4', 'betterdocs' ),
1950 + 'default' => '[betterdocs_faq_tab class="faq-doc betterdocs-faq-layout-4"]',
1951 + 'readOnly' => true,
1952 + 'priority' => 16,
1953 + 'description' => __( '[betterdocs_faq_tab class="faq-doc betterdocs-faq-layout-4" groups="group_id" group_exclude="group_id" faq_heading="Frequently Asked Questions"]', 'betterdocs' ),
1954 + 'descriptionLabel' => __( 'Example with parameters:', 'betterdocs' ),
1955 + 'descriptionCopyable' => true
1956 + )
1957 + ) )
1958 + )
1959 + )
1960 + ) ),
1961 + 'tab-advance-settings' => apply_filters( 'betterdocs_settings_tab_advance', array(
1962 + 'id' => 'tab-advance-settings',
1963 + 'label' => __( 'Access & Restrictions', 'betterdocs' ),
1964 + 'classes' => 'tab-layout',
1479 1965 'priority' => 50,
1480 - 'fields' => [
1481 - 'title-advance-settings' => [
1482 - 'name' => 'title-advance-settings-tab',
1483 - 'type' => 'section',
1484 - 'label' => __( 'Advanced Settings', 'betterdocs' ),
1966 + 'fields' => array(
1967 + 'title_advance_settings' => array(
1968 + 'name' => 'title-advance-settings-tab',
1969 + 'type' => 'section',
1970 + 'label' => __( 'Access & Restrictions', 'betterdocs' ),
1485 1971 'priority' => 50,
1486 - 'fields' => apply_filters( 'betterdocs_internal_kb_fields', [
1487 - 'article_roles' => [
1488 - 'name' => 'article_roles',
1489 - 'type' => 'checkbox-select',
1490 - 'label' => __( 'Who Can Write Docs?', 'betterdocs' ),
1491 - 'priority' => 1,
1492 - 'multiple' => true,
1493 - 'search' => true,
1494 - 'is_pro' => true,
1495 - 'default' => ['administrator'],
1496 - 'options' => $wp_roles
1497 - ],
1498 - 'settings_roles' => [
1499 - 'name' => 'settings_roles',
1500 - 'type' => 'checkbox-select',
1501 - 'label' => __( 'Who Can Edit Settings?', 'betterdocs' ),
1502 - 'priority' => 2,
1503 - 'multiple' => true,
1504 - 'is_pro' => true,
1505 - 'search' => true,
1506 - 'default' => ['administrator'],
1507 - 'options' => $wp_roles
1508 - ],
1509 - 'analytics_roles' => [
1510 - 'name' => 'analytics_roles',
1511 - 'type' => 'checkbox-select',
1512 - 'label' => __( 'Who Can Check Analytics?', 'betterdocs' ),
1513 - 'priority' => 3,
1514 - 'multiple' => true,
1515 - 'is_pro' => true,
1516 - 'search' => true,
1517 - 'default' => ['administrator'],
1518 - 'options' => $wp_roles
1519 - ],
1520 - 'enable_content_restriction' => [
1521 - 'name' => 'enable_content_restriction',
1522 - 'type' => 'toggle',
1523 - 'is_pro' => true,
1524 - 'priority' => 4,
1525 - 'label' => __( 'Internal Knowledge Base', 'betterdocs' ),
1526 - 'enable_disable_text_active' => true,
1527 - 'default' => ['all']
1528 - ],
1529 - 'content_visibility' => [
1530 - 'name' => 'content_visibility',
1531 - 'type' => 'checkbox-select',
1532 - 'label' => __( 'Restrict Access to', 'betterdocs' ),
1533 - 'label_subtitle' => __( 'Only selected User Roles will be able to view your Knowledge Base', 'betterdocs' ),
1534 - 'is_pro' => true,
1535 - 'priority' => 5,
1536 - 'multiple' => true,
1537 - 'search' => true,
1538 - 'default' => ['all'],
1539 - 'placeholder' => __( 'Select any', 'betterdocs' ),
1540 - 'options' => $this->normalize_options( array_merge( [
1541 - 'all' => __( 'All logged in users', 'betterdocs' )
1542 - ], wp_roles()->role_names ) ),
1543 - 'rules' => Rules::is( 'enable_content_restriction', true ),
1544 - 'filterValue' => 'all'
1545 - ],
1546 - 'restrict_template' => [
1547 - 'name' => 'restrict_template',
1548 - 'type' => 'checkbox-select',
1549 - 'label' => __( 'Restriction on Docs', 'betterdocs' ),
1550 - 'label_subtitle' => __( 'Selected Docs pages will be restricted', 'betterdocs' ),
1551 - 'is_pro' => true,
1552 - 'priority' => 6,
1553 - 'multiple' => true,
1554 - 'search' => true,
1555 - 'default' => ['all'],
1556 - 'placeholder' => __( 'Select any', 'betterdocs' ),
1557 - 'options' => $this->get_texanomy(),
1558 - 'rules' => Rules::is( 'enable_content_restriction', true ),
1559 - 'filterValue' => 'all'
1560 - ],
1561 - 'restrict_category' => [
1562 - 'name' => 'restrict_category',
1563 - 'type' => 'checkbox-select',
1564 - 'label' => __( 'Restriction on Docs Categories', 'betterdocs' ),
1565 - 'label_subtitle' => __( 'Selected Docs categories will be restricted', 'betterdocs' ),
1566 - 'is_pro' => true,
1567 - 'priority' => 7,
1568 - 'multiple' => true,
1569 - 'search' => true,
1570 - 'default' => ['all'],
1571 - 'placeholder' => __( 'Select any', 'betterdocs' ),
1572 - 'options' => $this->get_terms( 'doc_category' ),
1573 - 'rules' => Rules::is( 'enable_content_restriction', true ),
1574 - 'filterValue' => 'all'
1575 - ],
1576 - 'restricted_redirect_url' => [
1577 - 'name' => 'restricted_redirect_url',
1578 - 'type' => 'text',
1579 - 'label' => __( 'Redirect URL', 'betterdocs' ),
1580 - 'label_subtitle' => __( 'Set a custom URL to redirect users without permissions when they try to access internal knowledge base. By default, restricted content will redirect to the "404 not found" page', 'betterdocs' ),
1581 - 'default' => '',
1582 - 'placeholder' => 'https://',
1583 - 'is_pro' => true,
1584 - 'priority' => 9,
1585 - 'rules' => Rules::is( 'enable_content_restriction', true )
1586 - ]
1587 - ] )
1588 - ]
1589 - ]
1590 - ] ),
1591 - 'tab-email-reporting' => apply_filters( 'betterdocs_settings_tab_email_reporting', [
1592 - 'id' => 'tab-email-reporting',
1593 - 'label' => __( 'Email Reporting', 'betterdocs' ),
1972 + 'fields' => array(
1973 + 'tab-advanced-settings' => array(
1974 + 'id' => 'tab-advanced-settings',
1975 + 'name' => 'tab-advanced-settings',
1976 + 'label' => __( 'Access & Restrictions', 'betterdocs' ),
1977 + 'classes' => 'tab-layout',
1978 + 'type' => 'tab',
1979 + 'active' => 'global_role_management',
1980 + 'completionTrack' => true,
1981 + 'sidebar' => false,
1982 + 'save' => false,
1983 + 'title' => false,
1984 + 'config' => array(
1985 + 'active' => '',
1986 + 'sidebar' => false,
1987 + 'title' => false
1988 + ),
1989 + 'submit' => array(
1990 + 'show' => false
1991 + ),
1992 + 'step' => array(
1993 + 'show' => false
1994 + ),
1995 + 'priority' => 50,
1996 + 'fields' => array(
1997 + 'global_role_management' => array(
1998 + 'id' => 'global_role_management',
1999 + 'name' => 'global_role_management',
2000 + 'type' => 'section',
2001 + 'label' => __( 'Global Role Management', 'betterdocs' ),
2002 + 'priority' => 1,
2003 + 'fields' => array(
2004 + 'article_roles' => array(
2005 + 'name' => 'article_roles',
2006 + 'type' => 'checkbox-select',
2007 + 'label' => __( 'Who Can Write Docs?', 'betterdocs' ),
2008 + 'priority' => 1,
2009 + 'multiple' => true,
2010 + 'search' => true,
2011 + 'is_pro' => true,
2012 + 'default' => array( 'administrator' ),
2013 + 'options' => $wp_roles
2014 + ),
2015 + 'settings_roles' => array(
2016 + 'name' => 'settings_roles',
2017 + 'type' => 'checkbox-select',
2018 + 'label' => __( 'Who Can Edit Settings?', 'betterdocs' ),
2019 + 'priority' => 2,
2020 + 'multiple' => true,
2021 + 'is_pro' => true,
2022 + 'search' => true,
2023 + 'default' => array( 'administrator' ),
2024 + 'options' => $wp_roles
2025 + ),
2026 + 'analytics_roles' => array(
2027 + 'name' => 'analytics_roles',
2028 + 'type' => 'checkbox-select',
2029 + 'label' => __( 'Who Can Check Analytics?', 'betterdocs' ),
2030 + 'priority' => 3,
2031 + 'multiple' => true,
2032 + 'is_pro' => true,
2033 + 'search' => true,
2034 + 'default' => array( 'administrator' ),
2035 + 'options' => $wp_roles
2036 + ),
2037 + 'faq_roles' => array(
2038 + 'name' => 'faq_roles',
2039 + 'type' => 'checkbox-select',
2040 + 'label' => __( 'Who Can Check FAQ Builder?', 'betterdocs' ),
2041 + 'priority' => 4,
2042 + 'multiple' => true,
2043 + 'is_pro' => true,
2044 + 'search' => true,
2045 + 'default' => array( 'administrator' ),
2046 + 'options' => $wp_roles
2047 + )
2048 +
2049 + )
2050 + ),
2051 + 'internal_knowledge_base' => array(
2052 + 'id' => 'internal_knowledge_base',
2053 + 'name' => 'internal_knowledge_base',
2054 + 'type' => 'section',
2055 + 'label' => __( 'Internal Knowledge Base', 'betterdocs' ),
2056 + 'priority' => 1,
2057 + 'fields' => apply_filters( 'betterdocs_settings_content_restriction_fields', array(
2058 + 'enable_content_restriction' => array(
2059 + 'name' => 'enable_content_restriction',
2060 + 'type' => 'toggle',
2061 + 'is_pro' => true,
2062 + 'priority' => 5,
2063 + 'label' => __( 'Internal Knowledge Base', 'betterdocs' ),
2064 + 'enable_disable_text_active' => true,
2065 + 'default' => array( 'all' )
2066 + ),
2067 + 'internal_knowledge_base_type' => array(
2068 + 'name' => 'internal_knowledge_base_type',
2069 + 'type' => 'radio-card',
2070 + 'label' => __( 'Choose a Rule Type', 'betterdocs' ),
2071 + 'label_subtitle' => __( 'Choose a rule type: apply access globally (Basic), or configure detailed restrictions (Advanced) for docs, categories, and KBs.', 'betterdocs' ),
2072 + 'priority' => 6,
2073 + 'multiple' => true,
2074 + 'search' => true,
2075 + 'default' => array( 'all' ),
2076 + 'placeholder' => __( 'Select any', 'betterdocs' ),
2077 + 'options' => array(
2078 + array(
2079 + 'label' => 'Basic',
2080 + 'value' => 'basic'
2081 + ),
2082 + array(
2083 + 'label' => 'Advanced',
2084 + 'value' => 'advanced'
2085 + )
2086 + ),
2087 + 'filterValue' => 'all',
2088 + 'rules' => Rules::is( 'enable_content_restriction', true )
2089 + ),
2090 + 'content_visibility' => array(
2091 + 'name' => 'content_visibility',
2092 + 'type' => 'checkbox-select',
2093 + 'label' => __( 'Restrict Access to', 'betterdocs' ),
2094 + 'label_subtitle' => __( 'Only selected User Roles will be able to view your Knowledge Base', 'betterdocs' ),
2095 + 'is_pro' => true,
2096 + 'priority' => 7,
2097 + 'multiple' => true,
2098 + 'search' => true,
2099 + 'default' => array( 'all' ),
2100 + 'placeholder' => __( 'Select any', 'betterdocs' ),
2101 + 'options' => $roles_for_ikb,
2102 + 'rules' => Rules::logicalRule(
2103 + array(
2104 + Rules::is( 'enable_content_restriction', true ),
2105 + Rules::is( 'internal_knowledge_base_type', 'basic' )
2106 + ),
2107 + 'and'
2108 + ),
2109 + 'filterValue' => 'all'
2110 + ),
2111 + 'restrict_template' => array(
2112 + 'name' => 'restrict_template',
2113 + 'type' => 'checkbox-select',
2114 + 'label' => __( 'Restriction on Docs', 'betterdocs' ),
2115 + 'label_subtitle' => __( 'Selected Docs pages will be restricted', 'betterdocs' ),
2116 + 'is_pro' => true,
2117 + 'priority' => 8,
2118 + 'multiple' => true,
2119 + 'search' => true,
2120 + 'default' => array( 'all' ),
2121 + 'placeholder' => __( 'Select any', 'betterdocs' ),
2122 + 'options' => $this->get_texanomy(),
2123 + 'rules' => Rules::logicalRule(
2124 + array(
2125 + Rules::is( 'enable_content_restriction', true ),
2126 + Rules::is( 'internal_knowledge_base_type', 'basic' )
2127 + ),
2128 + 'and'
2129 + ),
2130 + 'filterValue' => 'all'
2131 + ),
2132 + 'restrict_category' => array(
2133 + 'name' => 'restrict_category',
2134 + 'type' => 'checkbox-select',
2135 + 'label' => __( 'Restriction on Docs Categories', 'betterdocs' ),
2136 + 'label_subtitle' => __( 'Selected Docs categories will be restricted', 'betterdocs' ),
2137 + 'is_pro' => true,
2138 + 'priority' => 9,
2139 + 'multiple' => true,
2140 + 'search' => true,
2141 + 'default' => array( 'all' ),
2142 + 'placeholder' => __( 'Select any', 'betterdocs' ),
2143 + 'options' => $this->get_terms( 'doc_category' ),
2144 + 'rules' => Rules::logicalRule(
2145 + array(
2146 + Rules::is( 'enable_content_restriction', true ),
2147 + Rules::is( 'internal_knowledge_base_type', 'basic' )
2148 + ),
2149 + 'and'
2150 + ),
2151 + 'filterValue' => 'all'
2152 + ),
2153 + 'restricted_redirect_url' => array(
2154 + 'name' => 'restricted_redirect_url',
2155 + 'type' => 'text',
2156 + 'label' => __( 'Redirect URL', 'betterdocs' ),
2157 + 'label_subtitle' => __( 'Set a custom URL to redirect users without permissions when they try to access internal knowledge base. By default, restricted content will redirect to the "404 not found" page', 'betterdocs' ),
2158 + 'default' => '',
2159 + 'placeholder' => 'https://',
2160 + 'is_pro' => true,
2161 + 'priority' => 20,
2162 + 'rules' => Rules::logicalRule(
2163 + array(
2164 + Rules::is( 'enable_content_restriction', true )
2165 + ),
2166 + 'and'
2167 + )
2168 + )
2169 + ) )
2170 + )
2171 + )
2172 + )
2173 + )
2174 + )
2175 + )
2176 + ) ),
2177 + 'tab-email-reporting' => apply_filters( 'betterdocs_settings_tab_email_reporting', array(
2178 + 'id' => 'tab-email-reporting',
2179 + 'label' => __( 'Email Reporting', 'betterdocs' ),
1594 2180 'priority' => 60,
1595 - 'fields' => [
1596 - 'title-email-reporting' => [
1597 - 'name' => 'title-email-reporting-tab',
1598 - 'type' => 'section',
1599 - 'label' => __( 'Email Reporting', 'betterdocs' ),
2181 + 'fields' => array(
2182 + 'title-email-reporting' => array(
2183 + 'name' => 'title-email-reporting-tab',
2184 + 'type' => 'section',
2185 + 'label' => __( 'Email Reporting', 'betterdocs' ),
1600 2186 'priority' => 60,
1601 - 'fields' => [
1602 - 'enable_reporting' => [
1603 - 'name' => 'enable_reporting',
1604 - 'label' => __( 'Email Reporting', 'betterdocs' ),
2187 + 'fields' => array(
2188 + 'enable_reporting' => array(
2189 + 'name' => 'enable_reporting',
2190 + 'label' => __( 'Email Reporting', 'betterdocs' ),
1605 2191 'enable_disable_text_active' => true,
1606 - 'type' => 'toggle',
1607 - 'priority' => 1,
1608 - 'default' => 0
1609 - ],
1610 - 'reporting_frequency' => apply_filters( 'betterdocs_reporting_frequency_settings', [
1611 - 'name' => 'reporting_frequency',
1612 - 'type' => 'select',
1613 - 'label' => __( 'Reporting Frequency', 'betterdocs' ),
1614 - 'default' => 'betterdocs_weekly',
2192 + 'type' => 'toggle',
2193 + 'priority' => 1,
2194 + 'default' => 0
2195 + ),
2196 + 'reporting_frequency' => apply_filters( 'betterdocs_reporting_frequency_settings', array(
2197 + 'name' => 'reporting_frequency',
2198 + 'type' => 'select',
2199 + 'label' => __( 'Reporting Frequency', 'betterdocs' ),
2200 + 'default' => 'betterdocs_weekly',
1615 2201 'priority' => 2,
1616 - 'is_pro' => true,
1617 - 'options' => $this->normalize_options( [
1618 - 'betterdocs_daily' => __( 'Once Daily', 'betterdocs' ),
1619 - 'betterdocs_weekly' => __( 'Once Weekly', 'betterdocs' ),
2202 + 'is_pro' => true,
2203 + 'options' => $this->normalize_options( array(
2204 + 'betterdocs_daily' => __( 'Once Daily', 'betterdocs' ),
2205 + 'betterdocs_weekly' => __( 'Once Weekly', 'betterdocs' ),
1620 2206 'betterdocs_monthly' => __( 'Once Monthly', 'betterdocs' )
1621 - ] ),
1622 - 'rules' => Rules::is( 'enable_reporting', true )
1623 - ] ),
1624 - 'reporting_day' => [
1625 - 'name' => 'reporting_day',
1626 - 'type' => 'select',
1627 - 'label' => __( 'Reporting Day', 'betterdocs' ),
1628 - 'default' => 'monday',
1629 - 'rules' => Rules::logicalRule( [
2207 + ) ),
2208 + 'rules' => Rules::is( 'enable_reporting', true )
2209 + ) ),
2210 + 'reporting_day' => array(
2211 + 'name' => 'reporting_day',
2212 + 'type' => 'select',
2213 + 'label' => __( 'Reporting Day', 'betterdocs' ),
2214 + 'default' => 'monday',
2215 + 'rules' => Rules::logicalRule( array(
1630 2216 Rules::is( 'enable_reporting', true ),
1631 2217 Rules::is( 'reporting_frequency', 'betterdocs_weekly' )
1632 - ], 'and' ),
1633 - 'priority' => 3,
1634 - 'options' => $this->normalize_options( [
1635 - 'sunday' => __( 'Sunday', 'betterdocs' ),
1636 - 'monday' => __( 'Monday', 'betterdocs' ),
1637 - 'tuesday' => __( 'Tuesday', 'betterdocs' ),
2218 + ), 'and' ),
2219 + 'priority' => 3,
2220 + 'options' => $this->normalize_options( array(
2221 + 'sunday' => __( 'Sunday', 'betterdocs' ),
2222 + 'monday' => __( 'Monday', 'betterdocs' ),
2223 + 'tuesday' => __( 'Tuesday', 'betterdocs' ),
1638 2224 'wednesday' => __( 'Wednesday', 'betterdocs' ),
1639 - 'thursday' => __( 'Thursday', 'betterdocs' ),
1640 - 'friday' => __( 'Friday', 'betterdocs' ),
1641 - 'saturday' => __( 'Saturday', 'betterdocs' )
1642 - ] ),
2225 + 'thursday' => __( 'Thursday', 'betterdocs' ),
2226 + 'friday' => __( 'Friday', 'betterdocs' ),
2227 + 'saturday' => __( 'Saturday', 'betterdocs' )
2228 + ) ),
1643 2229 'label_subtitle' => __( 'This is only applicable for the “Weekly” report', 'betterdocs' )
1644 - ],
1645 - 'select_reporting_data' => apply_filters( 'betterdocs_select_reporting_data_settings', [
1646 - 'name' => 'select_reporting_data',
1647 - 'type' => 'checkbox-select',
1648 - 'label' => __( 'Select Reporting Data', 'betterdocs' ),
2230 + ),
2231 + 'select_reporting_data' => apply_filters( 'betterdocs_select_reporting_data_settings', array(
2232 + 'name' => 'select_reporting_data',
2233 + 'type' => 'checkbox-select',
2234 + 'label' => __( 'Select Reporting Data', 'betterdocs' ),
1649 2235 'priority' => 4,
1650 2236 'multiple' => true,
1651 - 'options' => $this->normalize_options( [
1652 - 'overview' => 'Overview',
1653 - 'top-docs' => 'Top Docs',
2237 + 'options' => $this->normalize_options( array(
2238 + 'overview' => 'Overview',
2239 + 'top-docs' => 'Top Docs',
1654 2240 'most-search' => 'Most Searched Keywords'
1655 - ] ),
1656 - 'default' => ['overview', 'top-docs', 'most-search'],
1657 - 'is_pro' => true,
1658 - 'rules' => Rules::is( 'enable_reporting', true )
1659 - ] ),
1660 - 'reporting_email' => [
1661 - 'name' => 'reporting_email',
1662 - 'type' => 'text',
1663 - 'label' => __( 'Reporting Email', 'betterdocs' ),
1664 - 'default' => get_option( 'admin_email' ),
2241 + ) ),
2242 + 'default' => array( 'overview', 'top-docs', 'most-search' ),
2243 + 'is_pro' => true,
2244 + 'rules' => Rules::is( 'enable_reporting', true )
2245 + ) ),
2246 + 'reporting_email' => array(
2247 + 'name' => 'reporting_email',
2248 + 'type' => 'text',
2249 + 'label' => __( 'Reporting Email', 'betterdocs' ),
2250 + 'default' => get_option( 'admin_email' ),
1665 2251 'priority' => 5,
1666 - 'rules' => Rules::is( 'enable_reporting', true )
1667 - ],
1668 - 'reporting_subject' => apply_filters( 'betterdocs_reporting_subject_settings', [
1669 - 'name' => 'reporting_subject',
1670 - 'type' => 'textarea',
1671 - 'label' => __( 'Reporting Email Subject', 'betterdocs' ),
1672 - 'default' => wp_sprintf( __( 'Your Documentation Performance of %s Website', 'betterdocs' ), get_bloginfo( 'name' ) ),
2252 + 'rules' => Rules::is( 'enable_reporting', true )
2253 + ),
2254 + 'reporting_subject' => apply_filters( 'betterdocs_reporting_subject_settings', array(
2255 + 'name' => 'reporting_subject',
2256 + 'type' => 'textarea',
2257 + 'label' => __( 'Reporting Email Subject', 'betterdocs' ),
2258 + 'default' => wp_sprintf( // Translators: %s is replaced with the website name.
2259 + __( 'Your Documentation Performance of %s Website', 'betterdocs' ), get_bloginfo( 'name' ) ),
1673 2260 'priority' => 6,
1674 - 'is_pro' => true,
1675 - 'rules' => Rules::is( 'enable_reporting', true )
1676 - ] ),
1677 - 'test_report' => [
1678 - 'name' => 'test_report',
1679 - 'label' => __( 'Reporting Test', 'betterdocs' ),
1680 - 'text' => __( 'Test Report', 'betterdocs' ),
1681 - 'type' => 'button',
2261 + 'is_pro' => true,
2262 + 'rules' => Rules::is( 'enable_reporting', true )
2263 + ) ),
2264 + 'test_report' => array(
2265 + 'name' => 'test_report',
2266 + 'label' => __( 'Reporting Test', 'betterdocs' ),
2267 + 'text' => __( 'Test Report', 'betterdocs' ),
2268 + 'type' => 'button',
1682 2269 'priority' => 7,
1683 - 'rules' => Rules::is( 'enable_reporting', true ),
1684 - 'ajax' => [
1685 - 'on' => 'click',
1686 - 'api' => '/betterdocs/v1/reporting-test',
1687 - 'data' => [
1688 - 'enable_reporting' => '@enable_reporting',
2270 + 'rules' => Rules::is( 'enable_reporting', true ),
2271 + 'ajax' => array(
2272 + 'on' => 'click',
2273 + 'api' => '/betterdocs/v1/reporting-test',
2274 + 'data' => array(
2275 + 'enable_reporting' => '@enable_reporting',
1689 2276 'select_reporting_data' => '@select_reporting_data',
1690 - 'reporting_subject' => '@reporting_subject',
1691 - 'reporting_email' => '@reporting_email',
1692 - 'reporting_day' => '@reporting_day',
1693 - 'reporting_frequency' => '@reporting_frequency'
1694 - ],
1695 - 'swal' => [
1696 - 'text' => __( 'Successfully Sent a Test Report in Your Email.', 'betterdocs' ),
1697 - 'icon' => 'success',
2277 + 'reporting_subject' => '@reporting_subject',
2278 + 'reporting_email' => '@reporting_email',
2279 + 'reporting_day' => '@reporting_day',
2280 + 'reporting_frequency' => '@reporting_frequency'
2281 + ),
2282 + 'swal' => array(
2283 + 'text' => __( 'Successfully Sent a Test Report in Your Email.', 'betterdocs' ),
2284 + 'icon' => 'success',
1698 2285 'autoClose' => 2000
1699 - ]
1700 - ]
1701 - ]
1702 - ]
1703 - ]
1704 - ]
1705 - ] ),
1706 - 'tab-instant-answer' => apply_filters( 'betterdocs_settings_tab_instant_answer', [
1707 - 'id' => 'tab-instant-answer',
1708 - 'name' => 'tab-instant-answer',
1709 - 'type' => 'section',
1710 - 'label' => __( 'Instant Answer', 'betterdocs' ),
1711 - 'save' => false,
2286 + )
2287 + )
2288 + )
2289 + )
2290 + )
2291 + )
2292 + ) ),
2293 + 'tab-git-sync' => apply_filters( 'betterdocs_settings_tab_github_integration', array(
2294 + 'id' => 'tab-git-sync',
2295 + 'label' => __( 'Git Sync', 'betterdocs' ),
2296 + 'priority' => 60,
2297 + 'fields' => array(
2298 + 'title-git-sync' => array(
2299 + 'name' => 'title-git-sync-tab',
2300 + 'type' => 'section',
2301 + 'label' => __( 'Git Sync Settings', 'betterdocs' ),
2302 + 'priority' => 60,
2303 + 'fields' => array(
2304 + 'enable_git_integration' => array(
2305 + 'name' => 'enable_git_integration',
2306 + 'type' => 'toggle',
2307 + 'label' => __( 'Enable Git Sync', 'betterdocs' ),
2308 + 'enable_disable_text_active' => true,
2309 + 'default' => false,
2310 + 'priority' => 1,
2311 + 'is_pro' => true,
2312 + 'label_subtitle' => __( 'Enable bidirectional synchronization between BetterDocs and Git repositories', 'betterdocs' )
2313 + )
2314 + )
2315 + )
2316 + )
2317 + ) ),
2318 + 'tab-instant-answer' => apply_filters( 'betterdocs_settings_tab_instant_answer', array(
2319 + 'id' => 'tab-instant-answer',
2320 + 'name' => 'tab-instant-answer',
2321 + 'type' => 'section',
2322 + 'label' => __( 'Instant Answer', 'betterdocs' ),
2323 + 'save' => false,
1712 2324 'priority' => 70,
1713 - 'fields' => [
1714 - 'title-instant-answer' => [
1715 - 'name' => 'title-instant-answer-tab',
1716 - 'type' => 'section',
1717 - 'label' => __( 'Instant Answer', 'betterdocs' ),
1718 - 'priority' => 80,
1719 - 'save' => false,
2325 + 'fields' => array(
2326 + 'title-instant-answer' => array(
2327 + 'name' => 'title-instant-answer-tab',
2328 + 'type' => 'section',
2329 + 'label' => __( 'Instant Answer', 'betterdocs' ),
2330 + 'priority' => 80,
2331 + 'save' => false,
1720 2332 'showSubmit' => false,
1721 - 'fields' => apply_filters( 'betterdocs_instant_answer_fields', [
1722 - 'enable_disable_wrapper' => [
1723 - 'name' => 'enable_disable_wrapper',
1724 - 'type' => 'section',
2333 + 'fields' => apply_filters( 'betterdocs_instant_answer_fields', array(
2334 + 'enable_disable_wrapper' => array(
2335 + 'name' => 'enable_disable_wrapper',
2336 + 'type' => 'section',
1725 2337 'priority' => 0,
1726 - 'save' => false,
1727 - 'fields' => [
1728 - 'enable_disable' => [
1729 - 'name' => 'enable_disable',
1730 - 'type' => 'toggle',
1731 - 'priority' => 100,
1732 - 'description' => __( 'Enable Instant Answer', 'betterdocs' ),
2338 + 'save' => false,
2339 + 'fields' => array(
2340 + 'enable_disable' => array(
2341 + 'name' => 'enable_disable',
2342 + 'type' => 'toggle',
2343 + 'priority' => 100,
2344 + 'description' => __( 'Enable Instant Answer', 'betterdocs' ),
1733 2345 'enable_disable_text_active' => false,
1734 - 'default' => true,
1735 - 'is_pro' => true
1736 - ]
1737 - ]
1738 - ]
1739 - ] )
1740 - ]
1741 - ]
1742 - ] ),
1743 - 'tab-ai-autowrite' => [
1744 - 'id' => 'tab-ai-autowrite',
1745 - 'name' => 'tab-ai-autowrite',
1746 - 'type' => 'section',
1747 - 'label' => __( 'Write with AI', 'betterdocs' ),
2346 + 'default' => false,
2347 + 'is_pro' => true
2348 + )
2349 + )
2350 + )
2351 + ) )
2352 + )
2353 + )
2354 + ) ),
2355 + 'tab-betterdocs-ai' => array(
2356 + 'id' => 'tab-betterdocs-ai',
2357 + 'name' => 'tab-betterdocs-ai',
2358 + 'type' => 'section',
2359 + 'label' => __( 'AI Content Suite', 'betterdocs' ),
2360 + 'priority' => 74,
2361 + 'fields' => array(
2362 + 'sections-betterdocs-ai' => array(
2363 + 'name' => 'sections-betterdocs-ai',
2364 + 'type' => 'section',
2365 + 'label' => __( 'AI Content Suite', 'betterdocs' ),
2366 + 'priority' => 10,
2367 + 'fields' => array(
2368 + 'all-betterdocs-ai' => array(
2369 + 'id' => 'all-tab-betterdocs-ai',
2370 + 'name' => 'all-tab-betterdocs-ai',
2371 + 'label' => __( 'AI Content Suite Settings', 'betterdocs' ),
2372 + 'classes' => 'tab-layout',
2373 + 'type' => 'tab',
2374 + 'active' => 'open-ai-settings',
2375 + 'completionTrack' => true,
2376 + 'sidebar' => false,
2377 + 'save' => false,
2378 + 'title' => false,
2379 + 'config' => array(
2380 + 'active' => 'open-ai-settings',
2381 + 'sidebar' => false,
2382 + 'title' => false
2383 + ),
2384 + 'submit' => array(
2385 + 'show' => false
2386 + ),
2387 + 'step' => array(
2388 + 'show' => false
2389 + ),
2390 + 'priority' => 20,
2391 + 'fields' => apply_filters(
2392 + 'betterdocs_migration_tab_sections',
2393 + array(
2394 + 'open-ai-settings' => array(
2395 + 'id' => 'open-ai-settings',
2396 + 'name' => 'open-ai-settings',
2397 + 'type' => 'section',
2398 + 'label' => __( 'AI Platform & API', 'betterdocs' ),
2399 + 'priority' => 1,
2400 + 'fields' => array(
2401 + 'ai_platform' => array(
2402 + 'name' => 'ai_platform',
2403 + 'type' => 'select',
2404 + 'label' => __( 'AI Platform', 'betterdocs' ),
2405 + 'label_subtitle' => __( 'Choose which AI platform powers Write with AI, AI Edit, the Doc Summarizer and Quality Score. The model list and API key field below adapt to your choice.', 'betterdocs' ),
2406 + 'priority' => 1,
2407 + 'multiple' => false,
2408 + 'default' => 'openai',
2409 + // DeepSeek and OpenRouter are temporarily hidden from the
2410 + // dropdown. Filter the options here, NOT ModelRegistry::platforms() —
2411 + // sensitive_api_key_fields() loops the registry to mask each
2412 + // platform's key field, so trimming the registry would silently
2413 + // un-mask those keys. Re-enable later by dropping the array_diff_key.
2414 + 'options' => GlobalFields::normalize_fields(
2415 + array_diff_key( ModelRegistry::platforms(), array_flip( array( 'deepseek', 'openrouter' ) ) )
2416 + )
2417 + ),
2418 + // OpenAI's key field keeps its original name so installs
2419 + // that already saved a Write with AI key keep it.
2420 + 'ai_autowrite_api_key' => array(
2421 + 'name' => 'ai_autowrite_api_key',
2422 + 'type' => 'text',
2423 + 'label' => __( 'OpenAI API Key', 'betterdocs' ),
2424 + 'label_subtitle' => sprintf( /* translators: %s: documentation URL */ __( 'Check out this <a target="_blank" href="%s">documentation</a> to generate your OpenAI API key.', 'betterdocs' ), esc_url( 'https://betterdocs.co/docs/write-with-ai/' ) ),
2425 + 'default' => '',
2426 + 'priority' => 2,
2427 + 'rules' => Rules::is( 'ai_platform', 'openai' )
2428 + ),
2429 + 'ai_api_key_gemini' => array(
2430 + 'name' => 'ai_api_key_gemini',
2431 + 'type' => 'text',
2432 + 'label' => __( 'Google Gemini API Key', 'betterdocs' ),
2433 + 'label_subtitle' => sprintf( /* translators: %s: Google AI Studio URL */ __( 'Generate a key from <a target="_blank" href="%s">Google AI Studio</a>.', 'betterdocs' ), esc_url( 'https://aistudio.google.com/app/apikey' ) ),
2434 + 'default' => '',
2435 + 'priority' => 2,
2436 + 'rules' => Rules::is( 'ai_platform', 'gemini' )
2437 + ),
2438 + 'ai_api_key_claude' => array(
2439 + 'name' => 'ai_api_key_claude',
2440 + 'type' => 'text',
2441 + 'label' => __( 'Anthropic Claude API Key', 'betterdocs' ),
2442 + 'label_subtitle' => sprintf( /* translators: %s: Anthropic Console URL */ __( 'Generate a key from the <a target="_blank" href="%s">Anthropic Console</a>.', 'betterdocs' ), esc_url( 'https://console.anthropic.com/settings/keys' ) ),
2443 + 'default' => '',
2444 + 'priority' => 2,
2445 + 'rules' => Rules::is( 'ai_platform', 'claude' )
2446 + ),
2447 + 'ai_api_key_deepseek' => array(
2448 + 'name' => 'ai_api_key_deepseek',
2449 + 'type' => 'text',
2450 + 'label' => __( 'DeepSeek API Key', 'betterdocs' ),
2451 + 'label_subtitle' => sprintf( /* translators: %s: DeepSeek platform URL */ __( 'Generate a key from the <a target="_blank" href="%s">DeepSeek platform</a>.', 'betterdocs' ), esc_url( 'https://platform.deepseek.com/api_keys' ) ),
2452 + 'default' => '',
2453 + 'priority' => 2,
2454 + 'rules' => Rules::is( 'ai_platform', 'deepseek' )
2455 + ),
2456 + 'ai_api_key_openrouter' => array(
2457 + 'name' => 'ai_api_key_openrouter',
2458 + 'type' => 'text',
2459 + 'label' => __( 'OpenRouter API Key', 'betterdocs' ),
2460 + 'label_subtitle' => sprintf( /* translators: %s: OpenRouter keys URL */ __( 'Generate a key from <a target="_blank" href="%s">OpenRouter</a>.', 'betterdocs' ), esc_url( 'https://openrouter.ai/keys' ) ),
2461 + 'default' => '',
2462 + 'priority' => 2,
2463 + 'rules' => Rules::is( 'ai_platform', 'openrouter' )
2464 + ),
2465 + 'ai_model' => array(
2466 + 'name' => 'ai_model',
2467 + 'type' => 'platform_model_select',
2468 + 'label' => __( 'Model', 'betterdocs' ),
2469 + 'label_subtitle' => __( 'Available models depend on the selected platform.', 'betterdocs' ),
2470 + 'priority' => 10,
2471 + 'default' => 'gpt-4o-mini',
2472 + 'catalogue' => ModelRegistry::catalogue(),
2473 + 'defaults' => ModelRegistry::defaults()
2474 + )
2475 + )
2476 + ),
2477 + 'write-with-ai' => array(
2478 + 'id' => 'write-with-ai',
2479 + 'name' => 'write-with-ai',
2480 + 'type' => 'section',
2481 + 'label' => __( 'Write with AI', 'betterdocs' ),
2482 + 'priority' => 5,
2483 + 'fields' => array(
2484 + 'write-with-ai-subtabs' => array(
2485 + 'id' => 'write-with-ai-subtabs',
2486 + 'name' => 'write_with_ai_subtabs',
2487 + 'label' => __( 'Write with AI', 'betterdocs' ),
2488 + 'classes' => 'tab-nested-layout',
2489 + 'type' => 'tab',
2490 + 'active' => 'wwa-configuration',
2491 + 'completionTrack' => true,
2492 + 'sidebar' => false,
2493 + 'save' => false,
2494 + 'title' => false,
2495 + 'config' => array(
2496 + 'active' => 'wwa-configuration',
2497 + 'sidebar' => false,
2498 + 'title' => false
2499 + ),
2500 + 'submit' => array(
2501 + 'show' => false
2502 + ),
2503 + 'step' => array(
2504 + 'show' => false
2505 + ),
2506 + 'priority' => 5,
2507 + 'fields' => array(
2508 + 'wwa-configuration' => array(
2509 + 'id' => 'wwa-configuration',
2510 + 'name' => 'wwa-configuration',
2511 + 'type' => 'section',
2512 + 'label' => __( 'Configuration', 'betterdocs' ),
2513 + 'priority' => 1,
2514 + 'fields' => array(
2515 + 'enable_write_with_ai' => array(
2516 + 'name' => 'enable_write_with_ai',
2517 + 'type' => 'toggle',
2518 + 'priority' => 0,
2519 + 'label' => __( 'Write Docs with AI', 'betterdocs' ),
2520 + 'label_subtitle' => __( 'Generate AI based Documentation in your Gutenberg Editor', 'betterdocs' ),
2521 + 'enable_disable_text_active' => true,
2522 + 'default' => true
2523 + ),
2524 + 'enable_faq_write_with_ai' => array(
2525 + 'name' => 'enable_faq_write_with_ai',
2526 + 'type' => 'toggle',
2527 + 'priority' => 5,
2528 + 'label' => __( 'Write FAQ with AI', 'betterdocs' ),
2529 + 'label_subtitle' => __( 'Generate AI based FAQ in your Editor', 'betterdocs' ),
2530 + 'enable_disable_text_active' => true,
2531 + 'default' => true
2532 + ),
2533 + 'enable_glossaries_write_with_ai' => array(
2534 + 'name' => 'enable_glossaries_write_with_ai',
2535 + 'type' => 'toggle',
2536 + 'priority' => 6,
2537 + 'label' => __( 'Write Glossaries with AI', 'betterdocs' ),
2538 + 'label_subtitle' => __( 'Generate AI based Glossary definitions from the Glossaries admin page', 'betterdocs' ),
2539 + 'enable_disable_text_active' => true,
2540 + 'default' => true,
2541 + 'is_pro' => true
2542 + ),
2543 + 'enable_docs_ai_suite' => array(
2544 + 'name' => 'enable_docs_ai_suite',
2545 + 'type' => 'toggle',
2546 + 'priority' => 7,
2547 + 'label' => __( 'Enhance Docs with AI', 'betterdocs' ),
2548 + 'label_subtitle' => __( 'Add BetterDocs AI actions for suggesting categories, tags and excerpts inside the native Docs editor panels.', 'betterdocs' ),
2549 + 'enable_disable_text_active' => true,
2550 + 'default' => true
2551 + ),
2552 + 'ai_autowrite_max_token' => array(
2553 + 'name' => 'ai_autowrite_max_token',
2554 + 'type' => 'min_token_number',
2555 + 'label' => __( 'Set Max Tokens', 'betterdocs' ),
2556 + 'label_subtitle' => sprintf( // translators: %s is a link to more information about token limits.
2557 + __( 'Documentation will be generated based on the Token Limits you have set. For more information on Token Limits, you can check out this <a target="_blank" href="%s">link</a>.', 'betterdocs' ), esc_url( 'https://platform.openai.com/account/limits' ) ),
2558 + 'default' => 2500,
2559 + 'priority' => 10,
2560 + 'model_field' => 'ai_model',
2561 + 'context' => 'write_with_ai',
2562 + 'min_token_map' => AIHelper::get_min_tokens_map( 'write_with_ai' ),
2563 + 'classes' => 'wprf-type-text'
2564 + )
2565 + )
2566 + ),
2567 + 'wwa-personalize' => array(
2568 + 'id' => 'wwa-personalize',
2569 + 'name' => 'wwa-personalize',
2570 + 'type' => 'section',
2571 + 'label' => __( 'Write AI Personalize', 'betterdocs' ),
2572 + 'priority' => 5,
2573 + 'fields' => array(
2574 + 'write_with_ai_instructions' => array(
2575 + 'name' => 'write_with_ai_instructions',
2576 + 'type' => 'wwa_instructions',
2577 + 'label' => __( 'Instructions', 'betterdocs' ),
2578 + 'label_subtitle' => __( 'Add reusable instruction sets to steer how BetterDocs AI writes. The "Default/Core" set is always applied; extra sets can be picked in the Write with AI popup.', 'betterdocs' ),
2579 + 'priority' => 1,
2580 + 'default' => array(
2581 + array(
2582 + 'id' => 'default',
2583 + 'title' => __( 'Default/Core', 'betterdocs' ),
2584 + 'content' => WriteWithAI::default_instruction_content()
2585 + )
2586 + )
2587 + )
2588 + )
2589 + ),
2590 + 'edit-ai-personalize' => array(
2591 + 'id' => 'edit-ai-personalize',
2592 + 'name' => 'edit-ai-personalize',
2593 + 'type' => 'section',
2594 + 'label' => __( 'Edit AI Personalize', 'betterdocs' ),
2595 + 'priority' => 7,
2596 + 'fields' => array(
2597 + 'ai_edit_actions' => array(
2598 + 'name' => 'ai_edit_actions',
2599 + 'type' => 'ai_edit_actions',
2600 + 'label' => __( 'Actions', 'betterdocs' ),
2601 + 'label_subtitle' => __( 'Choose which Edit with AI actions appear in the editor. Toggle actions on or off, edit each action\'s instruction, or add your own custom actions. All predefined actions are enabled by default.', 'betterdocs' ),
2602 + 'priority' => 1,
2603 + 'default' => AIEdit::default_actions()
2604 + )
2605 + )
2606 + )
2607 + )
2608 + )
2609 + )
2610 + ),
2611 + 'article-summary' => array(
2612 + 'id' => 'article-summary',
2613 + 'name' => 'article-summary',
2614 + 'type' => 'section',
2615 + 'label' => __( 'AI Doc Summarizer', 'betterdocs' ),
2616 + 'priority' => 10,
2617 + 'fields' => array(
2618 + 'enable_article_summary' => array(
2619 + 'name' => 'enable_article_summary',
2620 + 'type' => 'toggle',
2621 + 'priority' => 1,
2622 + 'label' => __( 'AI Powered Doc Summarizer', 'betterdocs' ),
2623 + 'label_subtitle' => __( 'Enable AI-powered article summaries on single doc pages. Requires OpenAI API key.', 'betterdocs' ),
2624 + 'enable_disable_text_active' => true,
2625 + 'default' => false
2626 + ),
2627 + 'article_summary_max_token' => array(
2628 + 'name' => 'article_summary_max_token',
2629 + 'type' => 'min_token_number',
2630 + 'label' => __( 'Set Max Tokens', 'betterdocs' ),
2631 + 'label_subtitle' => sprintf( // translators: %s is a link to more information about token limits.
2632 + __( 'Single Doc summarizer will be generated based on the token limits you have set. For more information on Token Limits, you can check out this <a target="_blank" href="%s">link</a>.', 'betterdocs' ), esc_url( 'https://platform.openai.com/account/limits' ) ),
2633 + 'default' => 1500,
2634 + 'priority' => 5,
2635 + 'model_field' => 'ai_model',
2636 + 'context' => 'article_summary',
2637 + 'min_token_map' => AIHelper::get_min_tokens_map( 'article_summary' ),
2638 + 'classes' => 'wprf-type-text'
2639 + )
2640 + )
2641 + )
2642 + )
2643 + )
2644 + )
2645 + )
2646 + )
2647 + )
2648 + ),
2649 + 'tab-ai-chatbot' => apply_filters( 'betterdocs_settings_tab_ai_chatbot', array(
2650 + 'id' => 'tab-ai-chatbot',
2651 + 'name' => 'tab-ai-chatbot',
2652 + 'type' => 'section',
2653 + 'label' => __( 'AI Chatbot', 'betterdocs' ),
2654 + 'submit' => array(
2655 + 'show' => false
2656 + ),
2657 + 'save' => false,
1748 2658 'priority' => 75,
1749 - 'fields' => [
1750 - 'title-ai-autowrite' => apply_filters( 'betterdocs_settings_ai_autowrite_fields', [
1751 - 'name' => 'title-ai-autowrite-tab',
1752 - 'type' => 'section',
1753 - 'label' => __( 'Write with AI', 'betterdocs' ),
1754 - 'priority' => 60,
1755 - 'fields' => [
1756 - 'enable_write_with_ai' => [
1757 - 'name' => 'enable_write_with_ai',
1758 - 'type' => 'toggle',
1759 - 'priority' => 0,
1760 - 'label' => __( 'Write Docs with AI', 'betterdocs' ),
1761 - 'label_subtitle' => __( 'Generate AI based Documentation in your Gutenberg Editor', 'betterdocs' ),
1762 - 'enable_disable_text_active' => true,
1763 - 'default' => true
1764 - ],
1765 - 'enable_faq_write_with_ai' => [
1766 - 'name' => 'enable_faq_write_with_ai',
1767 - 'type' => 'toggle',
1768 - 'priority' => 5,
1769 - 'label' => __( 'Write FAQ with AI', 'betterdocs' ),
1770 - 'label_subtitle' => __( 'Generate AI based FAQ in your Editor', 'betterdocs' ),
1771 - 'enable_disable_text_active' => true,
1772 - 'default' => true
1773 - ],
1774 - 'ai_autowrite_api_key' => [
1775 - 'name' => 'ai_autowrite_api_key',
1776 - 'type' => 'text',
1777 - 'label' => __( 'API Key', 'betterdocs' ),
1778 - 'label_subtitle' => __( 'Check out this <a target="_blank" href="' . esc_url( 'https://betterdocs.co/docs/write-with-ai/' ) . '">documentation</a> to find out to generate your OpenAI API Key', 'betterdocs' ),
1779 - 'default' => '',
1780 - 'priority' => 10
1781 - ],
1782 - 'ai_autowrite_max_token' => [
1783 - 'name' => 'ai_autowrite_max_token',
1784 - 'type' => 'number',
1785 - 'label' => __( 'Set Max Tokens', 'betterdocs' ),
1786 - 'label_subtitle' => __( 'Documentation will be generated based on the Token Limits you have set. For more information on Token Limits, you can check out this <a target="_blank" href="' . esc_url( 'https://platform.openai.com/account/limits' ) . '">link</a>.', 'betterdocs' ),
1787 - 'default' => 1500,
1788 - 'priority' => 15
1789 - ]
1790 - ]
1791 - ] )
1792 - ]
1793 - ]
1794 - ] )
1795 - ];
2659 + 'fields' => array(
2660 + 'title-ai-chatbot-tab' => array(
2661 + 'name' => 'title-ai-chatbot-tab',
2662 + 'type' => 'section',
2663 + 'label' => __( 'AI Chatbot', 'betterdocs' ),
2664 + 'priority' => 80,
2665 + 'submit' => array(
2666 + 'show' => false
2667 + ),
2668 + 'save' => false,
2669 + 'fields' => apply_filters( 'betterdocs_ai_chatbot_fields', array(
2670 + 'ai_chatbot_fields' => array(
2671 + 'name' => 'ai_chatbot_fields',
2672 + 'type' => 'section',
2673 + 'priority' => 0,
2674 + 'fields' => array(
2675 + 'enable_ai_chatbot' => array(
2676 + 'name' => 'enable_ai_chatbot',
2677 + 'label' => __( 'AI Chatbot', 'betterdocs' ),
2678 + 'description' => __( 'Enable AI Chatbot', 'betterdocs' ),
2679 + 'type' => 'toggle',
2680 + 'priority' => 5,
2681 + 'default' => 0,
2682 + 'is_pro' => true,
2683 + 'is_license_active' => false,
2684 + 'disabled' => ! betterdocs()->is_pro_active() || ! defined( 'BETTERDOCS_CHATBOT_FILE' )
2685 + ),
2686 + 'instant_answer_warning' => array(
2687 + 'name' => 'instant_answer_warning',
2688 + 'type' => 'html',
2689 + 'priority' => 6,
2690 + 'html' => sprintf(
2691 + '<div class="betterdocs-ia-warning" style="margin:8px 0 0;padding:12px 16px;background:#fffaeb;border-left:4px solid #fdb022;border-radius:4px;display:flex;align-items:flex-start;gap:10px;"><span style="font-size:18px;line-height:1;flex-shrink:0;color:#b54708;">&#9888;</span><div style="font-size:13px;color:#202223;line-height:1.5;">%1$s<br><a href="?page=betterdocs-settings&amp;tab=tab-instant-answer" style="display:inline-block;margin-top:6px;color:#5a6bff;text-decoration:none;font-weight:500;">%2$s &rarr;</a></div></div>',
2692 + esc_html__( 'Instant Answer is currently disabled. The AI Chatbot won\'t appear on your site until Instant Answer is enabled.', 'betterdocs' ),
2693 + esc_html__( 'Enable Instant Answer', 'betterdocs' )
2694 + ),
2695 + 'rules' => Rules::logicalRule( array(
2696 + Rules::is( 'enable_ai_chatbot', true ),
2697 + Rules::is( 'enable_disable', false ),
2698 + ), 'and' ),
2699 + )
2700 + )
2701 + )
2702 + ) )
2703 + )
2704 + )
2705 + ) )
2706 + ) ),
2707 + 'TAB_AI_CHATBOT' => get_option( 'enable_ai_chatbot' ),
2708 + 'CHATBOT_LICENSE' => get_option( 'betterdocs_chatbot_software__license_status' ),
2709 + 'PRO_ACTIVE' => is_plugin_active( 'betterdocs-pro/betterdocs-pro.php' ),
2710 + 'PRO_LICENSE' => get_option( 'betterdocs_pro_software__license_status' )
2711 + );
1796 2712
2713 + $settings = array_merge( $settings, $this->chatbot_active_localize() );
2714 +
1797 2715 return apply_filters( 'betterdocs_settings_args', $settings );
1798 2716 }
1799 2717
2718 + /**
2719 + * @return array
2720 + */
2721 + public function chatbot_active_localize() {
2722 + $chatbot_active = is_plugin_active( 'betterdocs-ai-chatbot/betterdocs-ai-chatbot.php' );
2723 + $chatbot_license_valid = get_option( 'betterdocs_chatbot_software__license_status' ) === 'valid';
2724 + $chatbot_enabled = $this->get( 'enable_ai_chatbot', false );
2725 +
2726 + // AI Search Suggestions are enabled if all conditions are met
2727 + $ai_search_suggestions_enabled = betterdocs()->helper->is_ai_chatbot_enabled();
2728 +
2729 + return array(
2730 + 'CHATBOT_ACTIVE' => $chatbot_active,
2731 + 'CHATBOT_LICENSE_VALID' => $chatbot_license_valid,
2732 + 'CHATBOT_ENABLED' => $chatbot_enabled,
2733 + 'AI_SEARCH_SUGGESTIONS_ENABLED' => $ai_search_suggestions_enabled
2734 + );
2735 + }
2736 +
2737 + /**
2738 + * Call This Function As Helper, When Pro Is Deactivated, To Be Used As Settings Default Values, When Betterdocs Pro Is Deactivated
2739 + *
2740 + * @return array
2741 + */
2742 + public function pro_settings_default_values() {
2743 + return array(
2744 + 'multiple_kb' => false,
2745 + 'enable_glossaries' => false,
2746 + 'enable_encyclopedia' => false,
2747 + 'analytics_from' => false,
2748 + 'unique_visitor_count' => false,
2749 + 'exclude_bot_analytics' => false,
2750 + 'show_attachment' => false,
2751 + 'show_related_docs' => false,
2752 + 'advance_search' => false,
2753 + 'child_category_exclude' => false,
2754 + 'kb_based_search' => false,
2755 + 'enable_disable' => false,
2756 + 'enable_content_restriction' => false
2757 + );
2758 + }
2759 +
1800 2760 public function import_export_settings( $settings ) {
1801 2761 if ( ! current_user_can( 'import' ) ) {
1802 2762 return $settings;
1803 2763 }
1804 2764
1805 - $settings['tab-import-export'] = apply_filters( 'betterdocs_settings_tab_import_export', [
1806 - 'id' => 'tab-import-export',
1807 - 'name' => 'tab-import-export',
1808 - 'classes' => 'tab-import-export',
1809 - 'label' => __( 'Import / Export', 'betterdocs' ),
2765 + $settings[ 'tab-import-export' ] = apply_filters( 'betterdocs_settings_tab_import_export', array(
2766 + 'id' => 'tab-import-export',
2767 + 'name' => 'tab-import-export',
2768 + 'classes' => 'tab-import-export',
2769 + 'label' => __( 'Import / Export', 'betterdocs' ),
1810 2770 'priority' => 80,
1811 - 'fields' => [
1812 - 'sections-import-export' => [
1813 - 'name' => 'sections-import-export',
1814 - 'type' => 'section',
1815 - 'label' => __( 'Import / Export', 'betterdocs' ),
2771 + 'fields' => array(
2772 + 'sections-import-export' => array(
2773 + 'name' => 'sections-import-export',
2774 + 'type' => 'section',
2775 + 'label' => __( 'Import / Export', 'betterdocs' ),
1816 2776 'priority' => 30,
1817 - 'fields' => [
1818 - 'all-tab-import-export' => [
1819 - 'id' => 'all-tab-import-export',
1820 - 'name' => 'all-tab-import-export',
1821 - 'label' => __( 'Import Export Settings', 'betterdocs' ),
1822 - 'classes' => 'tab-layout',
1823 - 'type' => "tab",
1824 - 'active' => "import",
2777 + 'fields' => array(
2778 + 'all-tab-import-export' => array(
2779 + 'id' => 'all-tab-import-export',
2780 + 'name' => 'all-tab-import-export',
2781 + 'label' => __( 'Import Export Settings', 'betterdocs' ),
2782 + 'classes' => 'tab-layout',
2783 + 'type' => 'tab',
2784 + 'active' => 'import',
1825 2785 'completionTrack' => true,
1826 - 'sidebar' => false,
1827 - 'save' => false,
1828 - 'title' => false,
1829 - 'config' => [
1830 - 'active' => 'import',
2786 + 'sidebar' => false,
2787 + 'save' => false,
2788 + 'title' => false,
2789 + 'config' => array(
2790 + 'active' => 'import',
1831 2791 'sidebar' => false,
1832 - 'title' => false
1833 - ],
1834 - 'submit' => [
2792 + 'title' => false
2793 + ),
2794 + 'submit' => array(
1835 2795 'show' => false
1836 - ],
1837 - 'step' => [
2796 + ),
2797 + 'step' => array(
1838 2798 'show' => false
1839 - ],
1840 - 'priority' => 20,
1841 - 'fields' => [
1842 - 'import' => [
1843 - 'id' => 'import',
1844 - 'name' => 'import',
1845 - 'type' => 'section',
1846 - 'label' => __( 'Import', 'betterdocs' ),
2799 + ),
2800 + 'priority' => 20,
2801 + 'fields' => array(
2802 + 'import' => array(
2803 + 'id' => 'import',
2804 + 'name' => 'import',
2805 + 'type' => 'section',
2806 + 'label' => __( 'Import', 'betterdocs' ),
1847 2807 'priority' => 1,
1848 - 'fields' => [
1849 - 'import_tab_nested' => [
1850 - 'id' => 'import_tab_nested',
1851 - 'name' => 'import_tab_nested',
1852 - 'label' => __( 'Import', 'betterdocs' ),
1853 - 'classes' => 'tab-nested-layout',
1854 - 'type' => "tab",
1855 - 'active' => "import_docs_nested",
2808 + 'fields' => array(
2809 + 'import_tab_nested' => array(
2810 + 'id' => 'import_tab_nested',
2811 + 'name' => 'import_tab_nested',
2812 + 'label' => __( 'Import', 'betterdocs' ),
2813 + 'classes' => 'tab-nested-layout',
2814 + 'type' => 'tab',
2815 + 'active' => 'import_docs_nested',
1856 2816 'completionTrack' => true,
1857 - 'sidebar' => false,
1858 - 'save' => false,
1859 - 'title' => false,
1860 - 'config' => [
1861 - 'active' => 'import_docs_nested',
2817 + 'sidebar' => false,
2818 + 'save' => false,
2819 + 'title' => false,
2820 + 'config' => array(
2821 + 'active' => 'import_docs_nested',
1862 2822 'sidebar' => false,
1863 - 'title' => false
1864 - ],
1865 - 'submit' => [
2823 + 'title' => false
2824 + ),
2825 + 'submit' => array(
1866 2826 'show' => false
1867 - ],
1868 - 'step' => [
2827 + ),
2828 + 'step' => array(
1869 2829 'show' => false
1870 - ],
1871 - 'priority' => 1,
1872 - 'fields' => [
1873 - 'import_docs_nested' => [
1874 - 'id' => 'import_docs_nested',
1875 - 'name' => 'import_docs_nested',
1876 - 'type' => 'section',
1877 - 'label' => __( 'Import Docs', 'betterdocs' ),
2830 + ),
2831 + 'priority' => 1,
2832 + 'fields' => array(
2833 + 'import_docs_nested' => array(
2834 + 'id' => 'import_docs_nested',
2835 + 'name' => 'import_docs_nested',
2836 + 'type' => 'section',
2837 + 'label' => __( 'Import Docs', 'betterdocs' ),
1878 2838 'priority' => 1,
1879 - 'fields' => [
1880 - 'import_docs' => [
1881 - 'name' => 'import_docs',
1882 - 'type' => 'importerupload',
1883 - 'label' => __( 'Import Docs', 'betterdocs' ),
1884 - 'label_subtitle' => wp_sprintf( __( 'To import your Docs, please upload the .xml / .csv file here. <a href="%1$s">Download sample csv file</a>', 'betterdocs' ), betterdocs()->assets->icon( 'BetterDocs-sample-data.csv', true ) ),
1885 - 'text' => [
1886 - 'normal' => __( 'Proceed', 'betterdocs' ),
1887 - 'saved' => __( 'Proceed', 'betterdocs' ),
1888 - 'loading' => __( 'Importing...', 'betterdocs' ),
2839 + 'fields' => array(
2840 + 'import_docs' => array(
2841 + 'name' => 'import_docs',
2842 + 'type' => 'importerupload',
2843 + 'label' => __( 'Import Docs', 'betterdocs' ),
2844 + 'label_subtitle' => wp_sprintf( // Translators: %1$s is a link to download a sample CSV file.
2845 + __( 'To import your Docs, please upload the .xml / .csv file here. <a href="%1$s">Download sample csv file</a>', 'betterdocs' ), betterdocs()->assets->icon( 'BetterDocs-sample-data.csv', true ) ),
2846 + 'text' => array(
2847 + 'normal' => __( 'Proceed', 'betterdocs' ),
2848 + 'saved' => __( 'Proceed', 'betterdocs' ),
2849 + 'loading' => __( 'Importing...', 'betterdocs' ),
1889 2850 'exists_notice' => __( 'It seems like documentations with same slugs already exist on your website. What would you like to do?', 'betterdocs' )
1890 - ],
1891 - 'ajax' => [
1892 - 'on' => 'click',
1893 - 'api' => '/betterdocs/v1/import-docs',
1894 - 'swal' => [
1895 - 'text' => __( 'Import completed successfully.', 'betterdocs' ),
1896 - 'icon' => 'success',
2851 + ),
2852 + 'ajax' => array(
2853 + 'on' => 'click',
2854 + 'api' => '/betterdocs/v1/import-docs',
2855 + 'swal' => array(
2856 + 'text' => __( 'Import completed successfully.', 'betterdocs' ),
2857 + 'icon' => 'success',
1897 2858 'autoClose' => 2000
1898 - ]
1899 - ],
1900 - 'file_type' => '.xml, .csv',
1901 - 'priority' => 1
1902 - ]
1903 - ]
1904 - ],
2859 + )
2860 + ),
2861 + 'file_type' => '.xml, .csv',
2862 + 'priority' => 1
2863 + )
2864 + )
2865 + ),
1905 2866
1906 - 'import_settings_nested' => [
1907 - 'id' => 'import_settings_nested',
1908 - 'name' => 'import_settings_nested',
1909 - 'type' => 'section',
1910 - 'label' => __( 'Import Settings', 'betterdocs' ),
2867 + 'import_settings_nested' => array(
2868 + 'id' => 'import_settings_nested',
2869 + 'name' => 'import_settings_nested',
2870 + 'type' => 'section',
2871 + 'label' => __( 'Import Settings', 'betterdocs' ),
1911 2872 'priority' => 1,
1912 - 'fields' => [
1913 - 'settings_importer' => [
1914 - 'name' => 'settings_importer',
1915 - 'type' => 'settingsuploader',
1916 - 'label' => __( 'Import Settings', 'notificationx' ),
2873 + 'fields' => array(
2874 + 'settings_importer' => array(
2875 + 'name' => 'settings_importer',
2876 + 'type' => 'settingsuploader',
2877 + 'label' => __( 'Import Settings', 'betterdocs' ),
1917 2878 'label_subtitle' => __( 'To import BetterDocs Settings, please upload BetterDocs settings you have exported from another website in .json format', 'betterdocs' ),
1918 - 'reset' => __( 'Change', 'notificationx' ),
1919 - 'priority' => 1
1920 - ],
1921 - 'import_settings' => [
1922 - 'name' => 'import_settings',
1923 - 'type' => 'button',
1924 - 'rules' => Rules::is( 'settings_importer', null, true ),
1925 - 'text' => [
1926 - 'normal' => __( 'Proceed', 'betterdocs' ),
1927 - 'saved' => __( 'Proceed', 'betterdocs' ),
2879 + 'reset' => __( 'Change', 'betterdocs' ),
2880 + 'priority' => 1
2881 + ),
2882 + 'import_settings' => array(
2883 + 'name' => 'import_settings',
2884 + 'type' => 'button',
2885 + 'rules' => Rules::is( 'settings_importer', null, true ),
2886 + 'text' => array(
2887 + 'normal' => __( 'Proceed', 'betterdocs' ),
2888 + 'saved' => __( 'Proceed', 'betterdocs' ),
1928 2889 'loading' => __( 'Importing...', 'betterdocs' )
1929 - ],
1930 - 'ajax' => [
1931 - 'on' => 'click',
1932 - 'api' => '/betterdocs/v1/import-settings',
1933 - 'data' => [
2890 + ),
2891 + 'ajax' => array(
2892 + 'on' => 'click',
2893 + 'api' => '/betterdocs/v1/import-settings',
2894 + 'data' => array(
1934 2895 'settings' => '@settings_importer'
1935 - ],
1936 - 'swal' => [
1937 - 'text' => __( 'Import completed successfully.', 'betterdocs' ),
1938 - 'icon' => 'success',
2896 + ),
2897 + 'swal' => array(
2898 + 'text' => __( 'Import completed successfully.', 'betterdocs' ),
2899 + 'icon' => 'success',
1939 2900 'autoClose' => 1000
1940 - ],
2901 + ),
1941 2902 'reload' => true
1942 - ],
2903 + ),
1943 2904 'priority' => 2
1944 - ]
1945 - ]
1946 - ]
1947 - ]
1948 - ]
1949 - ]
1950 - ],
1951 - 'export' => [
1952 - 'id' => 'export',
1953 - 'name' => 'export',
1954 - 'type' => 'section',
1955 - 'label' => __( 'Export', 'betterdocs' ),
2905 + )
2906 + )
2907 + )
2908 + )
2909 + )
2910 + )
2911 + ),
2912 + 'export' => array(
2913 + 'id' => 'export',
2914 + 'name' => 'export',
2915 + 'type' => 'section',
2916 + 'label' => __( 'Export', 'betterdocs' ),
1956 2917 'priority' => 1,
1957 - 'fields' => [
1958 - 'export_tab_nested' => [
1959 - 'id' => 'export_tab_nested',
1960 - 'name' => 'export_tab_nested',
1961 - 'label' => __( 'Export', 'betterdocs' ),
1962 - 'classes' => 'tab-nested-layout',
1963 - 'type' => "tab",
1964 - 'active' => "export_docs_nested",
2918 + 'fields' => array(
2919 + 'export_tab_nested' => array(
2920 + 'id' => 'export_tab_nested',
2921 + 'name' => 'export_tab_nested',
2922 + 'label' => __( 'Export', 'betterdocs' ),
2923 + 'classes' => 'tab-nested-layout',
2924 + 'type' => 'tab',
2925 + 'active' => 'export_docs_nested',
1965 2926 'completionTrack' => true,
1966 - 'sidebar' => false,
1967 - 'save' => false,
1968 - 'title' => false,
1969 - 'config' => [
1970 - 'active' => 'export_docs_nested',
2927 + 'sidebar' => false,
2928 + 'save' => false,
2929 + 'title' => false,
2930 + 'config' => array(
2931 + 'active' => 'export_docs_nested',
1971 2932 'sidebar' => false,
1972 - 'title' => false
1973 - ],
1974 - 'submit' => [
2933 + 'title' => false
2934 + ),
2935 + 'submit' => array(
1975 2936 'show' => false
1976 - ],
1977 - 'step' => [
2937 + ),
2938 + 'step' => array(
1978 2939 'show' => false
1979 - ],
1980 - 'priority' => 1,
1981 - 'fields' => [
1982 - 'export_docs_nested' => [
1983 - 'id' => 'export_docs_nested',
1984 - 'name' => 'export_docs_nested',
1985 - 'type' => 'section',
1986 - 'label' => __( 'Export Docs', 'betterdocs' ),
2940 + ),
2941 + 'priority' => 1,
2942 + 'fields' => array(
2943 + 'export_docs_nested' => array(
2944 + 'id' => 'export_docs_nested',
2945 + 'name' => 'export_docs_nested',
2946 + 'type' => 'section',
2947 + 'label' => __( 'Export Docs', 'betterdocs' ),
1987 2948 'priority' => 1,
1988 - 'fields' => apply_filters( 'betterdocs_export_fields', [
1989 - 'export_type' => [
1990 - 'name' => 'export_type',
1991 - 'label' => __( 'Select Docs Type', 'betterdocs' ),
2949 + 'fields' => apply_filters( 'betterdocs_export_fields', array(
2950 + 'export_type' => array(
2951 + 'name' => 'export_type',
2952 + 'label' => __( 'Select Docs Type', 'betterdocs' ),
1992 2953 'label_subtitle' => __( 'Choose an export type: All Docs, a specific Knowledge Base, or a Doc Category', 'betterdocs' ),
1993 - 'type' => 'select',
1994 - 'default' => 'docs',
1995 - 'priority' => 3,
1996 - 'search' => true,
1997 - 'options' => $this->normalize_options( apply_filters( 'betterdocs_export_type_options', [
1998 - 'docs' => __( 'Docs', 'betterdocs' ),
1999 - 'doc_category' => __( 'Docs Category', 'betterdocs' )
2000 - ] ) )
2001 - ],
2002 - 'export_docs' => [
2003 - 'name' => 'export_docs',
2004 - 'type' => 'checkbox-select',
2005 - 'label' => __( 'Select Docs', 'betterdocs' ),
2954 + 'type' => 'select',
2955 + 'default' => 'docs',
2956 + 'priority' => 3,
2957 + 'search' => true,
2958 + 'options' => $this->normalize_options( apply_filters( 'betterdocs_export_type_options', array(
2959 + 'docs' => __( 'Docs', 'betterdocs' ),
2960 + 'doc_category' => __( 'Docs Category', 'betterdocs' ),
2961 + 'glossaries' => __( 'Glossaries', 'betterdocs' )
2962 + ) ) )
2963 + ),
2964 + 'export_docs' => array(
2965 + 'name' => 'export_docs',
2966 + 'type' => 'checkbox-select',
2967 + 'label' => __( 'Select Docs', 'betterdocs' ),
2006 2968 'label_subtitle' => __( 'Selected docs will be included in the export.', 'betterdocs' ),
2007 - 'priority' => 4,
2008 - 'multiple' => true,
2009 - 'search' => true,
2010 - 'default' => ['all'],
2011 - 'placeholder' => __( 'Select any', 'betterdocs' ),
2012 - 'options' => array_merge( [
2013 - [
2969 + 'priority' => 4,
2970 + 'multiple' => true,
2971 + 'search' => true,
2972 + 'default' => array( 'all' ),
2973 + 'placeholder' => __( 'Select any', 'betterdocs' ),
2974 + 'options' => array_merge( array(
2975 + array(
2014 2976 'value' => 'all',
2015 2977 'label' => 'All'
2016 - ]
2017 - ], $this->docs() ),
2018 - 'filterValue' => 'all',
2019 - 'rules' => Rules::is( 'export_type', 'docs' )
2020 - ],
2021 - 'export_categories' => [
2022 - 'name' => 'export_categories',
2023 - 'type' => 'checkbox-select',
2024 - 'label' => __( 'Select Categories', 'betterdocs' ),
2978 + )
2979 + ), $this->docs() ),
2980 + 'filterValue' => 'all',
2981 + 'rules' => Rules::is( 'export_type', 'docs' )
2982 + ),
2983 + 'export_categories' => array(
2984 + 'name' => 'export_categories',
2985 + 'type' => 'checkbox-select',
2986 + 'label' => __( 'Select Categories', 'betterdocs' ),
2025 2987 'label_subtitle' => __( 'Selected categories and its docs will be included in the export.', 'betterdocs' ),
2026 - 'priority' => 6,
2027 - 'multiple' => true,
2028 - 'search' => true,
2029 - 'default' => ['all'],
2030 - 'placeholder' => __( 'Select any', 'betterdocs' ),
2031 - 'options' => $this->get_terms( 'doc_category' ),
2032 - 'filterValue' => 'all',
2033 - 'rules' => Rules::is( 'export_type', 'doc_category' )
2034 - ],
2035 - 'file_type' => [
2036 - 'name' => 'file_type',
2037 - 'label' => __( 'Select File Type', 'betterdocs' ),
2988 + 'priority' => 6,
2989 + 'multiple' => true,
2990 + 'search' => true,
2991 + 'default' => array( 'all' ),
2992 + 'placeholder' => __( 'Select any', 'betterdocs' ),
2993 + 'options' => $this->get_terms( 'doc_category', false ),
2994 + 'filterValue' => 'all',
2995 + 'rules' => Rules::is( 'export_type', 'doc_category' )
2996 + ),
2997 + 'export_glossaries' => array(
2998 + 'name' => 'export_glossaries',
2999 + 'type' => 'checkbox-select',
3000 + 'label' => __( 'Select Glossaries', 'betterdocs' ),
3001 + 'label_subtitle' => __( 'Selected glossary terms will be exported.', 'betterdocs' ),
3002 + 'priority' => 7,
3003 + 'multiple' => true,
3004 + 'search' => true,
3005 + 'default' => array( 'all' ),
3006 + 'placeholder' => __( 'Select any', 'betterdocs' ),
3007 + 'options' => $this->get_terms( 'glossaries' ),
3008 + 'filterValue' => 'all',
3009 + 'rules' => Rules::is( 'export_type', 'glossaries' )
3010 + ),
3011 + 'file_type' => array(
3012 + 'name' => 'file_type',
3013 + 'label' => __( 'Select File Type', 'betterdocs' ),
2038 3014 'label_subtitle' => __( 'Choose a file type', 'betterdocs' ),
2039 - 'type' => 'select',
2040 - 'default' => 'xml',
2041 - 'priority' => 7,
2042 - 'search' => true,
2043 - 'options' => $this->normalize_options( apply_filters( 'betterdocs_export_file_type_options', [
3015 + 'type' => 'select',
3016 + 'default' => 'xml',
3017 + 'priority' => 8,
3018 + 'search' => true,
3019 + 'options' => $this->normalize_options( apply_filters( 'betterdocs_export_file_type_options', array(
2044 3020 'xml' => __( '.xml', 'betterdocs' ),
2045 3021 'csv' => __( '.csv', 'betterdocs' )
2046 - ] ) )
2047 - ],
2048 - 'export_docs_btn' => [
2049 - 'name' => 'export_docs_btn',
2050 - 'text' => [
2051 - 'normal' => __( 'Proceed', 'betterdocs' ),
2052 - 'saved' => __( 'Proceed', 'betterdocs' ),
3022 + ) ) )
3023 + ),
3024 + 'enable_export_faq' => array(
3025 + 'name' => 'enable_export_faq',
3026 + 'type' => 'toggle',
3027 + 'priority' => 9,
3028 + 'label' => __( 'Export FAQ', 'betterdocs' ),
3029 + 'label_subtitle' => __( 'Export FAQ Related Terms & Posts', 'betterdocs' ),
3030 + 'enable_disable_text_active' => true,
3031 + 'default' => true,
3032 + 'rules' => Rules::is( 'export_type', 'glossaries', true )
3033 + ),
3034 + 'export_docs_btn' => array(
3035 + 'name' => 'export_docs_btn',
3036 + 'text' => array(
3037 + 'normal' => __( 'Proceed', 'betterdocs' ),
3038 + 'saved' => __( 'Proceed', 'betterdocs' ),
2053 3039 'loading' => __( 'Exporting...', 'betterdocs' )
2054 - ],
2055 - 'type' => 'button',
2056 - 'priority' => 8,
2057 - 'ajax' => [
2058 - 'on' => 'click',
2059 - 'api' => '/betterdocs/v1/export-docs',
2060 - 'data' => [
2061 - 'export_type' => '@export_type',
2062 - 'export_docs' => '@export_docs',
2063 - 'export_kbs' => '@export_kbs',
3040 + ),
3041 + 'type' => 'button',
3042 + 'priority' => 10,
3043 + 'ajax' => array(
3044 + 'on' => 'click',
3045 + 'api' => '/betterdocs/v1/export-docs',
3046 + 'data' => array(
3047 + 'export_type' => '@export_type',
3048 + 'export_docs' => '@export_docs',
3049 + 'export_kbs' => '@export_kbs',
2064 3050 'export_categories' => '@export_categories',
2065 - 'file_type' => '@file_type'
2066 - ],
2067 - 'swal' => [
2068 - 'text' => __( 'Exported Successfully.', 'betterdocs' ),
2069 - 'icon' => 'success',
3051 + 'export_glossaries' => '@export_glossaries',
3052 + 'file_type' => '@file_type',
3053 + 'enable_export_faq' => '@enable_export_faq'
3054 + ),
3055 + 'swal' => array(
3056 + 'text' => __( 'Exported Successfully.', 'betterdocs' ),
3057 + 'icon' => 'success',
2070 3058 'autoClose' => 2000
2071 - ]
2072 - ]
2073 - ]
2074 - ] )
2075 - ],
3059 + )
3060 + )
3061 + )
3062 + ) )
3063 + ),
2076 3064
2077 - 'export_settings_nested' => [
2078 - 'id' => 'export_settings_nested',
2079 - 'name' => 'export_settings_nested',
2080 - 'type' => 'section',
2081 - 'label' => __( 'Export Settings', 'betterdocs' ),
3065 + 'export_settings_nested' => array(
3066 + 'id' => 'export_settings_nested',
3067 + 'name' => 'export_settings_nested',
3068 + 'type' => 'section',
3069 + 'label' => __( 'Export Settings', 'betterdocs' ),
2082 3070 'priority' => 1,
2083 - 'fields' => [
2084 - 'export_settings' => [
2085 - 'name' => 'export_settings',
2086 - 'label' => __( 'Export Settings', 'betterdocs' ),
3071 + 'fields' => array(
3072 + 'export_settings' => array(
3073 + 'name' => 'export_settings',
3074 + 'label' => __( 'Export Settings', 'betterdocs' ),
2087 3075 'label_subtitle' => __( 'Simply click on “Export Settings” button to download your BetterDocs settings in .json format', 'betterdocs' ),
2088 - 'text' => [
2089 - 'normal' => __( 'Export Settings', 'betterdocs' ),
2090 - 'saved' => __( 'Export Settings', 'betterdocs' ),
3076 + 'text' => array(
3077 + 'normal' => __( 'Export Settings', 'betterdocs' ),
3078 + 'saved' => __( 'Export Settings', 'betterdocs' ),
2091 3079 'loading' => __( 'Exporting...', 'betterdocs' )
2092 - ],
2093 - 'type' => 'button',
2094 - 'priority' => 8,
2095 - 'ajax' => [
2096 - 'on' => 'click',
2097 - 'api' => '/betterdocs/v1/export-settings',
2098 - 'data' => [
3080 + ),
3081 + 'type' => 'button',
3082 + 'priority' => 8,
3083 + 'ajax' => array(
3084 + 'on' => 'click',
3085 + 'api' => '/betterdocs/v1/export-settings',
3086 + 'data' => array(
2099 3087 'betterdocs_settings' => get_option( 'betterdocs_settings' )
2100 - ],
2101 - 'swal' => [
2102 - 'text' => __( 'File downloaded successfully.', 'betterdocs' ),
2103 - 'icon' => 'success',
3088 + ),
3089 + 'swal' => array(
3090 + 'text' => __( 'File downloaded successfully.', 'betterdocs' ),
3091 + 'icon' => 'success',
2104 3092 'autoClose' => 2000
2105 - ]
2106 - ]
2107 - ]
2108 - ]
2109 - ]
2110 - ]
2111 - ]
2112 - ]
2113 - ]
2114 - ]
2115 - ]
2116 - ]
2117 - ]
2118 - ]
2119 - ] );
3093 + )
3094 + )
3095 + )
3096 + )
3097 + )
3098 + )
3099 + )
3100 + )
3101 + )
3102 + )
3103 + )
3104 + )
3105 + )
3106 + )
3107 + ) );
2120 3108
2121 3109 return $settings;
2122 3110 }
2123 3111
3112 + public function maybe_remove_git_tab( $tabs ) {
3113 + $pro_active = is_plugin_active( 'betterdocs-pro/betterdocs-pro.php' );
3114 + $pro_has_git = apply_filters( 'betterdocs_pro_has_git_integration', false );
3115 +
3116 + if ( $pro_active && ! $pro_has_git ) {
3117 + unset( $tabs[ 'tab-git-sync' ] );
3118 + }
3119 +
3120 + return $tabs;
3121 + }
3122 +
2124 3123 public function normalize_options( $options ) {
2125 3124 return GlobalFields::normalize_fields( $options );
2126 3125 }
2127 3126
@@ -2131,20 +3130,20 @@
2131 3130 if ( $docs_tax ) {
2132 3131 return $docs_tax;
2133 3132 }
2134 3133
2135 - $taxonomies = get_taxonomies( [
2136 - 'object_type' => ['docs']
2137 - ], 'objects' );
3134 + $taxonomies = get_taxonomies( array(
3135 + 'object_type' => array( 'docs' )
3136 + ), 'objects' );
2138 3137
2139 - $docs_tax = [
2140 - 'all' => 'All Docs Archive',
3138 + $docs_tax = array(
3139 + 'all' => 'All Docs Archive',
2141 3140 'docs' => 'Docs Page'
2142 - ];
3141 + );
2143 3142 foreach ( $taxonomies as $key => $value ) {
2144 - $docs_tax[$key] = $value->label;
3143 + $docs_tax[ $key ] = $value->label;
2145 3144 }
2146 - unset( $docs_tax['doc_tag'] );
3145 + unset( $docs_tax[ 'doc_tag' ] );
2147 3146
2148 3147 $docs_tax = $this->normalize_options( $docs_tax );
2149 3148 if ( count( $docs_tax ) > 2 ) {
2150 3149 $this->database->set_cache( 'betterdocs::settings::taxonomies', $docs_tax );
@@ -2152,9 +3151,9 @@
2152 3151
2153 3152 return $docs_tax;
2154 3153 }
2155 3154
2156 - public function get_terms( $taxonomy ) {
3155 + public function get_terms( $taxonomy, $hide_empty = true ) {
2157 3156 $_cache_key = 'betterdocs::settings::terms::' . trim( $taxonomy );
2158 3157 $docs_tax = $this->database->get_cache( $_cache_key );
2159 3158
2160 3159 if ( $docs_tax ) {
@@ -2160,21 +3159,21 @@
2160 3159 if ( $docs_tax ) {
2161 3160 return $docs_tax;
2162 3161 }
2163 3162
2164 - $get_terms = get_terms( [
2165 - 'taxonomy' => $taxonomy,
2166 - 'hide_empty' => false
2167 - ] );
3163 + $get_terms = get_terms( array(
3164 + 'taxonomy' => $taxonomy,
3165 + 'hide_empty' => $hide_empty
3166 + ) );
2168 3167
2169 - $terms = [
3168 + $terms = array(
2170 3169 'all' => 'All'
2171 - ];
3170 + );
2172 3171
2173 3172 if ( ! empty( $get_terms ) && ! is_wp_error( $get_terms ) ) {
2174 3173 foreach ( $get_terms as $value ) {
2175 3174 if ( isset( $value->slug ) && isset( $value->name ) ) {
2176 - $terms[$value->slug] = $value->name;
3175 + $terms[ $value->slug ] = $value->name;
2177 3176 }
2178 3177 }
2179 3178 }
2180 3179
@@ -2185,8 +3184,40 @@
2185 3184
2186 3185 return $terms;
2187 3186 }
2188 3187
3188 + public function get_terms_with_ids( $taxonomy ) {
3189 + $_cache_key = 'betterdocs::settings::terms::ids' . trim( $taxonomy );
3190 + $docs_tax = $this->database->get_cache( $_cache_key );
3191 +
3192 + if ( $docs_tax ) {
3193 + return $docs_tax;
3194 + }
3195 +
3196 + $get_terms = get_terms( array(
3197 + 'taxonomy' => $taxonomy,
3198 + 'hide_empty' => false,
3199 + 'suppress_filter' => true
3200 + ) );
3201 +
3202 + $terms = array();
3203 +
3204 + if ( ! empty( $get_terms ) && ! is_wp_error( $get_terms ) ) {
3205 + foreach ( $get_terms as $value ) {
3206 + if ( isset( $value->term_id ) && isset( $value->name ) ) {
3207 + $terms[ $value->term_id ] = $value->name;
3208 + }
3209 + }
3210 + }
3211 +
3212 + $terms = $this->normalize_options( $terms );
3213 + if ( count( $terms ) > 1 ) {
3214 + $this->database->set_cache( $_cache_key, $terms );
3215 + }
3216 +
3217 + return $terms;
3218 + }
3219 +
2189 3220 /**
2190 3221 * Get all docs
2191 3222 */
2192 3223 public function docs() {
@@ -2195,19 +3226,19 @@
2195 3226 if ( $docs ) {
2196 3227 return $docs;
2197 3228 }
2198 3229
2199 - $docs = [];
3230 + $docs = array();
2200 3231
2201 - $_docs = get_posts( [
2202 - 'post_type' => 'docs',
2203 - 'numberposts' => -1,
3232 + $_docs = get_posts( array(
3233 + 'post_type' => 'docs',
3234 + 'numberposts' => -1,
2204 3235 'posts_per_page' => -1
2205 - ] );
3236 + ) );
2206 3237
2207 3238 if ( ! empty( $_docs ) ) {
2208 3239 foreach ( $_docs as $doc ) {
2209 - $docs[$doc->ID] = betterdocs()->template_helper->kses( $doc->post_title );
3240 + $docs[ $doc->ID ] = betterdocs()->template_helper->kses( $doc->post_title );
2210 3241 }
2211 3242 $docs = GlobalFields::normalize_fields( $docs );
2212 3243 $this->database->set_cache( 'betterdocs::settings::all_docs', $docs );
2213 3244 }
@@ -2214,15 +3245,16 @@
2214 3245
2215 3246 return $docs;
2216 3247 }
2217 3248
2218 - public function hide_roles_management( $tabData = [] ) {
3249 + public function hide_roles_management( $tabData = array() ) {
2219 3250 global $current_user;
2220 3251
2221 3252 if ( $current_user instanceof WP_User && ! in_array( 'administrator', $current_user->roles ) ) {
2222 - unset( $tabData['fields']['title-advance-settings']['fields']['article_roles'] );
2223 - unset( $tabData['fields']['title-advance-settings']['fields']['settings_roles'] );
2224 - unset( $tabData['fields']['title-advance-settings']['fields']['analytics_roles'] );
3253 + unset( $tabData[ 'fields' ][ 'title-advance-settings' ][ 'fields' ][ 'article_roles' ] );
3254 + unset( $tabData[ 'fields' ][ 'title-advance-settings' ][ 'fields' ][ 'settings_roles' ] );
3255 + unset( $tabData[ 'fields' ][ 'title-advance-settings' ][ 'fields' ][ 'analytics_roles' ] );
3256 + unset( $tabData[ 'fields' ][ 'title-advance-settings' ][ 'fields' ][ 'faq_roles' ] );
2225 3257 }
2226 3258
2227 3259 return $tabData;
2228 3260 }