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-install.php +250 -69 4.1.7.14.4.8 View file →
@@ -3,12 +3,12 @@
3 3 * Install and update functions.
4 4 *
5 5 * @author ThimPress
6 6 * @package LearnPress/Classes
7 - * @version 3.0.0
7 + * @version 3.0.1
8 8 */
9 9
10 -use LP\Helpers\Config;
10 +use LearnPress\Helpers\Config;
11 11
12 12 defined( 'ABSPATH' ) || exit();
13 13
14 14 if ( ! function_exists( 'LP_Install' ) ) {
@@ -17,16 +17,63 @@
17 17 * Class LP_Install
18 18 */
19 19 class LP_Install {
20 20 protected static $instance;
21 + protected $lp_db;
21 22 /**
22 23 * Default pages used by LP
23 24 *
24 25 * @var array
25 26 */
26 - private static $_pages = array( 'checkout', 'profile', 'courses', 'become_a_teacher', 'term_conditions' );
27 + private static $_pages = array(
28 + 'checkout',
29 + 'profile',
30 + 'courses',
31 + 'instructors',
32 + 'single_instructor',
33 + 'become_a_teacher',
34 + 'term_conditions',
35 + );
27 36
28 37 protected function __construct() {
38 + $this->lp_db = LP_Database::getInstance();
39 + // Only run on backend.
40 + if ( ! is_admin() ) {
41 + return;
42 + }
43 + ini_set( 'max_execution_time', HOUR_IN_SECONDS );
44 + // From LP v4.2.2 temporary run create table thim_cache.
45 + // After a long time, will remove this code. Only run create table when activate plugin LP.
46 + if ( ! LP_Settings::is_created_tb_thim_cache() ) {
47 + $this->create_table_thim_cache();
48 + }
49 +
50 + // From LP v4.2.6.9 temporary run create table learnpress_files.
51 + // After a long time, will remove this code. Only run create table when activate plugin LP.
52 + if ( ! LP_Settings::is_created_tb_courses() ) {
53 + $this->create_table_courses();
54 + }
55 +
56 + // From LP v4.2.6.6 temporary run create table learnpress_files.
57 + // After a long time, will remove this code. Only run create table when activate plugin LP.
58 + if ( ! LP_Settings::is_created_tb_material_files() ) {
59 + $this->create_table_learnpress_files();
60 + }
61 +
62 + // Runtime migration for MCP API keys table.
63 + if ( ! LP_Settings::is_created_tb_mcp_api_keys() ) {
64 + $this->create_table_mcp_api_keys();
65 + }
66 +
67 + // Runtime migration for Webhooks table.
68 + if ( ! LP_Settings::is_created_tb_webhooks() ) {
69 + $this->create_table_webhooks();
70 + }
71 +
72 + // Set roles and capabilities.
73 + learn_press_add_user_roles();
74 +
75 + ini_set( 'max_execution_time', LearnPress::$time_limit_default_of_sever );
29 76 }
30 77
31 78 /**
32 79 * Get instance
@@ -46,10 +93,8 @@
46 93 *
47 94 * @since 4.0.0
48 95 */
49 96 public function on_activate() {
50 - // update_option( 'learn_press_status', 'activated' );
51 -
52 97 $this->create_tables();
53 98
54 99 if ( ! self::tables_install_done() ) {
55 100 return;
@@ -70,76 +115,218 @@
70 115 // flush_rewrite_rules();
71 116 }
72 117
73 118 // Force option users_can_register to ON.
74 - if ( ! get_option( 'users_can_register' ) ) {
119 + /*if ( ! get_option( 'users_can_register' ) ) {
75 120 update_option( 'users_can_register', 1 );
121 + }*/
122 + }
123 +
124 + /**
125 + * Create tables required for LP
126 + */
127 + private function create_tables() {
128 + try {
129 + $tables = Config::instance()->get( 'tables-v4', 'table' );
130 + foreach ( $tables as $table ) {
131 + LP_Database::getInstance()->wpdb->query( $table );
132 + }
133 +
134 + if ( ! LP_Settings::is_created_tb_thim_cache() ) {
135 + $this->create_table_thim_cache();
136 + }
137 +
138 + if ( ! LP_Settings::is_created_tb_material_files() ) {
139 + $this->create_table_learnpress_files();
140 + }
141 +
142 + // Ensure MCP API keys table exists for activation/upgrade flows.
143 + // Keep this explicit guard in addition to tables-v4 config loading.
144 + if ( ! LP_Settings::is_created_tb_mcp_api_keys() ) {
145 + $this->create_table_mcp_api_keys();
146 + }
147 +
148 + // Ensure Webhooks table exists for activation/upgrade flows.
149 + // Keep this explicit guard in addition to tables-v4 config loading.
150 + if ( ! LP_Settings::is_created_tb_webhooks() ) {
151 + $this->create_table_webhooks();
152 + }
153 +
154 + update_option( 'learn_press_check_tables', 'yes' );
155 + } catch ( Throwable $e ) {
156 + error_log( $e->getMessage() );
76 157 }
77 158 }
78 159
79 160 /**
80 - * Check to run installer in the first-time LP installed.
161 + * Create table thim_cache
81 162 *
82 - * @since 3.x.x
163 + * @since 4.2.2
83 164 */
84 - public static function do_install() {
85 - if ( ! current_user_can( 'manage_options' ) ) {
86 - return;
165 + private function create_table_thim_cache() {
166 + global $wpdb;
167 +
168 + try {
169 + $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
170 +
171 + $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_thim_cache} (
172 + key_cache VARCHAR (191) NOT NULL UNIQUE,
173 + value LONGTEXT NOT NULL,
174 + expiration VARCHAR (191),
175 + PRIMARY KEY (key_cache)
176 + ) $collation";
177 +
178 + $rs = $wpdb->query( $sql );
179 +
180 + if ( $rs ) {
181 + update_option( 'thim_cache_tb_created', 'yes' );
182 + }
183 + } catch ( Throwable $e ) {
184 + error_log( $e->getMessage() );
87 185 }
186 + }
88 187
89 - $status = get_option( 'learn_press_status' );
188 + /**
189 + * Create table learnpress_courses
190 + *
191 + * @since 4.2.6.9
192 + */
193 + public function create_table_courses() {
194 + global $wpdb;
90 195
91 - switch ( $status ) {
92 - case 'activated':
93 - self::install();
94 - update_option( 'learn_press_status', 'installed' );
196 + try {
197 + $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
198 +
199 + $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_lp_courses} (
200 + ID bigint(20) unsigned NOT NULL,
201 + json LONGTEXT NOT NULL,
202 + price_to_sort FLOAT,
203 + is_sale int(1) default 0,
204 + post_author bigint unsigned,
205 + post_date_gmt datetime,
206 + post_content LONGTEXT,
207 + post_title text not null,
208 + post_status varchar(20) default 'publish' not null,
209 + post_name varchar(200) default '',
210 + menu_order int default 0,
211 + lang varchar(20),
212 + PRIMARY KEY (ID),
213 + KEY post_title (post_title(191)),
214 + KEY post_status (post_status),
215 + KEY post_name (post_name(191)),
216 + KEY id_status (ID, post_status)
217 + ) $collation";
218 +
219 + $rs = $wpdb->query( $sql );
220 +
221 + if ( $rs ) {
222 + update_option( 'tb_learnpress_courses', 'yes' );
223 + }
224 + } catch ( Throwable $e ) {
225 + error_log( $e->getMessage() );
95 226 }
96 227 }
97 228
98 229 /**
99 - * Run installation after LearnPress is activated.
230 + * Create table learnpress_material_files
100 231 *
101 - * @depecated 4.1.6.4
232 + * @since 4.2.6.6
102 233 */
103 - public static function install() {
104 - _deprecated_function( __FUNCTION__, '4.1.6.4' );
105 - /*self::create_options();
106 - self::_create_pages();
107 - self::_create_cron_jobs();
108 - self::_delete_transients();
109 - //self::_create_log_path();
110 - self::_clear_backgrounds();
234 + private function create_table_learnpress_files() {
235 + global $wpdb;
111 236
112 - $current_version = get_option( 'learnpress_version', null );
113 - $current_db_version = get_option( 'learnpress_db_version', null );
237 + try {
238 + $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
114 239
115 - // Fresh installation .
116 - if ( is_null( $current_db_version ) ) {
117 - update_option( 'learn_press_install', 'yes' );
118 - set_transient( 'lp_activation_redirect', 'yes', 60 );
240 + $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_lp_files} (
241 + file_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
242 + file_name varchar(191) NOT NULL DEFAULT '',
243 + file_type varchar(100) NOT NULL DEFAULT '',
244 + item_id bigint(20) unsigned NOT NULL DEFAULT '0',
245 + item_type varchar(100) NOT NULL DEFAULT '',
246 + method varchar(10) NOT NULL DEFAULT 'upload',
247 + file_path varchar(255) NOT NULL DEFAULT '',
248 + orders int(4) NOT NULL DEFAULT '0',
249 + created_at datetime NULL DEFAULT NULL,
250 + PRIMARY KEY (file_id),
251 + KEY file_name (file_name),
252 + KEY item_id (item_id),
253 + KEY item_type (item_type)
254 + ) $collation";
255 +
256 + $rs = $wpdb->query( $sql );
257 +
258 + if ( $rs ) {
259 + update_option( 'table_learnpress_files_created', 'yes' );
260 + }
261 + } catch ( Throwable $e ) {
262 + error_log( $e->getMessage() );
119 263 }
264 + }
120 265
121 - // Force to show notice outdated template .
122 - learn_press_delete_user_option( 'hide-notice-template-files' );
266 + /**
267 + * Create table learnpress_mcp_api_keys.
268 + *
269 + * @since 4.3.3
270 + * @return void
271 + */
272 + public function create_table_mcp_api_keys() {
273 + global $wpdb;
123 274
124 - LP_Admin_Notice::instance()->remove_dismissed_notice( array( 'outdated-template' ) );
275 + try {
276 + $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
125 277
126 - //if ( ! get_option( 'learnpress_db_version' ) ) {
127 - update_option( 'learnpress_db_version', (int) LEARNPRESS_VERSION );
128 - //}*/
278 + $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_lp_mcp_api_keys} (
279 + key_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
280 + user_id bigint(20) unsigned NOT NULL,
281 + description varchar(200) NULL DEFAULT NULL,
282 + permissions varchar(10) NOT NULL DEFAULT 'read',
283 + consumer_key char(64) NOT NULL,
284 + consumer_secret char(64) NOT NULL,
285 + truncated_key char(7) NOT NULL,
286 + last_access datetime NULL DEFAULT NULL,
287 + call_count bigint(20) unsigned NOT NULL DEFAULT 0,
288 + created_at datetime NOT NULL,
289 + updated_at datetime NULL DEFAULT NULL,
290 + PRIMARY KEY (key_id),
291 + UNIQUE KEY consumer_key (consumer_key),
292 + KEY user_id (user_id)
293 + ) $collation";
294 +
295 + $wpdb->query( $sql );
296 + } catch ( Throwable $e ) {
297 + error_log( $e->getMessage() );
298 + }
129 299 }
130 300
131 301 /**
132 - * Create tables required for LP
302 + * Create table learnpress_webhooks.
303 + *
304 + * @since 4.3.3
305 + * @return void
133 306 */
134 - private function create_tables() {
307 + public function create_table_webhooks() {
308 + global $wpdb;
309 +
135 310 try {
136 - $tables = Config::instance()->get( 'tables-v4', 'table' );
137 - foreach ( $tables as $table ) {
138 - LP_Database::getInstance()->wpdb->query( $table );
139 - }
311 + $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
140 312
141 - update_option( 'learn_press_check_tables', 'yes' );
313 + $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_lp_webhooks} (
314 + webhook_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
315 + user_id bigint(20) unsigned NOT NULL DEFAULT 0,
316 + status varchar(20) NOT NULL DEFAULT 'active',
317 + name varchar(200) NOT NULL DEFAULT '',
318 + delivery_url longtext NOT NULL,
319 + secret text NOT NULL,
320 + events longtext NOT NULL,
321 + created_at datetime NOT NULL,
322 + updated_at datetime NULL DEFAULT NULL,
323 + PRIMARY KEY (webhook_id),
324 + KEY user_id (user_id),
325 + KEY status (status)
326 + ) $collation";
327 +
328 + $wpdb->query( $sql );
142 329 } catch ( Throwable $e ) {
143 330 error_log( $e->getMessage() );
144 331 }
145 332 }
@@ -154,43 +341,37 @@
154 341 foreach ( $pages as $page ) {
155 342 // Check if page has already existed
156 343 $page_id = get_option( "learn_press_{$page}_page_id", false );
157 344
158 - if ( $page_id && get_post_type( $page_id ) == 'page' && get_post_status( $page_id ) == 'publish' ) {
345 + if ( $page_id && get_post_type( $page_id ) === 'page' && get_post_status( $page_id ) == 'publish' ) {
159 346 continue;
160 347 }
161 348
162 - //$page_id = self::_search_page( $page, $pages );
163 -
164 349 if ( $page === 'courses' ) {
165 - $page_title = 'All Courses';
350 + $page_title = 'Courses';
166 351 $page_slug = $page;
352 + } elseif ( 'single_instructor' === $page ) {
353 + $page_title = 'Instructor';
354 + $page_slug = 'instructor';
355 + } elseif ( 'instructors' === $page ) {
356 + $page_title = 'Instructors';
357 + $page_slug = $page;
358 + } elseif ( 'become_a_teacher' === $page ) {
359 + $page_title = 'Become an Instructor';
360 + $page_slug = $page;
361 + } elseif ( 'term_conditions' === $page ) {
362 + $page_title = 'Terms and Conditions';
363 + $page_slug = $page;
167 364 } else {
168 365 $page_title = ucwords( str_replace( '_', ' ', $page ) );
169 366 $page_slug = 'lp-' . str_replace( '_', '-', $page );
170 367 }
171 368
172 - if ( $page === 'profile' ) {
173 - $page_content = '<!-- wp:shortcode -->[' . apply_filters( 'learn-press/shortcode/profile/tag', 'learn_press_profile' ) . ']<!-- /wp:shortcode -->';
174 - } else {
175 - $page_content = '';
176 - }
177 -
178 - $page_id = wp_insert_post(
179 - array(
180 - 'post_title' => $page_title,
181 - 'post_name' => $page_slug,
182 - 'post_status' => 'publish',
183 - 'post_type' => 'page',
184 - 'comment_status' => 'closed',
185 - 'post_content' => $page_content ?? '',
186 - 'post_author' => get_current_user_id(),
187 - )
369 + $data_create_page = array(
370 + 'post_title' => $page_title,
371 + 'post_name' => $page_slug,
188 372 );
189 -
190 - if ( ! $page_id instanceof WP_Error ) {
191 - update_option( "learn_press_{$page}_page_id", $page_id );
192 - }
373 + LP_Helper::create_page( $data_create_page, "learn_press_{$page}_page_id" );
193 374 }
194 375
195 376 flush_rewrite_rules();
196 377 } catch ( Exception $ex ) {