PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.9
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.9
4.4.9 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 All 140 releases
← All changes | inc/class-lp-install.php +410 -352 4.3.9.1 → 4.4.9 View file →
@@ -1,352 +1,410 @@
1 -<?php
2 -/**
3 - * Install and update functions.
4 - *
5 - * @author ThimPress
6 - * @package LearnPress/Classes
7 - * @version 3.0.1
8 - */
9 -
10 -use LearnPress\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 - protected $lp_db;
22 - /**
23 - * Default pages used by LP
24 - *
25 - * @var array
26 - */
27 - private static $_pages = array(
28 - 'checkout',
29 - 'profile',
30 - 'courses',
31 - 'instructors',
32 - 'single_instructor',
33 - 'become_a_teacher',
34 - 'term_conditions',
35 - );
36 -
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 - // Set roles and capabilities.
68 - learn_press_add_user_roles();
69 -
70 - ini_set( 'max_execution_time', LearnPress::$time_limit_default_of_sever );
71 - }
72 -
73 - /**
74 - * Get instance
75 - *
76 - * @return LP_Install
77 - */
78 - public static function instance(): self {
79 - if ( ! self::$instance ) {
80 - self::$instance = new self();
81 - }
82 -
83 - return self::$instance;
84 - }
85 -
86 - /**
87 - * Do something after LP is activated.
88 - *
89 - * @since 4.0.0
90 - */
91 - public function on_activate() {
92 - $this->create_tables();
93 -
94 - if ( ! self::tables_install_done() ) {
95 - return;
96 - }
97 -
98 - // Check if LP install before has db version
99 - if ( ! get_option( LP_KEY_DB_VERSION, false ) ) {
100 - // Save database version of LP
101 - update_option( LP_KEY_DB_VERSION, LearnPress::instance()->db_version );
102 - }
103 -
104 - // Create pages default.
105 - self::create_pages();
106 -
107 - // Set permalink is "Post name".
108 - if ( ! get_option( 'permalink_structure' ) ) {
109 - update_option( 'permalink_structure', '/%postname%/' );
110 - // flush_rewrite_rules();
111 - }
112 -
113 - // Force option users_can_register to ON.
114 - /*if ( ! get_option( 'users_can_register' ) ) {
115 - update_option( 'users_can_register', 1 );
116 - }*/
117 - }
118 -
119 - /**
120 - * Create tables required for LP
121 - */
122 - private function create_tables() {
123 - try {
124 - $tables = Config::instance()->get( 'tables-v4', 'table' );
125 - foreach ( $tables as $table ) {
126 - LP_Database::getInstance()->wpdb->query( $table );
127 - }
128 -
129 - if ( ! LP_Settings::is_created_tb_thim_cache() ) {
130 - $this->create_table_thim_cache();
131 - }
132 -
133 - if ( ! LP_Settings::is_created_tb_material_files() ) {
134 - $this->create_table_learnpress_files();
135 - }
136 -
137 - // Ensure MCP API keys table exists for activation/upgrade flows.
138 - // Keep this explicit guard in addition to tables-v4 config loading.
139 - if ( ! LP_Settings::is_created_tb_mcp_api_keys() ) {
140 - $this->create_table_mcp_api_keys();
141 - }
142 -
143 - update_option( 'learn_press_check_tables', 'yes' );
144 - } catch ( Throwable $e ) {
145 - error_log( $e->getMessage() );
146 - }
147 - }
148 -
149 - /**
150 - * Create table thim_cache
151 - *
152 - * @since 4.2.2
153 - */
154 - private function create_table_thim_cache() {
155 - global $wpdb;
156 -
157 - try {
158 - $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
159 -
160 - $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_thim_cache} (
161 - key_cache VARCHAR (191) NOT NULL UNIQUE,
162 - value LONGTEXT NOT NULL,
163 - expiration VARCHAR (191),
164 - PRIMARY KEY (key_cache)
165 - ) $collation";
166 -
167 - $rs = $wpdb->query( $sql );
168 -
169 - if ( $rs ) {
170 - update_option( 'thim_cache_tb_created', 'yes' );
171 - }
172 - } catch ( Throwable $e ) {
173 - error_log( $e->getMessage() );
174 - }
175 - }
176 -
177 - /**
178 - * Create table learnpress_courses
179 - *
180 - * @since 4.2.6.9
181 - */
182 - public function create_table_courses() {
183 - global $wpdb;
184 -
185 - try {
186 - $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
187 -
188 - $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_lp_courses} (
189 - ID bigint(20) unsigned NOT NULL,
190 - json LONGTEXT NOT NULL,
191 - price_to_sort FLOAT,
192 - is_sale int(1) default 0,
193 - post_author bigint unsigned,
194 - post_date_gmt datetime,
195 - post_content LONGTEXT,
196 - post_title text not null,
197 - post_status varchar(20) default 'publish' not null,
198 - post_name varchar(200) default '',
199 - menu_order int default 0,
200 - lang varchar(20),
201 - PRIMARY KEY (ID),
202 - KEY post_title (post_title(191)),
203 - KEY post_status (post_status),
204 - KEY post_name (post_name(191)),
205 - KEY id_status (ID, post_status)
206 - ) $collation";
207 -
208 - $rs = $wpdb->query( $sql );
209 -
210 - if ( $rs ) {
211 - update_option( 'tb_learnpress_courses', 'yes' );
212 - }
213 - } catch ( Throwable $e ) {
214 - error_log( $e->getMessage() );
215 - }
216 - }
217 -
218 - /**
219 - * Create table learnpress_material_files
220 - *
221 - * @since 4.2.6.6
222 - */
223 - private function create_table_learnpress_files() {
224 - global $wpdb;
225 -
226 - try {
227 - $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
228 -
229 - $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_lp_files} (
230 - file_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
231 - file_name varchar(191) NOT NULL DEFAULT '',
232 - file_type varchar(100) NOT NULL DEFAULT '',
233 - item_id bigint(20) unsigned NOT NULL DEFAULT '0',
234 - item_type varchar(100) NOT NULL DEFAULT '',
235 - method varchar(10) NOT NULL DEFAULT 'upload',
236 - file_path varchar(255) NOT NULL DEFAULT '',
237 - orders int(4) NOT NULL DEFAULT '0',
238 - created_at datetime NULL DEFAULT NULL,
239 - PRIMARY KEY (file_id),
240 - KEY file_name (file_name),
241 - KEY item_id (item_id),
242 - KEY item_type (item_type)
243 - ) $collation";
244 -
245 - $rs = $wpdb->query( $sql );
246 -
247 - if ( $rs ) {
248 - update_option( 'table_learnpress_files_created', 'yes' );
249 - }
250 - } catch ( Throwable $e ) {
251 - error_log( $e->getMessage() );
252 - }
253 - }
254 -
255 - /**
256 - * Create table learnpress_mcp_api_keys.
257 - *
258 - * @since 4.3.3
259 - * @return void
260 - */
261 - public function create_table_mcp_api_keys() {
262 - global $wpdb;
263 -
264 - try {
265 - $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
266 -
267 - $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_lp_mcp_api_keys} (
268 - key_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
269 - user_id bigint(20) unsigned NOT NULL,
270 - description varchar(200) NULL DEFAULT NULL,
271 - permissions varchar(10) NOT NULL DEFAULT 'read',
272 - consumer_key char(64) NOT NULL,
273 - consumer_secret char(64) NOT NULL,
274 - truncated_key char(7) NOT NULL,
275 - last_access datetime NULL DEFAULT NULL,
276 - call_count bigint(20) unsigned NOT NULL DEFAULT 0,
277 - created_at datetime NOT NULL,
278 - updated_at datetime NULL DEFAULT NULL,
279 - PRIMARY KEY (key_id),
280 - UNIQUE KEY consumer_key (consumer_key),
281 - KEY user_id (user_id)
282 - ) $collation";
283 -
284 - $wpdb->query( $sql );
285 - } catch ( Throwable $e ) {
286 - error_log( $e->getMessage() );
287 - }
288 - }
289 -
290 - /**
291 - * Create default pages for LP
292 - */
293 - public static function create_pages() {
294 - $pages = self::$_pages;
295 -
296 - try {
297 - foreach ( $pages as $page ) {
298 - // Check if page has already existed
299 - $page_id = get_option( "learn_press_{$page}_page_id", false );
300 -
301 - if ( $page_id && get_post_type( $page_id ) === 'page' && get_post_status( $page_id ) == 'publish' ) {
302 - continue;
303 - }
304 -
305 - if ( $page === 'courses' ) {
306 - $page_title = 'Courses';
307 - $page_slug = $page;
308 - } elseif ( 'single_instructor' === $page ) {
309 - $page_title = 'Instructor';
310 - $page_slug = 'instructor';
311 - } elseif ( 'instructors' === $page ) {
312 - $page_title = 'Instructors';
313 - $page_slug = $page;
314 - } elseif ( 'become_a_teacher' === $page ) {
315 - $page_title = 'Become an Instructor';
316 - $page_slug = $page;
317 - } elseif ( 'term_conditions' === $page ) {
318 - $page_title = 'Terms and Conditions';
319 - $page_slug = $page;
320 - } else {
321 - $page_title = ucwords( str_replace( '_', ' ', $page ) );
322 - $page_slug = 'lp-' . str_replace( '_', '-', $page );
323 - }
324 -
325 - $data_create_page = array(
326 - 'post_title' => $page_title,
327 - 'post_name' => $page_slug,
328 - );
329 - LP_Helper::create_page( $data_create_page, "learn_press_{$page}_page_id" );
330 - }
331 -
332 - flush_rewrite_rules();
333 - } catch ( Exception $ex ) {
334 - error_log( $ex->getMessage() );
335 - }
336 - }
337 -
338 - /**
339 - * Check installed all tables required for LearnPress.
340 - *
341 - * @return bool
342 - */
343 - public function tables_install_done(): bool {
344 - $install_done = get_option( 'learn_press_check_tables', 'no' );
345 - if ( is_multisite() && 'yes' !== $install_done ) {
346 - $this->create_tables();
347 - }
348 -
349 - return $install_done;
350 - }
351 - }
352 -}
1 +<?php
2 +/**
3 + * Install and update functions.
4 + *
5 + * @author ThimPress
6 + * @package LearnPress/Classes
7 + * @version 3.0.1
8 + */
9 +
10 +use LearnPress\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 + protected $lp_db;
22 + /**
23 + * Default pages used by LP
24 + *
25 + * @var array
26 + */
27 + private static $_pages = array(
28 + 'checkout',
29 + 'profile',
30 + 'courses',
31 + 'instructors',
32 + 'single_instructor',
33 + 'become_a_teacher',
34 + 'term_conditions',
35 + );
36 +
37 + protected function __construct() {
38 + $this->lp_db = LP_Database::getInstance();
39 + ini_set( 'max_execution_time', HOUR_IN_SECONDS );
40 + // From LP v4.2.2 temporary run create table thim_cache.
41 + // After a long time, will remove this code. Only run create table when activate plugin LP.
42 + if ( ! LP_Settings::is_created_tb_thim_cache() ) {
43 + $this->create_table_thim_cache();
44 + }
45 +
46 + // From LP v4.2.6.9 temporary run create table learnpress_files.
47 + // After a long time, will remove this code. Only run create table when activate plugin LP.
48 + if ( ! LP_Settings::is_created_tb_courses() ) {
49 + $this->create_table_courses();
50 + }
51 +
52 + // From LP v4.2.6.6 temporary run create table learnpress_files.
53 + // After a long time, will remove this code. Only run create table when activate plugin LP.
54 + if ( ! LP_Settings::is_created_tb_material_files() ) {
55 + $this->create_table_learnpress_files();
56 + }
57 +
58 + // Runtime migration for MCP API keys table.
59 + if ( ! LP_Settings::is_created_tb_mcp_api_keys() ) {
60 + $this->create_table_mcp_api_keys();
61 + }
62 +
63 + // Runtime migration for Webhooks table.
64 + if ( ! LP_Settings::is_created_tb_webhooks() ) {
65 + $this->create_table_webhooks();
66 + }
67 +
68 + // Set roles and capabilities.
69 + learn_press_add_user_roles();
70 +
71 + ini_set( 'max_execution_time', LearnPress::$time_limit_default_of_sever );
72 + }
73 +
74 + /**
75 + * Get instance
76 + *
77 + * @return LP_Install
78 + */
79 + public static function instance(): self {
80 + if ( ! self::$instance ) {
81 + self::$instance = new self();
82 + }
83 +
84 + return self::$instance;
85 + }
86 +
87 + /**
88 + * Run installation tasks when LearnPress is activated.
89 + *
90 + * 1. Create required database tables.
91 + * 2. Stop here if table creation failed.
92 + * 3. Save the current database version.
93 + * 4. Register LearnPress custom post types and taxonomies.
94 + * 5. Create default pages (courses, profile, checkout, become a teacher, etc.).
95 + * 6. Set permalink structure to post name if not configured.
96 + * 7. Soft flush rewrite rules so WordPress rebuilds them with LP CPTs and pages on the next request.
97 + *
98 + * @since 4.0.0
99 + */
100 + public function on_activate() {
101 + $this->create_tables();
102 +
103 + if ( ! $this->tables_install_done() ) {
104 + return;
105 + }
106 +
107 + // Check if LP install before has db version
108 + if ( ! get_option( LP_KEY_DB_VERSION, false ) ) {
109 + // Save database version of LP
110 + update_option( LP_KEY_DB_VERSION, LearnPress::instance()->db_version );
111 + }
112 +
113 + // Register custom post type and taxonomies .
114 + include_once LP_PLUGIN_PATH . 'inc/custom-post-types/abstract.php';
115 + include_once LP_PLUGIN_PATH . 'inc/custom-post-types/course.php';
116 + include_once LP_PLUGIN_PATH . 'inc/custom-post-types/lesson.php';
117 + include_once LP_PLUGIN_PATH . 'inc/custom-post-types/quiz.php';
118 + include_once LP_PLUGIN_PATH . 'inc/custom-post-types/question.php';
119 + include_once LP_PLUGIN_PATH . 'inc/custom-post-types/order.php';
120 +
121 + // Create pages default.
122 + self::create_pages();
123 +
124 + // Set permalink is "Post name".
125 + if ( ! get_option( 'permalink_structure' ) ) {
126 + update_option( 'permalink_structure', '/%postname%/' );
127 + // flush_rewrite_rules();
128 + }
129 +
130 + // Rebuilds them with LP CPTs and pages on next request.
131 + flush_rewrite_rules();
132 +
133 + // Force option users_can_register to ON.
134 + /*if ( ! get_option( 'users_can_register' ) ) {
135 + update_option( 'users_can_register', 1 );
136 + }*/
137 + }
138 +
139 + /**
140 + * Create tables required for LP
141 + * @throws Exception
142 + */
143 + private function create_tables() {
144 + $db = LP_Database::getInstance();
145 + $tables = Config::instance()->get( 'tables-v4', 'table' );
146 + foreach ( $tables as $table ) {
147 + $db->wpdb->query( $table );
148 +
149 + $db->check_execute_has_error();
150 + }
151 +
152 + if ( ! LP_Settings::is_created_tb_thim_cache() ) {
153 + $this->create_table_thim_cache();
154 + }
155 +
156 + if ( ! LP_Settings::is_created_tb_material_files() ) {
157 + $this->create_table_learnpress_files();
158 + }
159 +
160 + // Ensure MCP API keys table exists for activation/upgrade flows.
161 + // Keep this explicit guard in addition to tables-v4 config loading.
162 + if ( ! LP_Settings::is_created_tb_mcp_api_keys() ) {
163 + $this->create_table_mcp_api_keys();
164 + }
165 +
166 + // Ensure Webhooks table exists for activation/upgrade flows.
167 + // Keep this explicit guard in addition to tables-v4 config loading.
168 + if ( ! LP_Settings::is_created_tb_webhooks() ) {
169 + $this->create_table_webhooks();
170 + }
171 +
172 + update_option( 'learn_press_check_tables', 'yes' );
173 + }
174 +
175 + /**
176 + * Create table thim_cache
177 + *
178 + * @since 4.2.2
179 + */
180 + private function create_table_thim_cache() {
181 + global $wpdb;
182 +
183 + try {
184 + $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
185 +
186 + $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_thim_cache} (
187 + key_cache VARCHAR (191) NOT NULL UNIQUE,
188 + value LONGTEXT NOT NULL,
189 + expiration VARCHAR (191),
190 + PRIMARY KEY (key_cache)
191 + ) $collation";
192 +
193 + $rs = $wpdb->query( $sql );
194 +
195 + if ( $rs ) {
196 + update_option( 'thim_cache_tb_created', 'yes' );
197 + }
198 + } catch ( Throwable $e ) {
199 + error_log( $e->getMessage() );
200 + }
201 + }
202 +
203 + /**
204 + * Create table learnpress_courses
205 + *
206 + * @since 4.2.6.9
207 + */
208 + public function create_table_courses() {
209 + global $wpdb;
210 +
211 + try {
212 + $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
213 +
214 + $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_lp_courses} (
215 + ID bigint(20) unsigned NOT NULL,
216 + json LONGTEXT NOT NULL,
217 + price_to_sort FLOAT,
218 + is_sale int(1) default 0,
219 + post_author bigint unsigned,
220 + post_date_gmt datetime,
221 + post_content LONGTEXT,
222 + post_title text not null,
223 + post_status varchar(20) default 'publish' not null,
224 + post_name varchar(200) default '',
225 + menu_order int default 0,
226 + lang varchar(20),
227 + PRIMARY KEY (ID),
228 + KEY post_title (post_title(191)),
229 + KEY post_status (post_status),
230 + KEY post_name (post_name(191)),
231 + KEY id_status (ID, post_status)
232 + ) $collation";
233 +
234 + $rs = $wpdb->query( $sql );
235 +
236 + if ( $rs ) {
237 + update_option( 'tb_learnpress_courses', 'yes' );
238 + }
239 + } catch ( Throwable $e ) {
240 + error_log( $e->getMessage() );
241 + }
242 + }
243 +
244 + /**
245 + * Create table learnpress_material_files
246 + *
247 + * @since 4.2.6.6
248 + */
249 + private function create_table_learnpress_files() {
250 + global $wpdb;
251 +
252 + try {
253 + $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
254 +
255 + $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_lp_files} (
256 + file_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
257 + file_name varchar(191) NOT NULL DEFAULT '',
258 + file_type varchar(100) NOT NULL DEFAULT '',
259 + item_id bigint(20) unsigned NOT NULL DEFAULT '0',
260 + item_type varchar(100) NOT NULL DEFAULT '',
261 + method varchar(10) NOT NULL DEFAULT 'upload',
262 + file_path varchar(255) NOT NULL DEFAULT '',
263 + orders int(4) NOT NULL DEFAULT '0',
264 + created_at datetime NULL DEFAULT NULL,
265 + PRIMARY KEY (file_id),
266 + KEY file_name (file_name),
267 + KEY item_id (item_id),
268 + KEY item_type (item_type)
269 + ) $collation";
270 +
271 + $rs = $wpdb->query( $sql );
272 +
273 + if ( $rs ) {
274 + update_option( 'table_learnpress_files_created', 'yes' );
275 + }
276 + } catch ( Throwable $e ) {
277 + error_log( $e->getMessage() );
278 + }
279 + }
280 +
281 + /**
282 + * Create table learnpress_mcp_api_keys.
283 + *
284 + * @since 4.3.3
285 + * @return void
286 + */
287 + public function create_table_mcp_api_keys() {
288 + global $wpdb;
289 +
290 + try {
291 + $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
292 +
293 + $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_lp_mcp_api_keys} (
294 + key_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
295 + user_id bigint(20) unsigned NOT NULL,
296 + description varchar(200) NULL DEFAULT NULL,
297 + permissions varchar(10) NOT NULL DEFAULT 'read',
298 + consumer_key char(64) NOT NULL,
299 + consumer_secret char(64) NOT NULL,
300 + truncated_key char(7) NOT NULL,
301 + last_access datetime NULL DEFAULT NULL,
302 + call_count bigint(20) unsigned NOT NULL DEFAULT 0,
303 + created_at datetime NOT NULL,
304 + updated_at datetime NULL DEFAULT NULL,
305 + PRIMARY KEY (key_id),
306 + UNIQUE KEY consumer_key (consumer_key),
307 + KEY user_id (user_id)
308 + ) $collation";
309 +
310 + $wpdb->query( $sql );
311 + } catch ( Throwable $e ) {
312 + error_log( $e->getMessage() );
313 + }
314 + }
315 +
316 + /**
317 + * Create table learnpress_webhooks.
318 + *
319 + * @since 4.3.3
320 + * @return void
321 + */
322 + public function create_table_webhooks() {
323 + global $wpdb;
324 +
325 + try {
326 + $collation = $wpdb->has_cap( 'collation' ) ? $wpdb->get_charset_collate() : 'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci';
327 +
328 + $sql = "CREATE TABLE IF NOT EXISTS {$this->lp_db->tb_lp_webhooks} (
329 + webhook_id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
330 + user_id bigint(20) unsigned NOT NULL DEFAULT 0,
331 + status varchar(20) NOT NULL DEFAULT 'active',
332 + name varchar(200) NOT NULL DEFAULT '',
333 + delivery_url longtext NOT NULL,
334 + secret text NOT NULL,
335 + events longtext NOT NULL,
336 + created_at datetime NOT NULL,
337 + updated_at datetime NULL DEFAULT NULL,
338 + PRIMARY KEY (webhook_id),
339 + KEY user_id (user_id),
340 + KEY status (status)
341 + ) $collation";
342 +
343 + $wpdb->query( $sql );
344 + } catch ( Throwable $e ) {
345 + error_log( $e->getMessage() );
346 + }
347 + }
348 +
349 + /**
350 + * Create default pages for LP
351 + */
352 + public static function create_pages() {
353 + $pages = self::$_pages;
354 +
355 + try {
356 + foreach ( $pages as $page ) {
357 + // Check if page has already existed
358 + $page_id = get_option( "learn_press_{$page}_page_id", false );
359 +
360 + if ( $page_id && get_post_type( $page_id ) === 'page' && get_post_status( $page_id ) == 'publish' ) {
361 + continue;
362 + }
363 +
364 + if ( $page === 'courses' ) {
365 + $page_title = 'Courses';
366 + $page_slug = $page;
367 + } elseif ( 'single_instructor' === $page ) {
368 + $page_title = 'Instructor';
369 + $page_slug = 'instructor';
370 + } elseif ( 'instructors' === $page ) {
371 + $page_title = 'Instructors';
372 + $page_slug = $page;
373 + } elseif ( 'become_a_teacher' === $page ) {
374 + $page_title = 'Become an Instructor';
375 + $page_slug = $page;
376 + } elseif ( 'term_conditions' === $page ) {
377 + $page_title = 'Terms and Conditions';
378 + $page_slug = $page;
379 + } else {
380 + $page_title = ucwords( str_replace( '_', ' ', $page ) );
381 + $page_slug = 'lp-' . str_replace( '_', '-', $page );
382 + }
383 +
384 + $data_create_page = array(
385 + 'post_title' => $page_title,
386 + 'post_name' => $page_slug,
387 + );
388 + LP_Helper::create_page( $data_create_page, "learn_press_{$page}_page_id" );
389 + }
390 + } catch ( Exception $ex ) {
391 + error_log( $ex->getMessage() );
392 + }
393 + }
394 +
395 + /**
396 + * Check installed all tables required for LearnPress.
397 + *
398 + * @return bool
399 + */
400 + public function tables_install_done(): bool {
401 + $install_done = 'yes' === get_option( 'learn_press_check_tables', 'no' );
402 + if ( ! $install_done ) {
403 + $this->create_tables();
404 + $install_done = 'yes' === get_option( 'learn_press_check_tables', 'no' );
405 + }
406 +
407 + return $install_done;
408 + }
409 + }
410 +}