PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.7
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.7
4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 4.2.1 All 138 releases
learnpress / inc / class-lp-settings.php

class-lp-settings.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.7, at inc/class-lp-settings.php

580 lines 14.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class LP_Settings
4 *
5 * @author ThimPress
6 * @package LearnPress/Classes
7 * @version 1.0.1
8 */
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit;
12 }
13
14 class LP_Settings {
15 /**
16 * @var array
17 */
18 protected $_options = array();
19
20 /**
21 * @var string
22 */
23 protected $_prefix = '';
24
25 /**
26 * @var bool
27 */
28 protected static $_instance = null;
29
30 /**
31 * Constructor.
32 *
33 * @param array|mixed $data
34 * @param string $prefix
35 */
36 protected function __construct( $data = false, $prefix = 'learn_press_' ) {
37 try {
38 $this->_prefix = $prefix;
39
40 if ( false === $data ) {
41 $this->_load_options();
42 } else {
43 settype( $data, 'array' );
44 $this->_options = $data;
45 }
46 } catch ( Throwable $e ) {
47 error_log( __METHOD__ . ': ' . $e->getMessage() );
48 }
49 }
50
51 /**
52 * @param string $group
53 * @param string $prefix
54 *
55 * @return LP_Settings
56 */
57 public function get_group( $group, $prefix = '' ) {
58 $options = ! empty( $this->_options[ $this->_prefix . $group ] ) ? $this->get( $this->_prefix . $group ) : array();
59
60 return new LP_Settings( $options, $prefix );
61 }
62
63 /**
64 * Load all options.
65 *
66 * @throws Exception
67 * @version 1.0.2
68 * @since 3.0.0
69 */
70 protected function _load_options() {
71 // Check cache exists
72 $lp_settings_cache = new LP_Settings_Cache( true );
73 $lp_options = $lp_settings_cache->get_lp_settings();
74 if ( false !== $lp_options ) {
75 $this->_options = LP_Helper::json_decode( $lp_options, true );
76
77 return;
78 }
79
80 global $wpdb;
81 $query = $wpdb->prepare(
82 "SELECT option_name, option_value
83 FROM {$wpdb->options}
84 WHERE option_name LIKE %s",
85 $wpdb->esc_like( $this->_prefix ) . '%'
86 );
87
88 $options = $wpdb->get_results( $query );
89 if ( ! empty( $options ) ) {
90 foreach ( $options as $option ) {
91 $this->_options[ $option->option_name ] = LP_Helper::maybe_unserialize( $option->option_value );
92 }
93
94 // Set cache
95 $lp_settings_cache->set_lp_settings( json_encode( $this->_options ) );
96 }
97 }
98
99 /**
100 * Set new value for a key
101 *
102 * @param $name
103 * @param $value
104 */
105 public function set( $name, $value ) {
106 if ( $this->_prefix && strpos( $name, $this->_prefix ) === false ) {
107 $name = $this->_prefix . $name;
108 }
109 $this->_set_option( $this->_options, $name, $value );
110 }
111
112 private function _set_option( &$obj, $var, $value ) {
113 $var = (array) explode( '.', $var );
114 $current_var = array_shift( $var );
115 if ( is_object( $obj ) ) {
116 if ( isset( $obj->{$current_var} ) ) {
117 $obj->{$current_var} = LP_Helper::maybe_unserialize( $obj->{$current_var} );
118 if ( count( $var ) ) {
119 $this->_set_option( $obj->{$current_var}, join( '.', $var ), $value );
120 } else {
121 $obj->{$current_var} = $value;
122 }
123 } else {
124 $obj->{$current_var} = $value;
125 }
126 } else {
127 if ( isset( $obj[ $current_var ] ) ) {
128 $obj[ $current_var ] = LP_Helper::maybe_unserialize( $obj[ $current_var ] );
129 if ( count( $var ) ) {
130 $this->_set_option( $obj[ $current_var ], join( '.', $var ), $value );
131 } else {
132 $obj[ $current_var ] = $value;
133 }
134 } else {
135 $obj[ $current_var ] = $value;
136 }
137 }
138 }
139
140 /**
141 * Get option recurse separated by DOT
142 *
143 * @param string $var
144 * @param mixed $default
145 *
146 * @return mixed
147 */
148 public function get( string $var = '', $default = null ) {
149 if ( empty( $var ) ) {
150 return $this->_options;
151 }
152
153 if ( $this->_prefix && strpos( $var, $this->_prefix ) === false ) {
154 $var = $this->_prefix . $var;
155 }
156
157 $return = $this->_get_option( $this->_options, $var, $default );
158
159 if ( $return == '' || is_null( $return ) ) {
160 $return = $default;
161 }
162
163 return $return;
164 }
165
166 /**
167 * @param $obj
168 * @param $var
169 * @param null $default
170 *
171 * @return null
172 */
173 public function _get_option( $obj, $var, $default = null ) {
174 $var = (array) explode( '.', $var );
175 $current_var = array_shift( $var );
176 if ( is_object( $obj ) ) {
177 if ( isset( $obj->{$current_var} ) ) {
178 $obj->{$current_var} = LP_Helper::maybe_unserialize( $obj->{$current_var} );
179 if ( count( $var ) ) {
180 return $this->_get_option( $obj->{$current_var}, join( '.', $var ), $default );
181 } else {
182 return $obj->{$current_var};
183 }
184 } else {
185 return $default;
186 }
187 } else {
188 if ( isset( $obj[ $current_var ] ) ) {
189 $obj[ $current_var ] = LP_Helper::maybe_unserialize( $obj[ $current_var ] );
190 if ( count( $var ) ) {
191 return $this->_get_option( $obj[ $current_var ], join( '.', $var ), $default );
192 } else {
193 return $obj[ $current_var ];
194 }
195 } else {
196 return $default;
197 }
198 }
199 }
200
201 public function update( $key, $value = '' ) {
202 if ( func_num_args() == 1 ) {
203 $value = $this->get( $key );
204 }
205 update_option( $this->_prefix . $key, $value );
206 // $this->refresh();
207 }
208
209 /**
210 * Update option with default prefix is learn_press_
211 *
212 * @param string $name
213 * @param mixed $value
214 * @param string $prefix
215 */
216 public static function update_option( $name, $value, $prefix = 'learn_press_' ) {
217 update_option( "{$prefix}{$name}", $value );
218 $lp_settings_cache = new LP_Settings_Cache( true );
219 $lp_settings_cache->clean_lp_settings();
220 }
221
222 /**
223 * Get option with default prefix is learn_press_
224 *
225 * @param string $name
226 * @param mixed $default
227 *
228 * @return mixed
229 * @since 3.2.8
230 * @editor tungnx
231 */
232 public static function get_option( string $name = '', $default = false ) {
233 $key = "learn_press_{$name}";
234 $options = self::instance()->_options;
235 if ( isset( $options[ $key ] ) ) {
236 return $options[ $key ];
237 }
238
239 return get_option( $key, $default );
240 }
241
242 public function get_int( $key ) {
243 $value = $this->get( $key );
244
245 return intval( $value );
246 }
247
248 /**
249 * @return bool|LP_Settings
250 */
251 public static function instance() {
252 if ( is_null( self::$_instance ) ) {
253 self::$_instance = new self();
254 }
255
256 return self::$_instance;
257 }
258
259 /**
260 * Get settings endpoints for checkout page.
261 *
262 * @return array
263 * @since 3.0.0
264 */
265 public function get_checkout_endpoints() {
266 $endpoints = LP_Object_Cache::get( 'checkout', 'learn-press-endpoints' );
267
268 if ( false === $endpoints ) {
269 $defaults = array(
270 'lp-order-received' => 'lp-order-received',
271 );
272
273 $endpoints = array();
274 $settings = LP_Settings::instance()->get( 'checkout_endpoints' );
275
276 if ( $settings ) {
277 foreach ( $settings as $k => $v ) {
278 $k = preg_replace( '!_!', '-', $k );
279 $endpoints[ $k ] = $v;
280 }
281 }
282
283 foreach ( $defaults as $k => $v ) {
284 if ( empty( $endpoints[ $k ] ) ) {
285 $endpoints[ $k ] = $v;
286 }
287 }
288
289 LP_Object_Cache::set( 'checkout', $endpoints, 'learn-press-endpoints' );
290 }
291
292 return apply_filters( 'learn-press/endpoints/checkout', $endpoints );
293 }
294
295 /**
296 * Get settings endpoints for profile page.
297 *
298 * @return array
299 * @since 3.0.0
300 */
301 public function get_profile_endpoints() {
302 $endpoints = LP_Object_Cache::get( 'profile', 'learn-press-endpoints' );
303
304 if ( false === $endpoints ) {
305 $defaults = array();
306 $endpoints = array();
307
308 $settings = LP_Settings::instance()->get( 'profile_endpoints' );
309 if ( $settings ) {
310 foreach ( $settings as $k => $v ) {
311 $k = preg_replace( '!_!', '-', $k );
312 $endpoints[ $k ] = $v;
313 }
314 }
315
316 foreach ( $defaults as $k => $v ) {
317 if ( empty( $endpoints[ $k ] ) ) {
318 $endpoints[ $k ] = $v;
319 }
320 }
321
322 LP_Object_Cache::set( 'profile', $endpoints, 'learn-press-endpoints' );
323 }
324
325 return apply_filters( 'learn-press/endpoints/profile', $endpoints );
326 }
327
328 /**
329 * Get settings endpoints for course builder page.
330 *
331 * @return array
332 * @since 4.3.0
333 */
334 public function get_course_builder_endpoints() {
335 $endpoints = LP_Object_Cache::get( 'course-builder', 'learn-press-endpoints' );
336
337 if ( false === $endpoints ) {
338 $endpoints = array();
339 $defaults = [
340 'courses' => 'courses',
341 'courses-edit' => 'edit',
342 'courses-curriculum' => 'curriculum',
343 'courses-settings' => 'settings',
344 'lessons' => 'lessons',
345 'lessons-edit' => 'edit',
346 'lessons-settings' => 'settings',
347 'quizzes' => 'quizzes',
348 'quizzes-edit' => 'edit',
349 'quizzes-questions' => 'questions',
350 'quizzes-settings' => 'settings',
351 'questions' => 'questions',
352 'questions-edit' => 'edit',
353 'questions-settings' => 'settings',
354 ];
355
356 $settings = array();
357
358 if ( $settings ) {
359 foreach ( $settings as $k => $v ) {
360 $k = preg_replace( '!_!', '-', $k );
361 $endpoints[ $k ] = $v;
362 }
363 }
364
365 foreach ( $defaults as $k => $v ) {
366 if ( empty( $endpoints[ $k ] ) ) {
367 $endpoints[ $k ] = $v;
368 }
369 }
370
371 LP_Object_Cache::set( 'course-builder', $endpoints, 'learn-press-endpoints' );
372 }
373
374 return apply_filters( 'learn-press/endpoints/course-builder', $endpoints );
375 }
376
377 /**
378 * Check setting enable option "Auto start"
379 *
380 * @return bool
381 */
382 public static function is_auto_start_course(): bool {
383 return 'yes' === self::get_option( 'auto_enroll', 'yes' );
384 }
385
386 /**
387 * Check table learnpress_course is created
388 *
389 * @return bool
390 */
391 public static function is_created_tb_courses(): bool {
392 $lp_db = LP_Database::getInstance();
393 return $lp_db->check_table_exists( $lp_db->tb_lp_courses );
394 }
395
396 /**
397 * Check table thim_cache is created
398 *
399 * @return bool
400 */
401 public static function is_created_tb_thim_cache(): bool {
402 return get_option( 'thim_cache_tb_created' ) === 'yes';
403 }
404
405 /**
406 * Check enable option "Store data in $_SESSION PHP" instead of $_COOKIE
407 *
408 * @return bool
409 */
410 public static function is_store_ip_customer(): bool {
411 return self::get_option( 'store_ip_customer_session', 'no' ) === 'yes';
412 }
413
414 /**
415 * Check table learnpress_files is created
416 * @return boolean
417 */
418 public static function is_created_tb_material_files(): bool {
419 $lp_db = LP_Database::getInstance();
420 return $lp_db->check_table_exists( $lp_db->tb_lp_files );
421 }
422
423 /**
424 * Check table learnpress_mcp_api_keys is created.
425 *
426 * @return bool
427 */
428 public static function is_created_tb_mcp_api_keys(): bool {
429 $lp_db = LP_Database::getInstance();
430 return $lp_db->check_table_exists( $lp_db->tb_lp_mcp_api_keys );
431 }
432
433 /**
434 * Check table learnpress_webhooks is created.
435 *
436 * @return bool
437 */
438 public static function is_created_tb_webhooks(): bool {
439 $lp_db = LP_Database::getInstance();
440 return $lp_db->check_table_exists( $lp_db->tb_lp_webhooks );
441 }
442
443 public static function lp_material_file_types(): array {
444 return array(
445 'txt' => 'text/plain',
446 'doc,docx' => 'application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document',
447 'odt' => 'application/vnd.oasis.opendocument.text',
448 'rtf' => 'application/rtf',
449 'pdf' => 'application/pdf',
450 'jpg,jpeg' => 'image/jpeg',
451 'png' => 'image/png',
452 'gif' => 'image/gif',
453 'bmp' => 'image/bmp',
454 // 'svg' => 'image/svg+xml',
455 'mp3' => 'audio/mpeg',
456 'wav' => 'audio/wav',
457 'flac' => 'audio/flac',
458 'aac' => 'audio/aac',
459 'wma' => 'audio/x-ms-wma',
460 'mp4' => 'video/mp4',
461 'avi' => 'video/avi',
462 'mkv' => 'video/x-matroska',
463 'mov' => 'video/quicktime',
464 'wmv' => 'video/x-ms-wmv',
465 'xls,xlsx' => 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
466 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
467 'csv' => 'text/csv',
468 'numbers' => 'application/vnd.apple.numbers',
469 'tsv' => 'text/tab-separated-values',
470 'zip' => 'application/zip,application/octet-stream,application/x-zip-compressed,multipart/x-zip',
471 );
472 }
473
474 /**
475 * Check theme support load courses ajax
476 *
477 * @return bool
478 * @since 4.2.3.3
479 * @version 1.0.0
480 */
481 public static function theme_no_support_load_courses_ajax(): bool {
482 $theme_no_load_ajax = apply_filters(
483 'lp/page/courses/themes/no_load_ajax',
484 [
485 'Coaching',
486 'Course Builder',
487 'eLearningWP',
488 'Ivy School',
489 'StarKid',
490 'Academy LMS',
491 'Coaching Child',
492 'Course Builder Child',
493 'eLearningWP Child',
494 'Ivy School Child',
495 'StarKid Child',
496 'Academy LMS Child',
497 ]
498 );
499 $theme_current = wp_get_theme()->get( 'Name' );
500
501 return in_array( $theme_current, $theme_no_load_ajax );
502 }
503
504 /**
505 * Check theme support load courses ajax
506 *
507 * @return string
508 * @version 1.0.0
509 * @since 4.2.3.3
510 */
511 public static function get_permalink_single_course(): string {
512 $course_slug_default = 'courses';
513 try {
514 $course_slug = self::get_option( 'course_base', 'courses' );
515 if ( empty( $course_slug ) ) {
516 $course_slug = $course_slug_default;
517 }
518 $course_slug = preg_replace( '!^/!', '', $course_slug );
519 } catch ( Throwable $e ) {
520 $course_slug = $course_slug_default;
521 }
522
523 return $course_slug;
524 }
525
526 /**
527 * Check theme support load courses ajax
528 *
529 * @return array
530 * @version 1.0.0
531 * @since 4.2.3.3
532 */
533 public static function get_course_items_slug(): array {
534 /**
535 * Set rule item course.
536 *
537 * Use urldecode to convert an encoded string to normal.
538 * This fixed the issue with custom slug of lesson/quiz in some languages
539 * Eg: урока
540 */
541 $lesson_slug = urldecode( sanitize_title_with_dashes( self::get_option( 'lesson_slug', 'lessons' ) ) );
542 $quiz_slug = urldecode( sanitize_title_with_dashes( self::get_option( 'quiz_slug', 'quizzes' ) ) );
543
544 return apply_filters(
545 'learn-press/course-item-slugs/for-rewrite-rules',
546 array(
547 LP_LESSON_CPT => $lesson_slug,
548 LP_QUIZ_CPT => $quiz_slug,
549 )
550 );
551 }
552
553 /**
554 * Return url lp-ajax.php
555 *
556 * @return string
557 * @since 4.2.7.6
558 * @version 1.0.1
559 */
560 public static function url_handle_lp_ajax(): string {
561 return home_url( 'lp-ajax-handle' );
562 }
563
564 /**
565 * Check if instructor access to WordPress admin screens is restricted
566 *
567 * When enabled, instructors are redirected away from most wp-admin pages
568 * and continue their work in Course Builder instead. Administrators keep full access.
569 *
570 * @return bool True if instructor access is restricted, false otherwise
571 * @since 4.3.6
572 * @version 1.0.0
573 */
574 public static function is_hide_instructor_access_admin_screen(): bool {
575 return self::get_option( 'hide_instructor_access_admin_screen', 'no' ) === 'yes';
576 }
577 }
578
579 LP_Settings::instance();
580