PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.8
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.8
4.4.8 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 All 139 releases
← All changes | inc/class-lp-settings.php +579 -569 4.3.9.14.4.8 View file →
@@ -1,569 +1,579 @@
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 - public static function lp_material_file_types(): array {
434 - return array(
435 - 'txt' => 'text/plain',
436 - 'doc,docx' => 'application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document',
437 - 'odt' => 'application/vnd.oasis.opendocument.text',
438 - 'rtf' => 'application/rtf',
439 - 'pdf' => 'application/pdf',
440 - 'jpg,jpeg' => 'image/jpeg',
441 - 'png' => 'image/png',
442 - 'gif' => 'image/gif',
443 - 'bmp' => 'image/bmp',
444 - // 'svg' => 'image/svg+xml',
445 - 'mp3' => 'audio/mpeg',
446 - 'wav' => 'audio/wav',
447 - 'flac' => 'audio/flac',
448 - 'aac' => 'audio/aac',
449 - 'wma' => 'audio/x-ms-wma',
450 - 'mp4' => 'video/mp4',
451 - 'avi' => 'video/avi',
452 - 'mkv' => 'video/x-matroska',
453 - 'mov' => 'video/quicktime',
454 - 'wmv' => 'video/x-ms-wmv',
455 - 'xls,xlsx' => 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
456 - 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
457 - 'csv' => 'text/csv',
458 - 'numbers' => 'application/vnd.apple.numbers',
459 - 'tsv' => 'text/tab-separated-values',
460 - 'zip' => 'application/zip,application/octet-stream,application/x-zip-compressed,multipart/x-zip',
461 - );
462 - }
463 -
464 - /**
465 - * Check theme support load courses ajax
466 - *
467 - * @return bool
468 - * @since 4.2.3.3
469 - * @version 1.0.0
470 - */
471 - public static function theme_no_support_load_courses_ajax(): bool {
472 - $theme_no_load_ajax = apply_filters(
473 - 'lp/page/courses/themes/no_load_ajax',
474 - [
475 - 'Coaching',
476 - 'Course Builder',
477 - 'eLearningWP',
478 - 'Ivy School',
479 - 'StarKid',
480 - 'Academy LMS',
481 - 'Coaching Child',
482 - 'Course Builder Child',
483 - 'eLearningWP Child',
484 - 'Ivy School Child',
485 - 'StarKid Child',
486 - 'Academy LMS Child',
487 - ]
488 - );
489 - $theme_current = wp_get_theme()->get( 'Name' );
490 -
491 - return in_array( $theme_current, $theme_no_load_ajax );
492 - }
493 -
494 - /**
495 - * Check theme support load courses ajax
496 - *
497 - * @return string
498 - * @version 1.0.0
499 - * @since 4.2.3.3
500 - */
501 - public static function get_permalink_single_course(): string {
502 - $course_slug_default = 'courses';
503 - try {
504 - $course_slug = self::get_option( 'course_base', 'courses' );
505 - if ( empty( $course_slug ) ) {
506 - $course_slug = $course_slug_default;
507 - }
508 - $course_slug = preg_replace( '!^/!', '', $course_slug );
509 - } catch ( Throwable $e ) {
510 - $course_slug = $course_slug_default;
511 - }
512 -
513 - return $course_slug;
514 - }
515 -
516 - /**
517 - * Check theme support load courses ajax
518 - *
519 - * @return array
520 - * @version 1.0.0
521 - * @since 4.2.3.3
522 - */
523 - public static function get_course_items_slug(): array {
524 - /**
525 - * Set rule item course.
526 - *
527 - * Use urldecode to convert an encoded string to normal.
528 - * This fixed the issue with custom slug of lesson/quiz in some languages
529 - * Eg: урока
530 - */
531 - $lesson_slug = urldecode( sanitize_title_with_dashes( self::get_option( 'lesson_slug', 'lessons' ) ) );
532 - $quiz_slug = urldecode( sanitize_title_with_dashes( self::get_option( 'quiz_slug', 'quizzes' ) ) );
533 -
534 - return apply_filters(
535 - 'learn-press/course-item-slugs/for-rewrite-rules',
536 - array(
537 - LP_LESSON_CPT => $lesson_slug,
538 - LP_QUIZ_CPT => $quiz_slug,
539 - )
540 - );
541 - }
542 -
543 - /**
544 - * Return url lp-ajax.php
545 - *
546 - * @return string
547 - * @since 4.2.7.6
548 - * @version 1.0.1
549 - */
550 - public static function url_handle_lp_ajax(): string {
551 - return home_url( 'lp-ajax-handle' );
552 - }
553 -
554 - /**
555 - * Check if instructor access to WordPress admin screens is restricted
556 - *
557 - * When enabled, instructors are redirected away from most wp-admin pages
558 - * and continue their work in Course Builder instead. Administrators keep full access.
559 - *
560 - * @return bool True if instructor access is restricted, false otherwise
561 - * @since 4.3.6
562 - * @version 1.0.0
563 - */
564 - public static function is_hide_instructor_access_admin_screen(): bool {
565 - return self::get_option( 'hide_instructor_access_admin_screen', 'no' ) === 'yes';
566 - }
567 -}
568 -
569 -LP_Settings::instance();
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();