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