PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.1.7
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.1.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-install.php

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

556 lines 13.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Install and update functions.
4 *
5 * @author ThimPress
6 * @package LearnPress/Classes
7 * @version 3.0.0
8 */
9
10 use LP\Helpers\Config;
11
12 defined( 'ABSPATH' ) || exit();
13
14 if ( ! function_exists( 'LP_Install' ) ) {
15
16 /**
17 * Class LP_Install
18 */
19 class LP_Install {
20 protected static $instance;
21 /**
22 * Default pages used by LP
23 *
24 * @var array
25 */
26 private static $_pages = array( 'checkout', 'profile', 'courses', 'become_a_teacher', 'term_conditions' );
27
28 protected function __construct() {
29 }
30
31 /**
32 * Get instance
33 *
34 * @return LP_Install
35 */
36 public static function instance(): self {
37 if ( ! self::$instance ) {
38 self::$instance = new self();
39 }
40
41 return self::$instance;
42 }
43
44 /**
45 * Init action.
46 */
47 public static function init() {
48 // add_action( 'learn-press/activate', array( __CLASS__, 'on_activate' ) );
49 // add_action( 'admin_init', array( __CLASS__, 'do_install' ) );
50 // add_action( 'admin_init', array( __CLASS__, 'subscription_button' ) );
51 }
52
53 /**
54 * Do something after LP is activated.
55 *
56 * @since 4.0.0
57 */
58 public function on_activate() {
59 // update_option( 'learn_press_status', 'activated' );
60
61 $this->create_tables();
62
63 if ( ! self::tables_install_done() ) {
64 return;
65 }
66
67 // Check if LP install before has db version
68 if ( ! get_option( LP_KEY_DB_VERSION, false ) ) {
69 // Save database version of LP
70 update_option( LP_KEY_DB_VERSION, LearnPress::instance()->db_version );
71 }
72
73 // Create pages default.
74 self::create_pages();
75
76 // Set permalink is "Post name".
77 if ( ! get_option( 'permalink_structure' ) ) {
78 update_option( 'permalink_structure', '/%postname%/' );
79 // flush_rewrite_rules();
80 }
81
82 // Force option users_can_register to ON.
83 if ( ! get_option( 'users_can_register' ) ) {
84 update_option( 'users_can_register', 1 );
85 }
86 }
87
88 /**
89 * Check to run installer in the first-time LP installed.
90 *
91 * @since 3.x.x
92 */
93 public static function do_install() {
94 if ( ! current_user_can( 'manage_options' ) ) {
95 return;
96 }
97
98 $status = get_option( 'learn_press_status' );
99
100 switch ( $status ) {
101 case 'activated':
102 self::install();
103 update_option( 'learn_press_status', 'installed' );
104 }
105 }
106
107 public static function subscription_button() {
108 // Only administrator of the site can do this
109 if ( ! current_user_can( 'administrator' ) ) {
110 return;
111 }
112
113 LP_Admin_Notice::instance()->add( 'tools/subscription-button.php', '', true, 'newsletter-button' );
114 }
115
116 /**
117 * Run installation after LearnPress is activated.
118 *
119 * @depecated 4.1.6.4
120 */
121 public static function install() {
122 _deprecated_function( __FUNCTION__, '4.1.6.4' );
123 /*self::create_options();
124 self::_create_pages();
125 self::_create_cron_jobs();
126 self::_delete_transients();
127 //self::_create_log_path();
128 self::_clear_backgrounds();
129
130 $current_version = get_option( 'learnpress_version', null );
131 $current_db_version = get_option( 'learnpress_db_version', null );
132
133 // Fresh installation .
134 if ( is_null( $current_db_version ) ) {
135 update_option( 'learn_press_install', 'yes' );
136 set_transient( 'lp_activation_redirect', 'yes', 60 );
137 }
138
139 // Force to show notice outdated template .
140 learn_press_delete_user_option( 'hide-notice-template-files' );
141
142 LP_Admin_Notice::instance()->remove_dismissed_notice( array( 'outdated-template' ) );
143
144 //if ( ! get_option( 'learnpress_db_version' ) ) {
145 update_option( 'learnpress_db_version', (int) LEARNPRESS_VERSION );
146 //}*/
147 }
148
149 protected static function _clear_backgrounds() {
150 global $wpdb;
151
152 $query = $wpdb->prepare(
153 "
154 DELETE FROM {$wpdb->options} WHERE option_name LIKE %s
155 ",
156 $wpdb->esc_like( 'lp_schedule_items_batch_' ) . '%'
157 );
158 $wpdb->query( $query );
159
160 $query = $wpdb->prepare(
161 "
162 DELETE FROM {$wpdb->options} WHERE option_name LIKE %s
163 ",
164 $wpdb->esc_like( 'lp_installer_batch_' ) . '%'
165 );
166 $wpdb->query( $query );
167 }
168
169 /**
170 * Update default options for LP
171 *
172 * @editor tungnx - comment - not use on v4.1.6.6
173 */
174 /*public static function create_options() {
175 $settings_classes = array(
176 'LP_Settings_General' => include_once LP_PLUGIN_PATH . '/inc/admin/settings/class-lp-settings-general.php',
177 'LP_Settings_Courses' => include_once LP_PLUGIN_PATH . '/inc/admin/settings/class-lp-settings-courses.php',
178 'LP_Settings_Profile' => include_once LP_PLUGIN_PATH . '/inc/admin/settings/class-lp-settings-profile.php',
179 'LP_Settings_Payments' => include_once LP_PLUGIN_PATH . '/inc/admin/settings/class-lp-settings-payments.php',
180 );
181
182 ob_start();
183 $str = array();
184
185 foreach ( $settings_classes as $c => $class ) {
186 if ( ! is_object( $class ) ) {
187 $class = @new $c();
188 }
189
190 $options = array();
191
192 if ( is_callable( array( $class, 'get_settings' ) ) ) {
193 $options = $class->get_settings( '', '' );
194 }
195
196 if ( ! $options ) {
197 continue;
198 }
199
200 foreach ( $options as $option ) {
201 if ( ! isset( $option['id'] ) ) {
202 continue;
203 }
204
205 $default_value = '';
206
207 if ( array_key_exists( 'default', $option ) ) {
208 $default_value = $option['default'];
209 } elseif ( array_key_exists( 'std', $option ) ) {
210 $default_value = $option['std'];
211 }
212
213 if ( $default_value === '' || $default_value === null ) {
214 continue;
215 }
216
217 if ( ! preg_match( '~^learn_press_~', $option['id'] ) ) {
218 $option_name = 'learn_press_' . $option['id'];
219 } else {
220 $option_name = $option['id'];
221 }
222
223 // Don't update existing option
224 if ( false !== get_option( $option_name ) ) {
225 continue;
226 }
227
228 // If option name doesn't like an array then update directly.
229 if ( ! preg_match( '/\[|\]/', $option_name ) ) {
230 update_option( $option_name, $default_value, 'yes' );
231 continue;
232 }
233
234 // Concat option as query string to parse it later
235 $value = maybe_serialize( $default_value );
236 $str[] = "{$option_name}=$value";
237 }
238 }
239
240 // Parse query string to get options
241 if ( $str ) {
242 $str = join( '&', $str );
243 $options = array();
244 parse_str( $str, $options );
245
246 if ( $options ) {
247 foreach ( $options as $name => $value ) {
248 $value = LP_Helper::maybe_unserialize( $value );
249 update_option( $name, $value, 'yes' );
250 }
251 }
252 }
253
254 ob_get_clean();
255 }*/
256
257 /**
258 * Create tables required for LP
259 */
260 private function create_tables() {
261 try {
262 $tables = Config::instance()->get( 'tables-v4', 'table' );
263 foreach ( $tables as $table ) {
264 LP_Database::getInstance()->wpdb->query( $table );
265 }
266
267 update_option( 'learn_press_check_tables', 'yes' );
268 } catch ( Throwable $e ) {
269 error_log( $e->getMessage() );
270 }
271 }
272
273 /**
274 * Delete transients
275 */
276 private static function _delete_transients() {
277 global $wpdb;
278 $sql = "
279 DELETE a, b FROM $wpdb->options a, $wpdb->options b
280 WHERE a.option_name LIKE %s
281 AND a.option_name NOT LIKE %s
282 AND b.option_name = CONCAT( '_transient_timeout_', SUBSTRING( a.option_name, 12 ) )
283 AND b.option_value < %d
284 ";
285 $wpdb->query(
286 $wpdb->prepare(
287 $sql,
288 $wpdb->esc_like( '_transient_' ) . '%',
289 $wpdb->esc_like( '_transient_timeout_' ) . '%',
290 time()
291 )
292 );
293 }
294
295 /**
296 * Remove learnpress page if total of learn page > 10
297 *
298 * @return mixed
299 * @depecated 4.1.6.4
300 */
301 /*public static function _remove_pages() {
302 global $wpdb;
303
304 // Get all pages
305 $sql = $wpdb->prepare(
306 "
307 SELECT *
308 FROM {$wpdb->posts} p
309 INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key= %s AND p.post_type = %s
310 ",
311 '_learn_press_page',
312 'page'
313 );
314
315 $page_ids = $wpdb->get_col( $sql );
316
317 if ( sizeof( $page_ids ) < 10 ) {
318 return $page_ids;
319 }
320
321 // Delete pages
322 $query = $wpdb->prepare(
323 "
324 DELETE FROM p, pm
325 USING {$wpdb->posts} AS p LEFT JOIN {$wpdb->postmeta} AS pm ON p.ID = pm.post_id AND p.post_type = %s
326 WHERE p.post_status = %s
327 AND p.ID IN(" . implode( ',', $page_ids ) . ')
328 ',
329 'page',
330 'publish'
331 );
332
333 $wpdb->query( $query );
334
335 $pages = self::$_pages;
336 foreach ( $pages as $page ) {
337 delete_option( "learn_press_{$page}_page_id" );
338 }
339
340 return array();
341 }*/
342
343 /**
344 * Create default pages for LP
345 */
346 /*public static function _create_pages() {
347 global $wpdb;
348
349 // Just delete duplicated pages
350 $created_page = self::_remove_pages();
351 $pages = self::$_pages;
352
353 foreach ( $pages as $page ) {
354 // If page already existed
355 $page_id = get_option( "learn_press_{$page}_page_id" );
356
357 if ( $page_id && get_post_type( $page_id ) == 'page' && get_post_status( $page_id ) == 'publish' ) {
358 continue;
359 }
360
361 $page_id = self::_search_page( $page, $pages );
362
363 if ( ! $page_id ) {
364 // Check if page has already existed
365 switch ( $page ) {
366 case 'courses':
367 $_lpr_settings_pages = (array) get_option( '_lpr_settings_pages' );
368
369 if ( ! empty( $_lpr_settings_pages['general'] ) ) {
370 if ( ! empty( $_lpr_settings_pages['general']['courses_page_id'] ) ) {
371 $page_id = $_lpr_settings_pages['general']['courses_page_id'];
372 }
373 }
374 break;
375 case 'profile':
376 $_lpr_settings_general = (array) get_option( '_lpr_settings_general' );
377 if ( ! empty( $_lpr_settings_general['set_page'] ) && $_lpr_settings_general['set_page'] == 'lpr_profile' ) {
378 $page_id = $wpdb->get_var(
379 $wpdb->prepare(
380 "
381 SELECT ID
382 FROM $wpdb->posts p
383 INNER JOIN $wpdb->postmeta pm ON p.ID = pm.post_id AND pm.meta_key = %s AND pm.meta_value = %d
384 ",
385 '_lpr_is_profile_page',
386 1
387 )
388 );
389 }
390 break;
391 }
392
393 if ( ! $page_id ) {
394 if ( $page === 'courses' ) {
395 $page_title = 'All Courses';
396 } else {
397 $page_title = ucwords( str_replace( '_', ' ', $page ) );
398 }
399
400 if ( $page === 'profile' ) {
401 $page_content = '<!-- wp:shortcode -->[' . apply_filters( 'learn-press/shortcode/profile/tag', 'learn_press_profile' ) . ']<!-- /wp:shortcode -->';
402 } else {
403 $page_content = '';
404 }
405
406 $page_slug = 'lp-' . str_replace( '_', '-', $page );
407
408 $inserted = wp_insert_post(
409 array(
410 'post_title' => $page_title,
411 'post_name' => $page_slug,
412 'post_status' => 'publish',
413 'post_type' => 'page',
414 'comment_status' => 'closed',
415 'post_content' => isset( $page_content ) ? $page_content : '',
416 'post_author' => get_current_user_id(),
417 )
418 );
419 if ( $inserted ) {
420 $page_id = $inserted;
421 }
422 }
423 }
424 if ( $page_id ) {
425 update_option( "learn_press_{$page}_page_id", $page_id );
426 update_post_meta( $page_id, '_learn_press_page', $page );
427 }
428 }
429
430 flush_rewrite_rules();
431 }*/
432
433 /**
434 * Create default pages for LP
435 */
436 public static function create_pages() {
437 $pages = self::$_pages;
438
439 try {
440 foreach ( $pages as $page ) {
441 // Check if page has already existed
442 $page_id = get_option( "learn_press_{$page}_page_id", false );
443
444 if ( $page_id && get_post_type( $page_id ) == 'page' && get_post_status( $page_id ) == 'publish' ) {
445 continue;
446 }
447
448 //$page_id = self::_search_page( $page, $pages );
449
450 if ( $page === 'courses' ) {
451 $page_title = 'All Courses';
452 $page_slug = $page;
453 } else {
454 $page_title = ucwords( str_replace( '_', ' ', $page ) );
455 $page_slug = 'lp-' . str_replace( '_', '-', $page );
456 }
457
458 if ( $page === 'profile' ) {
459 $page_content = '<!-- wp:shortcode -->[' . apply_filters( 'learn-press/shortcode/profile/tag', 'learn_press_profile' ) . ']<!-- /wp:shortcode -->';
460 } else {
461 $page_content = '';
462 }
463
464 $page_id = wp_insert_post(
465 array(
466 'post_title' => $page_title,
467 'post_name' => $page_slug,
468 'post_status' => 'publish',
469 'post_type' => 'page',
470 'comment_status' => 'closed',
471 'post_content' => $page_content ?? '',
472 'post_author' => get_current_user_id(),
473 )
474 );
475
476 if ( ! $page_id instanceof WP_Error ) {
477 update_option( "learn_press_{$page}_page_id", $page_id );
478 }
479 }
480
481 flush_rewrite_rules();
482 } catch ( Exception $ex ) {
483 error_log( $ex->getMessage() );
484 }
485 }
486
487 /**
488 * Search LP page to see if they are already created.
489 *
490 * @param $type
491 * @param $types
492 *
493 * @return int|mixed
494 * @depecated 4.1.6.4
495 */
496 /*protected static function _search_page( $type, $types ) {
497 static $pages = array();
498
499 if ( empty( $pages[ $type ] ) ) {
500 global $wpdb;
501 $in_types = array_fill( 0, sizeof( $types ), '%s' );
502 $args = array( '_learn_press_page' );
503 $args = array_merge( $args, $types );
504 $args[] = 'publish';
505 $query = $wpdb->prepare(
506 "
507 SELECT ID, pm.meta_value as type
508 FROM {$wpdb->posts} p
509 INNER JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID AND pm.meta_key = %s AND pm.meta_value IN(" . join( ',',
510 $in_types ) . ')
511 WHERE p.post_status = %s
512 ',
513 $args
514 );
515
516 if ( $rows = $wpdb->get_results( $query ) ) {
517 foreach ( $rows as $row ) {
518 $pages[ $row->type ] = $row->ID;
519 }
520 }
521 }
522
523 $page_id = ! empty( $pages[ $type ] ) ? $pages[ $type ] : 0;
524
525 return $page_id;
526 }*/
527
528 /**
529 * @depecated 4.1.6.4
530 */
531 private static function _create_cron_jobs() {
532 _deprecated_function( __FUNCTION__, '4.1.6.4' );
533 wp_clear_scheduled_hook( 'learn_press_cleanup_sessions' );
534 wp_schedule_event(
535 time(),
536 apply_filters( 'learn_press_cleanup_session_recurrence', 'twicedaily' ),
537 'learn_press_cleanup_sessions'
538 );
539 }
540
541 /**
542 * Check installed all tables required for LearnPress.
543 *
544 * @return bool
545 */
546 public function tables_install_done(): bool {
547 $install_done = get_option( 'learn_press_check_tables', 'no' );
548 if ( is_multisite() && 'yes' !== $install_done ) {
549 $this->create_tables();
550 }
551
552 return $install_done;
553 }
554 }
555 }
556