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

class-betterdocs-settings.php in BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot 2.1.3, at admin/includes/class-betterdocs-settings.php

479 lines 18.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * This class is responsible for all settings things happening in Betterdocs Plugin
4 *
5 * @link https://wpdeveloper.com
6 * @since 1.0.0
7 *
8 * @package BetterDocs
9 * @subpackage BetterDocs/admin
10 */
11 class BetterDocs_Settings {
12 public static function init(){
13 add_action( 'betterdocs_settings_header', array( __CLASS__, 'header_template' ), 10 );
14 add_action( 'wp_ajax_betterdocs_general_settings', array( __CLASS__, 'general_settings_ac' ), 10 );
15 }
16
17 /**
18 * This function is responsible for settings page header
19 *
20 * @hooked betterdocs_settings_header
21 * @return void
22 */
23 public static function header_template(){
24 ?>
25 <div class="betterdocs-settings-header">
26 <div class="betterdocs-header-full">
27 <img src="<?php echo BETTERDOCS_ADMIN_URL ?>assets/img/betterdocs-icon.svg" alt="">
28 <h2 class="title"><?php _e( 'BetterDocs Settings', 'betterdocs' ); ?></h2>
29 </div>
30 </div>
31 <?php
32 }
33 /**
34 * Get all settings fields
35 *
36 * @param array $settings
37 * @return array
38 */
39 public static function get_settings_fields( $settings ){
40 $new_fields = [];
41
42 foreach( $settings as $setting ) {
43
44 // if( isset( $setting['fields'] ) ) {
45
46 // }
47
48 $sections = isset( $setting['sections'] ) ? $setting['sections'] : [];
49 if( ! empty( $sections ) ) {
50 foreach( $sections as $section ) {
51 $fields = isset( $section['fields'] ) ? $section['fields'] : [];
52 if( empty( $fields ) ) {
53 $tabs = isset( $section['tabs'] ) ? $section['tabs'] : [];
54 if( ! empty( $tabs ) ) {
55 foreach( $tabs as $id => $tab ) {
56 $fields = isset( $tab['fields'] ) ? $tab['fields'] : [];
57 if( ! empty( $fields ) ) {
58 foreach( $fields as $id => $field ) {
59 $new_fields[ $id ] = $field;
60 }
61 }
62 }
63 }
64 } else {
65 if( ! empty( $fields ) ) {
66 foreach( $fields as $id => $field ) {
67 $new_fields[ $id ] = $field;
68 }
69 }
70 }
71 }
72 }
73 }
74
75 return apply_filters( 'betterdocs_settings_fields', $new_fields );
76 }
77 /**
78 * Get the whole settings array
79 *
80 * @return void
81 */
82 public static function settings_args(){
83 if (!function_exists( 'betterdocs_settings_args')) {
84 require BETTERDOCS_ADMIN_DIR_PATH . 'includes/betterdocs-settings-page-helper.php';
85 }
86 do_action( 'betterdocs_before_settings_load' );
87
88 if (!empty($_GET['page']) && !empty($_GET['saved']) && $_GET['page'] === 'betterdocs-settings' && $_GET['saved'] == true) {
89 flush_rewrite_rules();
90 }
91 return betterdocs_settings_args();
92 }
93 /**
94 * Render the settings page
95 *
96 * @return void
97 */
98 public static function settings_page(){
99 $settings_args = self::settings_args();
100 $value = BetterDocs_DB::get_settings();
101
102 include_once BETTERDOCS_ADMIN_DIR_PATH . 'partials/betterdocs-settings-display.php';
103 }
104
105 /**
106 * Render the analytics page
107 *
108 * @return void
109 */
110 public static function analytics_page(){
111 /*$settings_args = self::settings_args();
112 $value = BetterDocs_DB::get_settings();
113
114 include_once BETTERDOCS_ADMIN_DIR_PATH . 'partials/betterdocs-settings-display.php';*/
115 ?>
116 <div class="betterdocs-settings-wrap">
117 <?php do_action( 'betterdocs_settings_header' ); ?>
118 <div class="betterdocs-left-right-settings">
119 <?php do_action( 'betterdocs_before_settings_left' ); ?>
120 <div class="betterdocs-settings">
121 <div class="betterdocs-settings-menu">
122 <ul>
123 <li class="active" data-tab="overview"><a href="#overview"><?php esc_html_e('Overview', 'betterdocs'); ?></a></li>
124 <li class="" data-tab="reactions"><a href="#reactions"><?php esc_html_e('Reactions', 'betterdocs'); ?></a></li>
125 <li class="" data-tab="keyword_search"><a href="#keyword_search"><?php esc_html_e('Keyword Search', 'betterdocs'); ?></a></li>
126 </ul>
127 </div>
128
129 <div class="betterdocs-settings-content betterdocs-analytics-teaser">
130 <div class="betterdocs-settings-content">
131 <div class="betterdocs-settings-form-wrapper">
132 <form method="post" id="betterdocs-settings-form" action="#">
133 <div id="betterdocs-overview" class="betterdocs-settings-tab active">
134 <img src="<?php echo plugins_url( '/', __FILE__ ).'../assets/img/analytics-overview.png'; ?>" alt="">
135 <div class="overlay">
136 <?php self::overlay_content() ?>
137 </div>
138 </div>
139 <div id="betterdocs-reactions" class="betterdocs-settings-tab">
140 <img src="<?php echo plugins_url( '/', __FILE__ ).'../assets/img/analytics-reactions.png'; ?>" alt="">
141 <div class="overlay">
142 <?php self::overlay_content() ?>
143 </div>
144 </div>
145 <div id="betterdocs-keyword_search" class="betterdocs-settings-tab">
146 <img src="<?php echo plugins_url( '/', __FILE__ ).'../assets/img/analytics-search.png'; ?>" alt="">
147 <div class="overlay">
148 <?php self::overlay_content() ?>
149 </div>
150 </div>
151 </form>
152 </div>
153 </div>
154 </div>
155 <?php //include BETTERDOCS_ADMIN_DIR_PATH . 'partials/betterdocs-settings-blocks.php'; ?>
156 </div>
157 <?php
158 do_action( 'betterdocs_after_settings_left' );
159 ?>
160 </div>
161 </div>
162 <?php
163 }
164
165 public static function overlay_content() {
166 ?>
167 <div class="overlay-content">
168 <h3><?php esc_html_e('Unlock Analytics With BetterDocs PRO', 'betterdocs'); ?><img src="<?php echo plugins_url( '/', __FILE__ ).'../assets/img/analytics-lock.png'; ?>" id="img-teaser" alt=""></h3>
169 <p class="teaser-text teaser-desc"><?php esc_html_e('Scale your support tickets tracking the performance of your knowledge base BetterDocs Analytics.', 'betterdocs'); ?></p>
170 <ul class="analytics-list">
171 <li>
172 <div class="analytics-item">
173 <img src="<?php echo plugins_url( '/', __FILE__ ).'../assets/img/group-icon-1.png'; ?>" id="img-teaser-1" alt="">
174 <p class="teaser-text"><?php esc_html_e('Measure performance of your knowledge base', 'betterdocs'); ?></p>
175 </div>
176 </li>
177 <li>
178 <div class="analytics-item">
179 <img src="<?php echo plugins_url( '/', __FILE__ ).'../assets/img/analytics-magifier.png'; ?>" id="img-teaser-2" alt="">
180 <p class="teaser-text"><?php esc_html_e('Identify most viewed docs and doc categories', 'betterdocs'); ?></p>
181 </div>
182 </li>
183 <li>
184 <div class="analytics-item">
185 <img src="<?php echo plugins_url( '/', __FILE__ ).'../assets/img/analytics-globe.png'; ?>" id="img-teaser-4" alt="">
186 <p class="teaser-text"><?php esc_html_e('Identify most used keywords searched by site visitors', 'betterdocs'); ?> </p>
187 </div>
188 </li>
189 </ul>
190 <div class="analytics-upgrade-btn">
191 <a href="https://betterdocs.co/upgrade"><?php esc_html_e('Upgrade To BetterDocs PRO','betterdocs-pro') ?></a>
192 </div>
193 </div>
194 <?php
195 }
196 /**
197 * This function is responsible for render settings field
198 *
199 * @param string $key
200 * @param array $field
201 * @return void
202 */
203 public static function render_field( $key = '', $field = [] ) {
204 $post_id = '';
205 $name = $key;
206 $id = BetterDocs_Metabox::get_row_id( $key );
207 $file_name = isset( $field['type'] ) ? $field['type'] : 'text';
208
209 if( 'template' === $file_name ) {
210 $default = isset( $field['defaults'] ) ? $field['defaults'] : [];
211 } else {
212 $default = isset( $field['default'] ) ? $field['default'] : '';
213 }
214
215 $saved_value = BetterDocs_DB::get_settings( $name );
216
217 if( ! empty( $saved_value ) ) {
218 $value = $saved_value;
219 } else {
220 $value = $default;
221 }
222
223 $class = 'betterdocs-settings-field';
224 $row_class = BetterDocs_Metabox::get_row_class( $file_name );
225
226 $attrs = '';
227
228 if( isset( $field['toggle'] ) && in_array( $file_name, array( 'checkbox', 'select', 'toggle', 'theme' ) ) ) {
229 $attrs .= ' data-toggle="' . esc_attr( json_encode( $field['toggle'] ) ) . '"';
230 }
231
232 if( isset( $field['hide'] ) && $file_name == 'select' ) {
233 $attrs .= ' data-hide="' . esc_attr( json_encode( $field['hide'] ) ) . '"';
234 }
235
236 $field_id = $name;
237
238 include BETTERDOCS_ADMIN_DIR_PATH . 'partials/betterdocs-field-display.php';
239 }
240 public static function save_default_settings(){
241 $settings_args = self::settings_args();
242 $fields = self::get_settings_fields( $settings_args );
243 $data = [];
244 $saved_settings = BetterDocs_DB::get_settings();
245 if( ! empty( $saved_settings ) ) {
246 return false;
247 }
248 if( ! empty( $fields ) ) {
249 foreach( $fields as $name => $posted_field ) {
250 $data[ $name ] = isset( $posted_field['default'] ) ? $posted_field['default'] : 0;
251 }
252 return BetterDocs_DB::update_settings( $data );
253 }
254 return false;
255 }
256
257 public static function has_administrator( &$roles ){
258 if( $roles === 'off' || empty( $roles ) ) {
259 $roles = [ 'administrator' ];
260 }
261
262 if( ! is_array( $roles ) ) {
263 $roles = [ $roles ];
264 }
265
266 if( ! in_array( 'administrator', $roles, true ) ) {
267 $roles[] = 'administrator';
268 }
269
270 return array_unique( $roles );
271 }
272
273 public static function get_selected_roles( $settings = array() ) {
274 $article_roles = isset( $settings['article_roles'] ) ? $settings['article_roles'] : Betterdocs_DB::get_settings('article_roles') ;
275 $settings_roles = isset( $settings['settings_roles'] ) ? $settings['settings_roles'] : Betterdocs_DB::get_settings('settings_roles');
276 $analytics_roles = isset( $settings['analytics_roles'] ) ? $settings['analytics_roles'] : BetterDocs_DB::get_settings('analytics_roles');
277
278 $article_roles = self::has_administrator( $article_roles );
279 $settings_roles = self::has_administrator( $settings_roles );
280 $analytics_roles = self::has_administrator( $analytics_roles );
281
282 return array(
283 'article_roles' => $article_roles,
284 'settings_roles' => $settings_roles,
285 'analytics_roles' => $analytics_roles
286 );
287 }
288
289 public static function get_role_cap_mapper( $settings = array() ) {
290 if( empty( $settings ) ) {
291 $settings = self::get_selected_roles();
292 }
293
294 return array(
295 'write_docs' => array(
296 'roles' => $settings['article_roles']
297 ),
298 'edit_docs_settings' => array(
299 'roles' => $settings['settings_roles']
300 ),
301 'read_docs_analytics' => array(
302 'roles' => $settings['analytics_roles']
303 )
304 );
305 }
306
307 /**
308 * This function is responsible for
309 * save all settings data, including checking the disable field to prevent
310 * users manipulation.
311 *
312 * @param array $values
313 * @return void
314 */
315 public static function save_settings( $posted_fields = [] ){
316 $settings_args = self::settings_args();
317 $fields = self::get_settings_fields( $settings_args );
318 $data = [];
319 $new_posted_fields = [];
320 if( ! empty( $posted_fields ) ) {
321 foreach( $posted_fields as $posted_field ) {
322 preg_match("/(.*)\[(.*)\]/", $posted_field['name'], $matches);
323 if( ! empty( $matches ) ) {
324 $name = $matches[1];
325 $sub_name = $matches[2];
326 if( ! empty( $sub_name ) ) {
327 $new_posted_fields[ $name ][ $sub_name ] = $posted_field['value'];
328 } else {
329 $new_posted_fields[ $name ][] = $posted_field['value'];
330 }
331 } else {
332 $new_posted_fields[ $posted_field['name'] ] = $posted_field['value'];
333 }
334 }
335 }
336 $fields_keys = array_fill_keys( array_keys( $fields ), 'off' );
337
338 $builtin_doc_page = $new_posted_fields['builtin_doc_page'] ? $fields_keys['builtin_doc_page'] : '';
339 $docs_slug = $new_posted_fields['docs_slug'];
340 $docs_page = $new_posted_fields['docs_page'];
341 if ($builtin_doc_page == 1 && $docs_slug) {
342 $docs_slug = $docs_slug;
343 } elseif ($builtin_doc_page != 1 && $docs_page) {
344 $post_info = get_post($docs_page);
345 $docs_slug = $post_info->post_name;
346 } else {
347 $docs_slug = 'docs';
348 }
349
350 do_action( 'betterdocs_settings_before_save', $new_posted_fields );
351
352 foreach ( $new_posted_fields as $key => $new_posted_field ) {
353 if ( array_key_exists( $key, $fields ) ) {
354 unset( $fields_keys[ $key ] );
355 if( empty( $new_posted_field ) ) {
356 $posted_value = isset( $fields[ $key ]['default'] ) ? $fields[ $key ]['default'] : '';
357 }
358 if( isset( $fields[ $key ]['disable'] ) && $fields[ $key ]['disable'] === true ) {
359 $posted_value = isset( $fields[ $key ]['default'] ) ? $fields[ $key ]['default'] : '';
360 }
361
362 $posted_value = BetterDocs_Helper::sanitize_field( $fields[ $key ], $new_posted_field );
363
364 if( $key == 'permalink_structure' ) {
365 $permalink_stracture = explode('%', $posted_value);
366 if ($permalink_stracture[0] == '/') {
367 $posted_value = $docs_slug . $posted_value;
368 } else if ($permalink_stracture[0] == '') {
369 $posted_value = $docs_slug . '/' . $posted_value;
370 }
371 }
372
373 if( isset( $data[ $key ] ) ) {
374 if( is_array( $data[ $key ] ) ) {
375 $data[ $key ][] = $posted_value;
376 } else {
377 $data[ $key ] = array( $posted_value, $data[ $key ] );
378 }
379 } else {
380 $data[ $key ] = $posted_value;
381 }
382 }
383 }
384
385 $data = array_merge( $fields_keys, $data );
386 $roles_rechecked = self::get_selected_roles($data);
387 $data = array_merge( $data, $roles_rechecked );
388 BetterDocs_DB::update_settings( $data );
389 do_action( 'bdocs_settings_saved', $data );
390 }
391
392 public static function general_settings_ac(){
393 /**
394 * Verify the Nonce
395 */
396 if ( ( ! isset( $_POST['nonce'] ) && ! isset( $_POST['key'] ) ) || !
397 wp_verify_nonce( $_POST['nonce'], 'betterdocs_'. $_POST['key'] .'_nonce' ) ) {
398 return;
399 }
400
401 if( isset( $_POST['form_data'] ) ) {
402 self::save_settings( $_POST['form_data'] );
403 wp_send_json_success("success");
404 } else {
405 wp_send_json_error("error");
406 }
407
408 die;
409 }
410 /**
411 * Get Roles except subscriber
412 * dynamically
413 * @return array
414 */
415 public static function get_roles(){
416 $roles = wp_roles()->role_names;
417 unset( $roles['subscriber'] );
418 return $roles;
419 }
420
421 /**
422 * Get All Roles
423 * dynamically
424 * @return array
425 */
426 public static function get_all_user_roles(){
427 $users = array(
428 'all' => 'All logged in users'
429 );
430 $roles = wp_roles()->role_names;
431 return array_merge($users, $roles);
432 }
433
434 /**
435 * Get All Registered Texanomy
436 * dynamically
437 * @return array
438 */
439 public static function get_texanomy() {
440 $taxonomies = get_taxonomies( array (
441 'object_type' => array( 'docs' )
442 ), 'objects'
443 );
444 $docs_tax = array(
445 'all' => 'All Docs Archive',
446 'docs' => 'Docs Page'
447 );
448 foreach($taxonomies as $key=>$value) {
449 $docs_tax[$key] = $value->label;
450 }
451 unset( $docs_tax['doc_tag'] );
452 return $docs_tax;
453 }
454
455 /**
456 * Get Terms List
457 * dynamically
458 * @return array
459 */
460 public static function get_terms_list($texanomy) {
461 $get_terms = get_terms(
462 array(
463 'taxonomy' => $texanomy,
464 'hide_empty' => false,
465 )
466 );
467 $terms = array(
468 'all' => 'All'
469 );
470 if (!empty($get_terms) && !is_wp_error($get_terms)) {
471 foreach($get_terms as $value) {
472 if (isset($value->slug) && isset($value->name)) {
473 $terms[$value->slug] = $value->name;
474 }
475 }
476 }
477 return $terms;
478 }
479 }