PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.8.1
Tutor LMS – eLearning and online course solution v3.8.1
3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / classes / Upgrader.php
tutor / classes Last commit date
Addons.php 11 months ago Admin.php 9 months ago Ajax.php 1 year ago Announcements.php 1 year ago Assets.php 10 months ago Backend_Page_Trait.php 1 year ago BaseController.php 1 year ago Config.php 11 months ago Container.php 11 months ago Course.php 9 months ago Course_Embed.php 3 years ago Course_Filter.php 1 year ago Course_List.php 10 months ago Course_Settings_Tabs.php 1 year ago Course_Widget.php 1 year ago Custom_Validation.php 3 years ago Dashboard.php 1 year ago Earnings.php 1 year ago FormHandler.php 2 years ago Frontend.php 1 year ago Gutenberg.php 1 year ago Icon.php 9 months ago Input.php 1 year ago Instructor.php 1 year ago Instructors_List.php 11 months ago Lesson.php 10 months ago Options_V2.php 9 months ago Permalink.php 2 years ago Post_types.php 1 year ago Private_Course_Access.php 1 year ago Q_And_A.php 10 months ago Question_Answers_List.php 11 months ago Quiz.php 9 months ago QuizBuilder.php 11 months ago Quiz_Attempts_List.php 9 months ago RestAPI.php 2 years ago Reviews.php 9 months ago Rewrite_Rules.php 2 years ago Shortcode.php 9 months ago Singleton.php 1 year ago Student.php 1 year ago Students_List.php 1 year ago Taxonomies.php 1 year ago Template.php 9 months ago Theme_Compatibility.php 3 years ago Tools.php 1 year ago Tools_V2.php 1 year ago Tutor.php 9 months ago TutorEDD.php 1 year ago Tutor_Base.php 2 years ago Tutor_Setup.php 1 year ago Upgrader.php 9 months ago User.php 1 year ago Utils.php 9 months ago Video_Stream.php 3 years ago WhatsNew.php 9 months ago Withdraw.php 1 year ago Withdraw_Requests_List.php 11 months ago WooCommerce.php 9 months ago
Upgrader.php
394 lines
1 <?php
2 /**
3 * Tutor up grader
4 *
5 * @package Tutor\UpGrader
6 * @author Themeum <support@themeum.com>
7 * @link https://themeum.com
8 * @since 1.0.0
9 */
10
11 namespace TUTOR;
12
13 use Tutor\Ecommerce\CartController;
14 use Tutor\Ecommerce\CheckoutController;
15 use Tutor\Helpers\QueryHelper;
16
17 if ( ! defined( 'ABSPATH' ) ) {
18 exit;
19 }
20
21 /**
22 * Manage up grade
23 *
24 * @since 1.0.0
25 */
26 class Upgrader {
27
28 /**
29 * Installed version number
30 *
31 * @since 2.6.0
32 *
33 * @var string
34 */
35 public $installed_version;
36
37 /**
38 * Register hooks
39 *
40 * @since 1.0.0
41 */
42 public function __construct() {
43 $this->installed_version = get_option( 'tutor_version' );
44
45 add_action( 'admin_init', array( $this, 'init_upgrader' ) );
46
47 /**
48 * Installing Gradebook Addon from TutorPro
49 */
50 add_action( 'tutor_addon_before_enable_tutor-pro/addons/gradebook/gradebook.php', array( $this, 'install_gradebook' ) );
51 add_action( 'tutor_addon_before_enable_tutor-pro/addons/tutor-email/tutor-email.php', array( $this, 'install_tutor_email_queue' ) );
52 add_action( 'upgrader_process_complete', array( $this, 'init_email_table_deployment' ), 10, 2 );
53 }
54
55 /**
56 * Init up grader
57 *
58 * @since 1.0.0
59 *
60 * @return void
61 */
62 public function init_upgrader() {
63 $upgrades = $this->available_upgrades();
64
65 if ( tutor_utils()->count( $upgrades ) ) {
66 foreach ( $upgrades as $upgrade ) {
67 $this->{$upgrade}();
68 }
69 }
70 }
71
72 /**
73 * Check availability
74 *
75 * @since 1.0.0
76 *
77 * @return array
78 */
79 public function available_upgrades() {
80 $version = get_option( 'tutor_version' );
81
82 $upgrades = array();
83 if ( $version ) {
84 // Required to use dbDelta.
85 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
86
87 $upgrades[] = 'upgrade_to_1_3_1';
88 $upgrades[] = 'upgrade_to_2_6_0';
89 $upgrades[] = 'upgrade_to_3_0_0';
90 $upgrades[] = 'upgrade_to_3_7_1';
91 $upgrades[] = 'upgrade_to_3_8_0';
92 }
93
94 return $upgrades;
95 }
96
97 /**
98 * Upgrade to version 1.3.1
99 *
100 * @since 1.0.0
101 *
102 * @return void
103 */
104 public function upgrade_to_1_3_1() {
105 if ( version_compare( get_option( 'tutor_version' ), '1.3.1', '<' ) ) {
106 global $wpdb;
107
108 if ( ! get_option( 'is_course_post_type_updated' ) ) {
109 $wpdb->update( $wpdb->posts, array( 'post_type' => tutor()->course_post_type ), array( 'post_type' => 'course' ) );
110 update_option( 'is_course_post_type_updated', true );
111 update_option( 'tutor_version', '1.3.1' );
112 Permalink::set_permalink_flag();
113 }
114 }
115 }
116
117 /**
118 * Migration logic when user upgrade to 2.6.0.
119 *
120 * @return void
121 */
122 public function upgrade_to_2_6_0() {
123 if ( version_compare( $this->installed_version, '2.6.0', '<' ) ) {
124 if ( false === Permalink::update_required() ) {
125 Permalink::set_permalink_flag();
126 }
127
128 do_action( 'before_tutor_version_upgrade_to_2_6_0', $this->installed_version );
129 update_option( 'tutor_version', TUTOR_VERSION );
130 }
131 }
132
133 /**
134 * Migration logic when user upgrade to 3.0.0.
135 *
136 * @return void
137 */
138 public function upgrade_to_3_0_0() {
139 global $wpdb;
140
141 if ( version_compare( $this->installed_version, '3.0.0', '<' ) ) {
142 $table_name = $wpdb->prefix . 'tutor_orders';
143 if ( ! QueryHelper::table_exists( $table_name ) ) {
144 Tutor::tutor_activate();
145 }
146 update_option( 'tutor_version', TUTOR_VERSION );
147 }
148
149 // Beta upgrade.
150 if ( version_compare( TUTOR_VERSION, '3.0.0-beta2', '>=' ) ) {
151 $order_items_table = $wpdb->prefix . 'tutor_order_items';
152 if ( ! QueryHelper::column_exist( $order_items_table, 'discount_price' ) ) {
153 // If 'discount_price' does not exist, alter the table to add 'discount_price' and 'coupon_code', and update 'sale_price'.
154 $wpdb->query(
155 //phpcs:ignore
156 "ALTER TABLE {$order_items_table}
157 ADD COLUMN discount_price VARCHAR(13) DEFAULT NULL,
158 ADD COLUMN coupon_code VARCHAR(255) DEFAULT NULL,
159 MODIFY COLUMN sale_price VARCHAR(13) NULL"
160 );
161 }
162 }
163
164 // New field added coupon_amount in orders table.
165 if ( version_compare( TUTOR_VERSION, '3.0.0-beta4', '>=' ) ) {
166 $order_table = $wpdb->prefix . 'tutor_orders';
167
168 $coupon_amount = 'coupon_amount';
169 if ( ! QueryHelper::column_exist( $order_table, $coupon_amount ) ) {
170 $wpdb->query( "ALTER TABLE {$order_table} ADD COLUMN $coupon_amount DECIMAL(13, 2) DEFAULT NULL AFTER coupon_code" );//phpcs:ignore
171 }
172
173 /**
174 * Tax Type: inclusive, exclusive
175 */
176 $tax_type = 'tax_type';
177 if ( ! QueryHelper::column_exist( $order_table, $tax_type ) ) {
178 $wpdb->query( "ALTER TABLE {$order_table} ADD COLUMN $tax_type VARCHAR(50) DEFAULT NULL AFTER pre_tax_price" );//phpcs:ignore
179 }
180 }
181
182 CartController::create_cart_page();
183 CheckoutController::create_checkout_page();
184 }
185
186 /**
187 * Migration logic when user upgrade to 3.7.1
188 *
189 * @return void
190 */
191 public function upgrade_to_3_7_1() {
192 global $wpdb;
193
194 /**
195 * Result column and index added.
196 */
197 $result = 'result';
198 $attempt_table = $wpdb->tutor_quiz_attempts;
199 if ( QueryHelper::table_exists( $attempt_table ) && ! QueryHelper::column_exist( $attempt_table, $result ) ) {
200 $wpdb->query( "ALTER TABLE {$attempt_table} ADD COLUMN result VARCHAR(10);" ); //phpcs:ignore
201
202 // Index Added to improve query performance.
203 $wpdb->query(
204 //phpcs:ignore
205 "ALTER TABLE {$attempt_table}
206 ADD INDEX (course_id),
207 ADD INDEX (quiz_id),
208 ADD INDEX (user_id),
209 ADD INDEX (result);"
210 );
211 }
212
213 /**
214 * For content bank question.
215 * Column `content_id` is added to the `tutor_quiz_questions` table
216 *
217 * @since 3.7.0
218 */
219 $question_table = $wpdb->prefix . 'tutor_quiz_questions';
220 if ( QueryHelper::table_exists( $question_table ) && ! QueryHelper::column_exist( $question_table, 'content_id' ) ) {
221 $wpdb->query( "ALTER TABLE {$question_table} ADD COLUMN content_id BIGINT UNSIGNED DEFAULT NULL AFTER question_id" ); //phpcs:ignore
222 $wpdb->query( "ALTER TABLE {$question_table} ADD INDEX content_id(content_id)" );//phpcs:ignore
223 }
224 }
225
226 /**
227 * Migration logic when user upgrade to 3.8.0
228 *
229 * @return void
230 */
231 public function upgrade_to_3_8_0() {
232 if ( version_compare( TUTOR_VERSION, '3.8.0', '>=' ) ) {
233 global $wpdb;
234 $order_table = $wpdb->prefix . 'tutor_orders';
235 if ( QueryHelper::table_exists( $order_table ) && ! QueryHelper::column_exist( $order_table, 'pre_tax_price' ) ) {
236 $wpdb->query( "ALTER TABLE {$order_table} ADD COLUMN pre_tax_price DECIMAL(13, 2) NOT NULL AFTER subtotal_price" ); //phpcs:ignore
237 }
238
239 $charset_collate = $wpdb->get_charset_collate();
240 $scheduler_table = QueryHelper::table_exists( $wpdb->prefix . 'tutor_scheduler' );
241 $item_meta_table = QueryHelper::table_exists( $wpdb->prefix . 'tutor_order_itemmeta' );
242
243 // Create tutor_scheduler table.
244 if ( ! $scheduler_table ) {
245 $table_schema = "CREATE TABLE {$wpdb->prefix}tutor_scheduler (
246 id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
247 type VARCHAR(50) NOT NULL COMMENT 'Type of schedule, e.g., gift, email, reminder',
248 reference_id VARCHAR(255) NOT NULL COMMENT 'Unique reference id, token, etc',
249 scheduled_at_gmt DATETIME NOT NULL COMMENT 'When the action should be executed',
250 status VARCHAR(255) NOT NULL DEFAULT 'processing',
251 payload LONGTEXT,
252 created_at_gmt DATETIME,
253 updated_at_gmt DATETIME,
254 scheduled_by BIGINT UNSIGNED COMMENT 'User who scheduled the action',
255 scheduled_for BIGINT UNSIGNED COMMENT 'Target user of the scheduled action',
256 PRIMARY KEY (id),
257 KEY idx_context_status (type, status),
258 KEY idx_status (status),
259 KEY idx_scheduled_at_gmt (scheduled_at_gmt)
260 ) $charset_collate;";
261 dbDelta( $table_schema );
262 }
263
264 // Create order_item_meta table.
265 if ( ! $item_meta_table ) {
266 $item_meta_table = "CREATE TABLE {$wpdb->prefix}tutor_order_itemmeta (
267 id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
268 item_id BIGINT(20) UNSIGNED NOT NULL,
269 meta_key VARCHAR(255) NOT NULL,
270 meta_value LONGTEXT NOT NULL,
271 PRIMARY KEY (id),
272 KEY item_id (item_id),
273 KEY meta_key (meta_key),
274 CONSTRAINT fk_tutor_itemmeta FOREIGN KEY (item_id) REFERENCES {$wpdb->prefix}tutor_order_items(id) ON DELETE CASCADE
275 ) $charset_collate;";
276 dbDelta( $item_meta_table );
277 }
278
279 // Check if the column already exists.
280 $cart_item_table = $wpdb->prefix . 'tutor_cart_items';
281 $detail_column = 'item_details';
282 $type_column = 'item_type';
283
284 $is_detail_column_exists = QueryHelper::column_exist( $cart_item_table, $detail_column );
285 $is_type_column_exists = QueryHelper::column_exist( $cart_item_table, $type_column );
286
287 if ( ! $is_detail_column_exists ) {
288 $wpdb->query( "ALTER TABLE {$cart_item_table} ADD {$detail_column} JSON AFTER course_id" );
289 }
290
291 if ( ! $is_type_column_exists ) {
292 $wpdb->query( "ALTER TABLE {$cart_item_table} ADD {$type_column} VARCHAR(255) AFTER course_id" );
293 }
294 }
295 }
296
297 /**
298 * Installing Gradebook if Tutor Pro exists
299 *
300 * @since v1.4.2
301 *
302 * @return void
303 */
304 public function install_gradebook() {
305 global $wpdb;
306
307 $exists_gradebook_table = $wpdb->query( "SHOW TABLES LIKE '{$wpdb->tutor_gradebooks}';" );
308 $exists_gradebook_results_table = $wpdb->query( "SHOW TABLES LIKE '{$wpdb->tutor_gradebooks_results}';" );
309 $charset_collate = $wpdb->get_charset_collate();
310
311 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
312
313 if ( ! $exists_gradebook_table ) {
314 $gradebook_table = "CREATE TABLE IF NOT EXISTS {$wpdb->tutor_gradebooks} (
315 gradebook_id bigint(20) NOT NULL AUTO_INCREMENT,
316 grade_name varchar(50) DEFAULT NULL,
317 grade_point varchar(20) DEFAULT NULL,
318 grade_point_to varchar(20) DEFAULT NULL,
319 percent_from int(3) DEFAULT NULL,
320 percent_to int(3) DEFAULT NULL,
321 grade_config longtext,
322 PRIMARY KEY (gradebook_id)
323 ) $charset_collate;";
324 dbDelta( $gradebook_table );
325 }
326 if ( ! $exists_gradebook_results_table ) {
327 $gradebook_results = "CREATE TABLE IF NOT EXISTS {$wpdb->tutor_gradebooks_results} (
328 gradebook_result_id bigint(20) NOT NULL AUTO_INCREMENT,
329 user_id bigint(20) DEFAULT NULL,
330 course_id bigint(20) DEFAULT NULL,
331 quiz_id bigint(20) DEFAULT NULL,
332 assignment_id bigint(20) DEFAULT NULL,
333 gradebook_id bigint(20) DEFAULT NULL,
334 result_for varchar(50) DEFAULT NULL,
335 grade_name varchar(50) DEFAULT NULL,
336 grade_point varchar(20) DEFAULT NULL,
337 earned_grade_point varchar(20) DEFAULT NULL,
338 earned_percent int(3) DEFAULT NULL,
339 generate_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
340 update_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
341 PRIMARY KEY (gradebook_result_id)
342 ) {$charset_collate};";
343 dbDelta( $gradebook_results );
344 }
345 }
346
347 /**
348 * Email table deployment
349 *
350 * @param mixed $upgrader_object up grader obj.
351 * @param mixed $options options.
352 *
353 * @return void
354 */
355 public function init_email_table_deployment( $upgrader_object, $options ) {
356
357 if ( is_object( $upgrader_object ) && is_array( $upgrader_object->result ) && isset( $upgrader_object->result['destination_name'] ) && 'tutor-pro' == $upgrader_object->result['destination_name'] ) {
358 $addon_config = tutor_utils()->get_addon_config( 'tutor-pro/addons/tutor-email/tutor-email.php' );
359 $is_enable = (bool) tutor_utils()->avalue_dot( 'is_enable', $addon_config );
360
361 $is_enable ? $this->install_tutor_email_queue() : 0;
362 }
363 }
364
365 /**
366 * Installing email addon if Tutor Pro exists
367 *
368 * @since 1.8.6
369 *
370 * @return void
371 */
372 public function install_tutor_email_queue() {
373
374 global $wpdb;
375 $charset_collate = $wpdb->get_charset_collate();
376
377 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
378
379 if ( ! QueryHelper::table_exists( $wpdb->tutor_email_queue ) ) {
380 $table = "CREATE TABLE IF NOT EXISTS {$wpdb->tutor_email_queue} (
381 id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
382 mail_to varchar(255) NOT NULL,
383 subject text NOT NULL,
384 message text NOT NULL,
385 headers text NOT NULL,
386 batch varchar(50) NULL,
387 PRIMARY KEY (id)
388 ) {$charset_collate};";
389
390 dbDelta( $table );
391 }
392 }
393 }
394