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

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

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