PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.1.6.9.4
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.1.6.9.4
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
learnpress / inc / updates / learnpress-upgrade-4.php

learnpress-upgrade-4.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.1.6.9.4, at inc/updates/learnpress-upgrade-4.php

1,539 lines 42.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Class LP_Upgrade_4
5 *
6 * Helper class for updating database to 4.0.0
7 *
8 * @version 1.0.0
9 * @author tungnx
10 * @since 4.0.0
11 */
12 class LP_Upgrade_4 extends LP_Handle_Upgrade_Steps {
13 /**
14 * @var LP_Upgrade_4
15 */
16 protected static $instance = null;
17
18 /**
19 * Get Instance
20 *
21 * @return LP_Upgrade_4
22 */
23 public static function get_instance(): self {
24 if ( null === self::$instance ) {
25 self::$instance = new self();
26 }
27
28 return self::$instance;
29 }
30
31 /**
32 * LP_Upgrade_4 constructor.
33 *
34 * @see create_tables
35 * @see clone_tables
36 * @see modify_tb_lp_user_items
37 * @see remove_course_status_cancelled
38 * @see convert_result_graduation_item
39 * @see convert_result_questions
40 * @see convert_retake_quiz
41 * @see create_col_extra_value_on_tb_lp_user_itemmeta
42 * @see convert_meta_value_longtext
43 * @see modify_tb_lp_user_itemmeta
44 * @see remove_data_lp_user_itemmeta
45 * @see modify_tb_lp_quiz_questions
46 * @see modify_tb_lp_question_answers
47 * @see update_question_answers
48 * @see modify_tb_lp_question_answermeta
49 * @see convert_question_type_fill_in_blank
50 * @see delete_columns_question_answers
51 * @see modify_tb_lp_order_items
52 * @see modify_tb_lp_order_itemmeta
53 * @see modify_tb_lp_sections
54 * @see modify_tb_lp_section_items
55 * @see convert_lp_settings
56 */
57 protected function __construct() {
58 $this->version = '4.0.0';
59 /**
60 * Name key not > 50 character
61 */
62 $this->group_steps = apply_filters(
63 'lp/upgrade/4/steps',
64 array(
65 'learnpress_user_items' => new LP_Group_Step(
66 'learnpress_user_items',
67 '',
68 array(
69 'create_tables' => new LP_Step(
70 'create_tables',
71 'Create tables',
72 'learnpress_user_item_results'
73 ),
74 'clone_tables' => new LP_Step(
75 'clone_tables',
76 'Backup Tables',
77 'learnpress_user_items, learnpress_user_itemmeta, learnpress_question_answers, postmeta, options'
78 ),
79 'modify_tb_lp_user_items' => new LP_Step(
80 'modify_tb_lp_user_items',
81 'Modify table learnpress_user_items',
82 'Modify table learnpress_user_items, move the result of students on table learnpress_uset_itemmeta to learnpress_user_item_results'
83 ),
84 'remove_course_status_cancelled' => new LP_Step(
85 'remove_course_status_cancelled',
86 'Remove courses has status cancelled',
87 'learnpress_user_item_results'
88 ),
89 'convert_result_graduation_item' => new LP_Step(
90 'convert_result_graduation_item',
91 'Convert Data Result courses, items\' courses',
92 ''
93 ),
94 'convert_result_questions' => new LP_Step(
95 'convert_result_questions',
96 'Convert Data Result questions',
97 ''
98 ),
99 'convert_retake_quiz' => new LP_Step(
100 'convert_retake_quiz',
101 'Convert retake quizzes',
102 ''
103 ),
104 'create_col_extra_value_on_tb_lp_user_itemmeta' => new LP_Step(
105 'create_col_extra_value_on_tb_lp_user_itemmeta',
106 'Create column extra_value',
107 ''
108 ),
109 'convert_meta_value_longtext' => new LP_Step(
110 'convert_meta_value_longtext',
111 'Copy meta_value longtext to extra_value',
112 ''
113 ),
114 'remove_data_lp_user_itemmeta' => new LP_Step(
115 'remove_data_lp_user_itemmeta',
116 'Remove data results of lp_user_itemmeta',
117 ''
118 ),
119 'modify_tb_lp_user_itemmeta' => new LP_Step(
120 'modify_tb_lp_user_itemmeta',
121 'Modify table learnpress_user_itemmeta',
122 'Change type columns: meta_key, meta_value. Create Index: user_item_id, meta_key, meta_value'
123 ),
124 'modify_tb_lp_quiz_questions' => new LP_Step(
125 'modify_tb_lp_quiz_questions',
126 'Modify table learnpress_quiz_questions',
127 ''
128 ),
129 'modify_tb_lp_question_answers' => new LP_Step(
130 'modify_tb_lp_question_answers',
131 'Modify table learnpress_question_answers',
132 ''
133 ),
134 'update_question_answers' => new LP_Step(
135 'update_question_answers',
136 'Update data table learnpress_question_answers',
137 ''
138 ),
139 'modify_tb_lp_question_answermeta' => new LP_Step(
140 'modify_tb_lp_question_answermeta',
141 'Modify table learnpress_question_answermeta',
142 ''
143 ),
144 'convert_question_type_fill_in_blank' => new LP_Step(
145 'convert_question_type_fill_in_blank',
146 'Update data question type "Fill in blank"',
147 ''
148 ),
149 'delete_columns_question_answers' => new LP_Step(
150 'delete_columns_question_answers',
151 'Delete data table learnpress_question_answers',
152 ''
153 ),
154 'modify_tb_lp_order_items' => new LP_Step(
155 'modify_tb_lp_order_items',
156 'Modify data table learnpress_order_items',
157 ''
158 ),
159 'modify_tb_lp_order_itemmeta' => new LP_Step(
160 'modify_tb_lp_order_itemmeta',
161 'Modify data table learnpress_order_itemmeta',
162 ''
163 ),
164 'modify_tb_lp_sections' => new LP_Step(
165 'modify_tb_lp_sections',
166 'Modify table learnpress_sections',
167 'Create Index'
168 ),
169 'modify_tb_lp_section_items' => new LP_Step(
170 'modify_tb_lp_section_items',
171 'Modify table learnpress_section_items',
172 'Create Index'
173 ),
174 'convert_lp_settings' => new LP_Step(
175 'convert_lp_settings',
176 'Convert data settings learnpress',
177 'Courses thumbnail dimensions, Profile thumbnail dimensions, Profile rename dashboard to overview, Block course by duration, Block course when finished, Assessment course by quizzes - Evaluate, '
178 ),
179 )
180 ),
181 )
182 );
183 }
184
185 /**
186 * Step Create Tables
187 *
188 * @param array $data
189 *
190 * @return LP_Step
191 */
192 protected function create_tables( array $data ): LP_Step {
193 $response = new LP_Step( __FUNCTION__, 'Create table' );
194 $key_create_table = 'create_table';
195 $create_table = '';
196
197 try {
198 /**
199 * All tables need create.
200 * key: name table
201 * value: function handle create this table
202 *
203 * @see LP_Database::create_tb_lp_user_item_results
204 * @see LP_Database::create_tb_lp_upgrade_db()
205 */
206 $lp_db = LP_Database::getInstance();
207
208 $create_tables = array(
209 'tb_lp_user_item_results',
210 'tb_lp_upgrade_db',
211 );
212 $total_tables_need_create = count( $create_tables );
213
214 // Check table need create.
215 if ( empty( $data ) ) {
216 $create_table = $create_tables[0];
217 } elseif ( ! empty( $data[ $key_create_table ] )
218 && in_array( $data[ $key_create_table ], $create_tables ) ) {
219 $create_table = $data[ $key_create_table ];
220 }
221
222 if ( empty( $create_table ) ) {
223 // Finish this step.
224 $this->finish_step( $response, __FUNCTION__ . ' finished' );
225 } else {
226 // Create table.
227 $name_method = 'create_' . $create_table;
228 if ( ! method_exists( $lp_db, $name_method ) ) {
229 throw new Exception( 'Not found method ' . $name_method . ' of Class ' . get_class( $lp_db ) );
230 }
231 $lp_db->{$name_method}();
232
233 // Set param to clone table next.
234 $index = array_search( $create_table, $create_tables );
235 $percent = LP_Helper::progress_percent( $index, 1, $total_tables_need_create );
236 ++ $index;
237
238 if ( ! empty( $create_tables[ $index ] ) ) {
239 $response->status = 'success';
240 $response->percent = $percent;
241 $response->data->create_table = $create_tables[ $index ];
242 $response->message = 'Table "' . $create_table . '" created';
243 } else {
244 // Finish this step.
245 $this->finish_step( $response, __FUNCTION__ . ' finished' );
246 }
247 }
248 } catch ( Exception $e ) {
249 $response->message = $this->error_step( $response->name, $e->getMessage() );
250 }
251
252 return $response;
253 }
254
255 /**
256 * Step Clone Tables
257 *
258 * @param array $data | keys: clone_table .
259 *
260 * @return LP_Step
261 */
262 protected function clone_tables( array $data ): LP_Step {
263 $response = new LP_Step( __FUNCTION__, '' );
264 $key_clone_table = 'clone_table';
265 $clone_table = '';
266
267 try {
268 // All tables need clone.
269 $lp_db = LP_Database::getInstance();
270 $lp_db->wpdb->query( "SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO'" );
271
272 $clone_tables = array(
273 $lp_db->tb_lp_user_items,
274 $lp_db->tb_lp_user_itemmeta,
275 $lp_db->tb_lp_question_answers,
276 $lp_db->tb_postmeta,
277 $lp_db->tb_options,
278 );
279
280 $total_tables_need_clone = count( $clone_tables );
281
282 // Check table need clone.
283 if ( empty( $data ) ) {
284 $clone_table = $clone_tables[0];
285 } elseif ( ! empty( $data[ $key_clone_table ] )
286 && in_array( $data[ $key_clone_table ], $clone_tables, true ) ) {
287 $clone_table = $data[ $key_clone_table ];
288 }
289
290 if ( empty( $clone_table ) ) {
291 // Finish this step.
292 $this->finish_step( $response, __FUNCTION__ . ' finished' );
293 } else {
294 // Clone table.
295 $lp_db->clone_table( $clone_table );
296
297 // Set param to clone table next.
298 $index = array_search( $clone_table, $clone_tables );
299 $percent = LP_Helper::progress_percent( $index, 1, $total_tables_need_clone );
300 ++ $index;
301
302 if ( ! empty( $clone_tables[ $index ] ) ) {
303 $response->status = 'success';
304 $response->percent = $percent;
305 $response->data->clone_table = $clone_tables[ $index ];
306 $response->message = 'Table "' . $clone_table . '" cloned';
307 } else {
308 // Finish this step.
309 $this->finish_step( $response, __FUNCTION__ . ' finished' );
310 }
311 }
312 } catch ( Exception $e ) {
313 $response->message = $this->error_step( $response->name, $e->getMessage() );
314 }
315
316 return $response;
317 }
318
319 /**
320 * Modify table learnpress_user_items .
321 * - Add column graduation varchar(20)
322 * - Add column access_level varchar(20)
323 * - Copy value start_time_gmt to start_time if value != '0000-00-00 00:00:00' | And delete column start_time_gmt
324 * - Copy value end_time_gmt to end_time if value != '0000-00-00 00:00:00' | And delete column end_time_gmt
325 * - Create indexs
326 *
327 * @return LP_Step
328 */
329 protected function modify_tb_lp_user_items() : LP_Step {
330 $response = new LP_Step( __FUNCTION__, '' );
331 $lp_db = LP_Database::getInstance();
332
333 try {
334 /**
335 * Check column graduation, if not exist will be create
336 */
337 $lp_db->add_col_table( $lp_db->tb_lp_user_items, 'graduation', 'varchar(20)', 'status' );
338
339 /**
340 * Check column access_level, if not exist will be create
341 */
342 $lp_db->add_col_table( $lp_db->tb_lp_user_items, 'access_level', 'varchar(20)', 'graduation' );
343
344 // Change type columns: start_time, end_time.
345 $lp_db->wpdb->query(
346 "
347 ALTER TABLE $lp_db->tb_lp_user_items
348 MODIFY start_time datetime default null,
349 MODIFY end_time datetime default null;
350 "
351 );
352 $lp_db->check_execute_has_error();
353
354 /**
355 * Check column start_time_gmt exists.
356 *
357 * Copy value start_time_gmt to start_time
358 *
359 * Drop column start_time_gmt
360 */
361 $check_col_start_time_gmt = $lp_db->check_col_table( $lp_db->tb_lp_user_items, 'start_time_gmt' );
362 if ( $check_col_start_time_gmt ) {
363 $lp_db->wpdb->query(
364 "
365 UPDATE $lp_db->tb_lp_user_items SET start_time = start_time_gmt
366 WHERE user_item_id > 0
367 AND start_time_gmt != '0000-00-00 00:00:00'
368 "
369 );
370 $lp_db->check_execute_has_error();
371 $lp_db->wpdb->query(
372 "
373 UPDATE $lp_db->tb_lp_user_items SET start_time = null
374 WHERE start_time = '0000-00-00 00:00:00'
375 "
376 );
377 $lp_db->check_execute_has_error();
378 $lp_db->drop_col_table( $lp_db->tb_lp_user_items, 'start_time_gmt' );
379 }
380
381 /**
382 * Check column end_time_gmt exists.
383 *
384 * Copy value end_time_gmt to end_time
385 *
386 * Drop column end_time_gmt
387 */
388 $check_col_end_time_gmt = $lp_db->check_col_table( $lp_db->tb_lp_user_items, 'end_time_gmt' );
389 if ( $check_col_end_time_gmt ) {
390 $lp_db->wpdb->query(
391 "
392 UPDATE $lp_db->tb_lp_user_items SET end_time = end_time_gmt
393 WHERE user_item_id > 0
394 AND end_time_gmt != '0000-00-00 00:00:00'
395 "
396 );
397 $lp_db->check_execute_has_error();
398 $lp_db->wpdb->query(
399 "
400 UPDATE $lp_db->tb_lp_user_items SET end_time = null
401 WHERE end_time_gmt = '0000-00-00 00:00:00'
402 "
403 );
404 $lp_db->check_execute_has_error();
405 $lp_db->drop_col_table( $lp_db->tb_lp_user_items, 'end_time_gmt' );
406 }
407
408 // Remove rows have status = 'canceled';
409
410 // Create index.
411 $indexs = array( 'user_id', 'item_id', 'item_type', 'status', 'ref_type', 'ref_id', 'parent_id' );
412 $lp_db->add_indexs_table( $lp_db->tb_lp_user_items, $indexs );
413 } catch ( Exception $e ) {
414 $response->message = $this->error_step( $response->name, $e->getMessage() );
415 return $response;
416 }
417
418 return $this->finish_step( $response, 'Step ' . __FUNCTION__ . ' finished' );
419 }
420
421 /**
422 * Remove courses has status "cancelled" and items child, itemmeta
423 *
424 * @return LP_Step
425 */
426 protected function remove_course_status_cancelled() : LP_Step {
427 $response = new LP_Step( __FUNCTION__, '' );
428 $lp_db = LP_Database::getInstance();
429
430 try {
431 $user_course_ids = $lp_db->wpdb->get_col(
432 $lp_db->wpdb->prepare(
433 "
434 SELECT user_item_id FROM $lp_db->tb_lp_user_items
435 WHERE item_type = %s
436 AND status = %s
437 ",
438 LP_COURSE_CPT,
439 'cancelled'
440 )
441 );
442
443 if ( empty( $user_course_ids ) ) {
444 return $this->finish_step( $response, 'Step ' . __FUNCTION__ . ' finished' );
445 }
446
447 $user_course_ids_str = implode( ',', $user_course_ids );
448
449 $user_item_ids = $lp_db->wpdb->get_col(
450 "
451 SELECT user_item_id FROM $lp_db->tb_lp_user_items
452 WHERE parent_id IN (" . $user_course_ids_str . ')
453 '
454 );
455
456 $user_item_ids_concat = array_merge( $user_course_ids, $user_item_ids );
457 $user_item_ids_concat_str = implode( ',', $user_item_ids_concat );
458
459 // Delete on tb lp_user_items
460 $lp_db->wpdb->query(
461 "
462 DELETE FROM $lp_db->tb_lp_user_items
463 WHERE user_item_id IN (" . $user_item_ids_concat_str . ')
464 '
465 );
466 $lp_db->check_execute_has_error();
467
468 // Delete on tb lp_user_itemmeta
469 $lp_db->wpdb->query(
470 "
471 DELETE FROM $lp_db->tb_lp_user_itemmeta
472 WHERE learnpress_user_item_id IN (" . $user_course_ids_str . ')
473 '
474 );
475 $lp_db->check_execute_has_error();
476 } catch ( Exception $e ) {
477 $response->message = $this->error_step( $response->name, $e->getMessage() );
478 return $response;
479 }
480
481 return $this->finish_step( $response, 'Step ' . __FUNCTION__ . ' finished' );
482 }
483
484 /**
485 * Convert value of meta_key "grade" table learnpress_user_itemmeta LP3 to column graduation LP4 table learnpress_user_item_results
486 *
487 * @param array $data .
488 *
489 * @return LP_Step
490 */
491 protected function convert_result_graduation_item( array $data ): LP_Step {
492 $response = new LP_Step( __FUNCTION__, '' );
493 $lp_db = LP_Database::getInstance();
494 $page = 0;
495 $offset = 0;
496 $limit = 100;
497 $total_row = 0;
498
499 try {
500 if ( empty( $data ) ) {
501 // Check total rows.
502 $query = $lp_db->wpdb->prepare(
503 "
504 SELECT COUNT(learnpress_user_item_id) FROM $lp_db->tb_lp_user_itemmeta
505 WHERE meta_key = %s
506 ",
507 'grade'
508 );
509
510 $total_row = $response->data->total_rows = (int) $lp_db->wpdb->get_var( $query );
511 } else {
512 $page = $data['p'];
513 $offset = $limit * $page;
514 $total_row = $data['total_rows'];
515 }
516
517 // Select .
518 $query = $lp_db->wpdb->prepare(
519 "
520 SELECT learnpress_user_item_id AS user_item_id, meta_value AS grade
521 FROM $lp_db->tb_lp_user_itemmeta
522 WHERE meta_key = %s
523 LIMIT %d, %d
524 ",
525 'grade',
526 $offset,
527 $limit
528 );
529 $user_item_grades = $lp_db->wpdb->get_results( $query );
530
531 $percent = LP_Helper::progress_percent( $offset, $limit, $total_row );
532
533 if ( empty( $user_item_grades ) || 100 === $percent ) {
534 return $this->finish_step( $response, __FUNCTION__ . ' finished' );
535 }
536
537 /**
538 * Copy value of meta_key "grade" table learnpress_user_itemmeta LP3
539 * to column "graduation" LP4 table learnpress_user_items
540 */
541 foreach ( $user_item_grades as $user_item_grade ) {
542 $query = $lp_db->wpdb->prepare(
543 "
544 UPDATE $lp_db->tb_lp_user_items
545 SET graduation = %s
546 WHERE user_item_id = %d;
547 ",
548 $user_item_grade->grade,
549 $user_item_grade->user_item_id
550 );
551
552 $lp_db->wpdb->query( $query );
553 $lp_db->check_execute_has_error();
554 }
555
556 $response->status = 'success';
557 $response->message = 'Insert success';
558 $response->percent = $percent;
559 $response->data->p = ++ $page;
560 $response->data->total_rows = $total_row;
561 } catch ( Exception $e ) {
562 $response->message = $this->error_step( $response->name, $e->getMessage() );
563 }
564
565 return $response;
566 }
567
568 /**
569 * Convert value of meta_key "_question_answers" table learnpress_user_itemmeta LP3 to column result LP4 table learnpress_user_item_results
570 *
571 * @param array $data .
572 *
573 * @return LP_Step
574 */
575 protected function convert_result_questions( array $data ): LP_Step {
576 $response = new LP_Step( __FUNCTION__, '' );
577 $lp_db = LP_Database::getInstance();
578 $page = 0;
579 $offset = 0;
580 $limit = 100;
581 $total_row = 0;
582
583 try {
584 if ( empty( $data ) ) {
585 // Check total rows.
586 $query = $lp_db->wpdb->prepare(
587 "
588 SELECT COUNT(learnpress_user_item_id) FROM $lp_db->tb_lp_user_itemmeta
589 WHERE meta_key = '_question_answers'
590 ",
591 1
592 );
593
594 $total_row = $response->data->total_rows = (int) $lp_db->wpdb->get_var( $query );
595 } else {
596 $page = $data['p'];
597 $offset = $limit * $page;
598 $total_row = $data['total_rows'];
599 }
600
601 // Convert rows.
602 $query = $lp_db->wpdb->prepare(
603 "
604 SELECT learnpress_user_item_id AS user_item_id, meta_value AS answered
605 FROM $lp_db->tb_lp_user_itemmeta
606 WHERE meta_key = '_question_answers'
607 LIMIT %d offset %d
608 ",
609 $limit,
610 $offset
611 );
612 $quizs_questions_answered = $lp_db->wpdb->get_results( $query );
613
614 if ( 0 === count( $quizs_questions_answered ) ) {
615 return $this->finish_step( $response, 'Convert result question success' );
616 }
617
618 foreach ( $quizs_questions_answered as $quiz_question_answered ) {
619 $query_quiz_result = $lp_db->wpdb->get_var(
620 $lp_db->wpdb->prepare(
621 "
622 SELECT meta_value AS quiz_result FROM $lp_db->tb_lp_user_itemmeta
623 WHERE learnpress_user_item_id = %d
624 AND meta_key = %s
625 ",
626 $quiz_question_answered->user_item_id,
627 'results'
628 )
629 );
630
631 $quiz_result = maybe_unserialize( ( $query_quiz_result ) );
632 $questions_answered = maybe_unserialize( $quiz_question_answered->answered );
633
634 if ( ! $quiz_result || ! $questions_answered ) {
635 continue;
636 }
637
638 foreach ( $questions_answered as $question_id => $question_answered ) {
639 if ( isset( $quiz_result['questions'][ $question_id ] ) ) {
640 $quiz_result['questions'][ $question_id ]['answered'] = $question_answered;
641 }
642 }
643
644 $result_json = json_encode( $quiz_result );
645
646 // Check exists user_item_id value on table learnpress_user_item_results.
647 $check = $lp_db->wpdb->get_var(
648 $lp_db->wpdb->prepare(
649 "
650 SELECT user_item_id FROM $lp_db->tb_lp_user_item_results
651 WHERE user_item_id = %d
652 ",
653 $quiz_question_answered->user_item_id
654 )
655 );
656
657 if ( empty( $check ) ) {
658 $lp_db->wpdb->insert(
659 $lp_db->tb_lp_user_item_results,
660 array(
661 'result' => $result_json,
662 'user_item_id' => $quiz_question_answered->user_item_id,
663 )
664 );
665 $lp_db->check_execute_has_error();
666 } else {
667 }
668 }
669
670 $percent = LP_Helper::progress_percent( $offset, $limit, $total_row );
671
672 $response->status = 'success';
673 $response->message = 'Insert success';
674 $response->percent = $percent;
675 $response->data->p = ++ $page;
676 $response->data->total_rows = $total_row;
677 } catch ( Exception $e ) {
678 $response->message = $this->error_step( $response->name, $e->getMessage() );
679 }
680
681 return $response;
682 }
683
684 /**
685 * Convert retake quiz.
686 *
687 * @param array $data .
688 *
689 * @return LP_Step
690 */
691 protected function convert_retake_quiz( array $data ): LP_Step {
692 $response = new LP_Step( __FUNCTION__, '' );
693 $lp_db = LP_Database::getInstance();
694 $page = 0;
695 $offset = 0;
696 $limit = 100;
697 $total_row = 0;
698
699 try {
700 if ( empty( $data ) ) {
701 // Check total rows.
702 $query = $lp_db->wpdb->prepare(
703 "
704 SELECT COUNT(learnpress_user_item_id) FROM $lp_db->tb_lp_user_itemmeta
705 WHERE meta_key = '_retaken_items'
706 ",
707 1
708 );
709
710 $total_row = $response->data->total_rows = (int) $lp_db->wpdb->get_var( $query );
711 } else {
712 $page = $data['p'];
713 $offset = $limit * $page;
714 $total_row = $data['total_rows'];
715 }
716
717 // Convert rows.
718 $query = $lp_db->wpdb->prepare(
719 "
720 SELECT learnpress_user_item_id AS user_item_id, meta_value AS quizzes_retaken
721 FROM $lp_db->tb_lp_user_itemmeta
722 WHERE meta_key = '_retaken_items'
723 LIMIT %d offset %d
724 ",
725 $limit,
726 $offset
727 );
728 $courses_quizzes_retaken = $lp_db->wpdb->get_results( $query );
729
730 if ( 0 === count( $courses_quizzes_retaken ) ) {
731 return $this->finish_step( $response, 'Convert result question success' );
732 }
733
734 foreach ( $courses_quizzes_retaken as $quizzes_retaken ) {
735 $user_item_id = $quizzes_retaken->user_item_id;
736 $retaken = maybe_unserialize( $quizzes_retaken->quizzes_retaken );
737
738 if ( is_array( $retaken ) ) {
739 foreach ( $retaken as $quiz_id => $v ) {
740 $quiz_user_item_id = $lp_db->wpdb->get_var(
741 $lp_db->wpdb->prepare(
742 "
743 SELECT user_item_id
744 FROM $lp_db->tb_lp_user_items
745 WHERE parent_id = %d
746 AND item_id = %d
747 ",
748 $user_item_id,
749 $quiz_id
750 )
751 );
752
753 if ( $quiz_user_item_id ) {
754 $lp_db->wpdb->query(
755 "
756 INSERT INTO $lp_db->tb_lp_user_itemmeta
757 (learnpress_user_item_id, meta_key, meta_value)
758 VALUES ($quiz_user_item_id, '_lp_retake_count', $v)
759 "
760 );
761 $lp_db->check_execute_has_error();
762 }
763 }
764 }
765 }
766
767 $percent = LP_Helper::progress_percent( $offset, $limit, $total_row );
768
769 $response->status = 'success';
770 $response->message = 'Convert success ';
771 $response->percent = $percent;
772 $response->data->p = ++ $page;
773 $response->data->total_rows = $total_row;
774 } catch ( Exception $e ) {
775 $response->message = $this->error_step( $response->name, $e->getMessage() );
776 }
777
778 return $response;
779 }
780
781 /**
782 * Create column extra_value for table learnpress_user_itemmeta.
783 *
784 * @return LP_Step
785 */
786 protected function create_col_extra_value_on_tb_lp_user_itemmeta(): LP_Step {
787 $response = new LP_Step( __FUNCTION__, '' );
788 $lp_db = LP_Database::getInstance();
789
790 try {
791 $lp_db->add_col_table( $lp_db->tb_lp_user_itemmeta, 'extra_value', 'longtext', 'meta_value' );
792 } catch ( Exception $e ) {
793 $response->message = $this->error_step( $response->name, $e->getMessage() );
794 return $response;
795 }
796
797 return $this->finish_step( $response, 'Step ' . __FUNCTION__ . ' finished' );
798 }
799
800 /**
801 * Copy meta_value longtext to extra_value.
802 *
803 * @return LP_Step
804 */
805 protected function convert_meta_value_longtext(): LP_Step {
806 $response = new LP_Step( __FUNCTION__, '' );
807 $lp_db = LP_Database::getInstance();
808
809 try {
810 // Copy meta_value to extra_value.
811 $lp_db->wpdb->query(
812 "
813 UPDATE $lp_db->tb_lp_user_itemmeta SET extra_value = meta_value
814 WHERE meta_key = '_lp_assignment_answer_note'
815 OR meta_key = '_lp_assignment_answer_upload'
816 "
817 );
818 $lp_db->check_execute_has_error();
819
820 // Empty meta_value.
821 $lp_db->wpdb->query(
822 "
823 UPDATE $lp_db->tb_lp_user_itemmeta SET meta_value = ''
824 WHERE meta_key = '_lp_assignment_answer_note'
825 OR meta_key = '_lp_assignment_answer_upload'
826 "
827 );
828 $lp_db->check_execute_has_error();
829 } catch ( Exception $e ) {
830 $response->message = $this->error_step( $response->name, $e->getMessage() );
831 return $response;
832 }
833
834 return $this->finish_step( $response, 'Step ' . __FUNCTION__ . ' finished' );
835 }
836
837 /**
838 * Modify table learnpress_user_itemmeta .
839 * Must run after Step "convert_result_questions"
840 * Because change name column name 'learnpress_user_item_id' to 'user_item_id' and meta_key change type from 'text' to varchar(255)
841 *
842 * @return LP_Step
843 */
844 protected function modify_tb_lp_user_itemmeta(): LP_Step {
845 $response = new LP_Step( __FUNCTION__, '' );
846 $lp_db = LP_Database::getInstance();
847
848 try {
849 $lp_db->wpdb->query(
850 "
851 ALTER TABLE {$lp_db->tb_lp_user_itemmeta}
852 CHANGE COLUMN `meta_key` `meta_key` VARCHAR(45) NOT NULL DEFAULT '',
853 CHANGE COLUMN `meta_value` `meta_value` VARCHAR(45) NOT NULL DEFAULT ''
854 "
855 );
856 $lp_db->check_execute_has_error();
857
858 // Create index.
859 $indexs = array( 'learnpress_user_item_id', 'meta_key', 'meta_value' );
860 $lp_db->add_indexs_table( $lp_db->tb_lp_user_itemmeta, $indexs );
861 } catch ( Exception $e ) {
862 $response->message = $this->error_step( $response->name, $e->getMessage() );
863 return $response;
864 }
865
866 return $this->finish_step( $response, 'Step ' . __FUNCTION__ . ' finished' );
867 }
868
869 /**
870 * Remove data on table learnpress_user_itemmeta
871 */
872 protected function remove_data_lp_user_itemmeta() {
873 $response = new LP_Step( __FUNCTION__, '' );
874 $lp_db = LP_Database::getInstance();
875
876 try {
877 /**
878 * 1. Remove results course.
879 * 2. Remove results item's course.
880 * 3. Remove _question_answers.
881 * 4. Remove grade.
882 * 5. Remove _last_status.
883 * 6. Remove _current_status.
884 * 7. Remove finishing_type.
885 * 8. Remove _retaken_items.
886 */
887 $lp_db->wpdb->query(
888 "
889 DELETE FROM {$lp_db->tb_lp_user_itemmeta}
890 WHERE meta_key LIKE 'course_results_evaluate_%'
891 OR meta_key = '_question_answers'
892 OR meta_key = 'results'
893 OR meta_key = 'grade'
894 OR meta_key = '_last_status'
895 OR meta_key = '_current_status'
896 OR meta_key = 'finishing_type'
897 OR meta_key = '_retaken_items'
898 "
899 );
900 $lp_db->check_execute_has_error();
901 } catch ( Exception $e ) {
902 $response->message = $this->error_step( $response->name, $e->getMessage() );
903 return $response;
904 }
905
906 return $this->finish_step(
907 $response,
908 'Step ' . __FUNCTION__ . ' finished'
909 );
910 }
911
912 /**
913 * Modify table learnpress_quiz_questions.
914 */
915 protected function modify_tb_lp_quiz_questions() {
916 $response = new LP_Step( __FUNCTION__, '' );
917 $lp_db = LP_Database::getInstance();
918
919 try {
920 $indexs = array( 'quiz_id', 'question_id' );
921 $lp_db->add_indexs_table( $lp_db->tb_lp_quiz_questions, $indexs );
922 } catch ( Exception $e ) {
923 $response->message = $this->error_step( $response->name, $e->getMessage() );
924 return $response;
925 }
926
927 return $this->finish_step( $response, 'Step ' . __FUNCTION__ . ' finished' );
928 }
929
930 /**
931 * Modify table learnpress_question_answers
932 *
933 * @return LP_Step
934 * @throws Exception .
935 */
936 protected function modify_tb_lp_question_answers(): LP_Step {
937 $response = new LP_Step( __FUNCTION__, '' );
938 $lp_db = LP_Database::getInstance();
939
940 try {
941 // Add column title.
942 $check_col_title = $lp_db->check_col_table( $lp_db->tb_lp_question_answers, 'title' );
943 if ( ! $check_col_title ) {
944 $lp_db->wpdb->query(
945 "
946 ALTER TABLE {$lp_db->tb_lp_question_answers}
947 ADD `title` text NULL AFTER `question_id`
948 "
949 );
950 }
951
952 // Add column value.
953 $check_col_value = $lp_db->check_col_table( $lp_db->tb_lp_question_answers, 'value' );
954 if ( ! $check_col_value ) {
955 $lp_db->wpdb->query(
956 "
957 ALTER TABLE {$lp_db->tb_lp_question_answers}
958 ADD `value` varchar(32) NULL AFTER `title`
959 "
960 );
961 }
962
963 // Add column order.
964 $check_col_order = $lp_db->check_col_table( $lp_db->tb_lp_question_answers, 'order' );
965 if ( ! $check_col_order ) {
966 $lp_db->wpdb->query(
967 "
968 ALTER TABLE {$lp_db->tb_lp_question_answers}
969 ADD `order` bigint(20) NULL DEFAULT 1 AFTER `value`
970 "
971 );
972 }
973
974 // Add column is_true.
975 $check_col_is_true = $lp_db->check_col_table( $lp_db->tb_lp_question_answers, 'is_true' );
976 if ( ! $check_col_is_true ) {
977 $lp_db->wpdb->query(
978 "
979 ALTER TABLE {$lp_db->tb_lp_question_answers}
980 ADD `is_true` varchar(3) NULL AFTER `order`
981 "
982 );
983 }
984
985 $indexs = array( 'question_id' );
986 $lp_db->add_indexs_table( $lp_db->tb_lp_question_answers, $indexs );
987
988 if ( ! empty( $lp_db->wpdb->last_error ) ) {
989 throw new Exception( $lp_db->wpdb->last_error );
990 }
991 } catch ( Exception $e ) {
992 $response->message = $this->error_step( $response->name, $e->getMessage() );
993 return $response;
994 }
995
996 return $this->finish_step( $response, 'Step ' . __FUNCTION__ . ' finished' );
997 }
998
999 /**
1000 * Convert data on table learnpress_question_answers.
1001 *
1002 * @param array $data .
1003 *
1004 * @return LP_Step
1005 */
1006 protected function update_question_answers( array $data ): LP_Step {
1007 $response = new LP_Step( __FUNCTION__, '' );
1008 $lp_db = LP_Database::getInstance();
1009 $wpdb = $lp_db->wpdb;
1010 $page = 0;
1011 $offset = 0;
1012 $limit = 100;
1013 $total_row = 0;
1014
1015 try {
1016 $offset = absint( get_transient( 'lp_upgrade_question_answers_offset' ) );
1017
1018 if ( empty( $data ) ) {
1019 // Check total rows.
1020 $query = $lp_db->wpdb->prepare(
1021 "
1022 SELECT COUNT(question_answer_id) FROM $lp_db->tb_lp_question_answers
1023 ",
1024 1
1025 );
1026
1027 $total_row = $response->data->total_rows = (int) $lp_db->wpdb->get_var( $query );
1028 } else {
1029 $page = $data['p'];
1030 $offset = $limit * $page;
1031 $total_row = $data['total_rows'];
1032 }
1033
1034 $query = $wpdb->prepare(
1035 "
1036 SELECT *
1037 FROM {$lp_db->tb_lp_question_answers}
1038 LIMIT %d OFFSET %d
1039 ",
1040 $limit,
1041 $offset
1042 );
1043
1044 $rows = $wpdb->get_results( $query );
1045
1046 if ( ! $rows ) {
1047 return $this->finish_step( $response, 'Finished ' . __FUNCTION__ );
1048 }
1049
1050 foreach ( $rows as $row ) {
1051 if ( ! isset( $row->answer_data ) ) {
1052 continue;
1053 }
1054
1055 $answers = wp_parse_args(
1056 maybe_unserialize( $row->answer_data ),
1057 array(
1058 'text' => '',
1059 'value' => '',
1060 'is_true' => '',
1061 )
1062 );
1063 $update_sql = $lp_db->wpdb->prepare(
1064 "
1065 UPDATE {$lp_db->tb_lp_question_answers}
1066 SET `title`= %s,
1067 `value`= %s,
1068 `is_true`= %s,
1069 `order`= %s
1070 WHERE question_answer_id=%d
1071 ",
1072 $answers['text'],
1073 $answers['value'] ? $answers['value'] : learn_press_random_value(),
1074 $answers['is_true'],
1075 $row->answer_order,
1076 $row->question_answer_id
1077 );
1078 $wpdb->query( $update_sql );
1079 $lp_db->check_execute_has_error();
1080 }
1081
1082 $percent = LP_Helper::progress_percent( $offset, $limit, $total_row );
1083
1084 $response->status = 'success';
1085 $response->message = 'Insert success';
1086 $response->percent = $percent;
1087 $response->data->p = ++ $page;
1088 $response->data->total_rows = $total_row;
1089 } catch ( Exception $e ) {
1090 $response->message = $this->error_step( $response->name, $e->getMessage() );
1091 }
1092
1093 return $response;
1094 }
1095
1096 /**
1097 * Modify table learnpress_question_answermeta
1098 */
1099 protected function modify_tb_lp_question_answermeta() {
1100 $response = new LP_Step( __FUNCTION__, '' );
1101 $lp_db = LP_Database::getInstance();
1102
1103 try {
1104 $lp_db->wpdb->query(
1105 "
1106 ALTER TABLE {$lp_db->tb_lp_question_answermeta}
1107 MODIFY COLUMN `meta_key` VARCHAR(255) NOT NULL DEFAULT '',
1108 MODIFY COLUMN `meta_value` longtext NULL DEFAULT ''
1109 "
1110 );
1111 $lp_db->check_execute_has_error();
1112
1113 // Create index.
1114 $lp_db->drop_indexs_table( $lp_db->tb_lp_question_answermeta );
1115 $lp_db->wpdb->query(
1116 "
1117 ALTER TABLE {$lp_db->tb_lp_question_answermeta}
1118 ADD INDEX question_answer_meta (`learnpress_question_answer_id`, `meta_key`(150))
1119 "
1120 );
1121 $lp_db->check_execute_has_error();
1122 } catch ( Exception $e ) {
1123 $response->message = $this->error_step( $response->name, $e->getMessage() );
1124 return $response;
1125 }
1126
1127 return $this->finish_step( $response, __FUNCTION__ . ' finished' );
1128 }
1129
1130 /**
1131 * Convert question type fill in blank
1132 *
1133 * @param array $data .
1134 *
1135 * @return LP_Step
1136 */
1137 protected function convert_question_type_fill_in_blank( array $data = array() ): LP_Step {
1138 $response = new LP_Step( __FUNCTION__, '' );
1139 $lp_db = LP_Database::getInstance();
1140 $wpdb = $lp_db->wpdb;
1141 $page = 0;
1142 $offset = 0;
1143 $limit = 100;
1144 $total_row = 0;
1145
1146 try {
1147 if ( empty( $data ) ) {
1148 // Check total rows.
1149 $query = $lp_db->wpdb->prepare(
1150 "
1151 SELECT COUNT(meta_id) FROM $lp_db->tb_postmeta
1152 WHERE meta_key = %s
1153 AND meta_value = %s
1154 ",
1155 'lp_type',
1156 'fill_in_blank'
1157 );
1158
1159 $total_row = $response->data->total_rows = (int) $lp_db->wpdb->get_var( $query );
1160 } else {
1161 $page = $data['p'];
1162 $offset = $limit * $page;
1163 $total_row = $data['total_rows'];
1164 }
1165
1166 $query_get_question_ids = $wpdb->prepare(
1167 "
1168 SELECT meta_id
1169 FROM {$lp_db->tb_postmeta}
1170 WHERE meta_key = %s
1171 AND meta_value = %s
1172 LIMIT %d, %d
1173 ",
1174 '_lp_type',
1175 'fill_in_blank',
1176 $offset,
1177 $limit
1178 );
1179
1180 $question_ids = $lp_db->wpdb->get_col( $query_get_question_ids );
1181
1182 if ( empty( $question_ids ) ) {
1183 return $this->finish_step( $response, __FUNCTION__ . ' finished' );
1184 }
1185
1186 $question_ids_str = implode( ',', $question_ids );
1187
1188 $query = $wpdb->prepare(
1189 "
1190 UPDATE {$lp_db->tb_postmeta}
1191 SET meta_value = %s
1192 WHERE meta_id IN ($question_ids_str)
1193 ",
1194 'fill_in_blanks'
1195 );
1196 $lp_db->wpdb->query( $query );
1197
1198 if ( $lp_db->wpdb->last_error ) {
1199 throw new Exception( $lp_db->wpdb->last_error );
1200 }
1201
1202 $percent = LP_Helper::progress_percent( $offset, $limit, $total_row );
1203
1204 $response->status = 'success';
1205 $response->message = 'Convert question FIB success';
1206 $response->percent = $percent;
1207 $response->data->p = ++ $page;
1208 $response->data->total_rows = $total_row;
1209 } catch ( Exception $e ) {
1210 $response->message = $this->error_step( $response->name, $e->getMessage() );
1211 }
1212
1213 return $response;
1214 }
1215
1216 /**
1217 * Delete Columns question answers.
1218 *
1219 * @return LP_Step
1220 */
1221 protected function delete_columns_question_answers(): LP_Step {
1222 $response = new LP_Step( __FUNCTION__, '' );
1223 $lp_db = LP_Database::getInstance();
1224
1225 try {
1226 $lp_db->drop_col_table( $lp_db->tb_lp_question_answers, 'answer_data' );
1227 $lp_db->drop_col_table( $lp_db->tb_lp_question_answers, 'answer_order' );
1228 } catch ( Exception $e ) {
1229 $response->message = $this->error_step( $response->name, $e->getMessage() );
1230 return $response;
1231 }
1232
1233 return $this->finish_step( $response, __FUNCTION__ . ' finished' );
1234 }
1235
1236 /**
1237 * Modify table learnpress_order_items .
1238 */
1239 protected function modify_tb_lp_order_items() {
1240 $response = new LP_Step( __FUNCTION__, '' );
1241 $lp_db = LP_Database::getInstance();
1242
1243 try {
1244 $lp_db->add_col_table( $lp_db->tb_lp_order_items, 'item_id', 'bigint(20)', 'order_id' );
1245 $lp_db->add_col_table( $lp_db->tb_lp_order_items, 'item_type', 'varchar(45)', 'item_id' );
1246
1247 $indexs = array( 'order_id', 'item_id', 'item_type' );
1248 $lp_db->add_indexs_table( $lp_db->tb_lp_order_items, $indexs );
1249 } catch ( Exception $e ) {
1250 $response->message = $this->error_step( $response->name, $e->getMessage() );
1251 return $response;
1252 }
1253
1254 return $this->finish_step( $response, __FUNCTION__ . ' finished' );
1255 }
1256
1257 /**
1258 * Modify table learnpress_order_itemmeta.
1259 *
1260 * @return LP_Step
1261 */
1262 protected function modify_tb_lp_order_itemmeta(): LP_Step {
1263 $response = new LP_Step( __FUNCTION__, '' );
1264 $lp_db = LP_Database::getInstance();
1265
1266 try {
1267 $lp_db->wpdb->query(
1268 "
1269 ALTER TABLE {$lp_db->tb_lp_order_itemmeta}
1270 MODIFY COLUMN `meta_key` VARCHAR(45) NOT NULL DEFAULT '',
1271 MODIFY COLUMN `meta_value` VARCHAR(45) NOT NULL DEFAULT ''
1272 "
1273 );
1274 $lp_db->check_execute_has_error();
1275
1276 $lp_db->add_col_table( $lp_db->tb_lp_order_itemmeta, 'extra_value', 'longtext', 'meta_value' );
1277
1278 $indexs = array( 'learnpress_order_item_id', 'meta_key', 'meta_value' );
1279 $lp_db->add_indexs_table( $lp_db->tb_lp_order_itemmeta, $indexs );
1280 } catch ( Exception $e ) {
1281 $response->message = $this->error_step( $response->name, $e->getMessage() );
1282 return $response;
1283 }
1284
1285 return $this->finish_step( $response, __FUNCTION__ . ' finished' );
1286 }
1287
1288 /**
1289 * Create index table learnpress_sections
1290 */
1291 protected function modify_tb_lp_sections() {
1292 $response = new LP_Step( __FUNCTION__, '' );
1293 $lp_db = LP_Database::getInstance();
1294
1295 try {
1296 $indexs = array( 'section_course_id' );
1297
1298 $lp_db->add_indexs_table( $lp_db->tb_lp_sections, $indexs );
1299 } catch ( Exception $e ) {
1300 $response->message = $this->error_step( $response->name, $e->getMessage() );
1301 return $response;
1302 }
1303
1304 return $this->finish_step( $response, __FUNCTION__ . ' finished' );
1305 }
1306
1307 /**
1308 * Create index table learnpress_section_items
1309 */
1310 protected function modify_tb_lp_section_items(): LP_Step {
1311 $response = new LP_Step( __FUNCTION__, '' );
1312 $lp_db = LP_Database::getInstance();
1313
1314 try {
1315 $lp_db->drop_indexs_table( $lp_db->tb_lp_section_items );
1316
1317 $lp_db->wpdb->query(
1318 "
1319 ALTER TABLE {$lp_db->tb_lp_section_items}
1320 ADD INDEX section_item (`section_id`, `item_id`)
1321 "
1322 );
1323 $lp_db->check_execute_has_error();
1324 } catch ( Exception $e ) {
1325 $response->message = $this->error_step( $response->name, $e->getMessage() );
1326 return $response;
1327 }
1328
1329 return $this->finish_step( $response, __FUNCTION__ . ' finished' );
1330 }
1331
1332 /**
1333 * Convert Learnpress Settings
1334 * 1. Courses thumbnail dimensions convert.
1335 * 2. Profile thumbnail dimensions convert.
1336 * 3. Profile rename dashboard to overview.
1337 * 4. Block course by duration.
1338 * 5. Block course when finished.
1339 * 6. Assessment course by quizzes - Evaluate.
1340 *
1341 * @return LP_Step
1342 */
1343 protected function convert_lp_settings(): LP_Step {
1344 $response = new LP_Step( __FUNCTION__, '' );
1345 $lp_db = LP_Database::getInstance();
1346
1347 try {
1348 /**
1349 * Update value on column option_name.
1350 * Code update value option_name must write before re create indexes if not error "Duplicate entry".
1351 */
1352 // Drop table options.
1353 $lp_db->drop_indexs_table( $lp_db->tb_options );
1354
1355 // Courses thumbnail dimensions convert.
1356 $check_option_thumbnail_dimensions_exists = $lp_db->wpdb->get_var(
1357 "
1358 SELECT option_name FROM $lp_db->tb_options
1359 WHERE option_name = 'learn_press_course_thumbnail_dimensions'
1360 "
1361 );
1362 if ( empty( $check_option_thumbnail_dimensions_exists ) ) {
1363 $lp_db->wpdb->query(
1364 "UPDATE $lp_db->tb_options
1365 SET option_name = 'learn_press_course_thumbnail_dimensions'
1366 WHERE option_name = 'learn_press_course_thumbnail_image_size'
1367 "
1368 );
1369 $lp_db->check_execute_has_error();
1370 }
1371
1372 // Profile thumbnail dimensions convert.
1373 $check_option_avatar_dimensions_exists = $lp_db->wpdb->get_var(
1374 "
1375 SELECT option_name FROM $lp_db->tb_options
1376 WHERE option_name = 'learn_press_avatar_dimensions'
1377 "
1378 );
1379 if ( empty( $check_option_avatar_dimensions_exists ) ) {
1380 $lp_db->wpdb->query(
1381 "UPDATE $lp_db->tb_options
1382 SET option_name = 'learn_press_avatar_dimensions'
1383 WHERE option_name = 'learn_press_profile_picture_thumbnail_size'
1384 "
1385 );
1386 $lp_db->check_execute_has_error();
1387 }
1388
1389 // Delete value same of column "option_name" before re-create indexes for table options.
1390 $data_sames = $lp_db->wpdb->get_results(
1391 "
1392 SELECT option_id, option_name, COUNT(option_name) as total
1393 FROM $lp_db->tb_options
1394 GROUP BY option_name
1395 HAVING total > 1;
1396 "
1397 );
1398 if ( $data_sames ) {
1399 foreach ( $data_sames as $data_same ) {
1400 $lp_db->wpdb->query(
1401 $lp_db->wpdb->prepare(
1402 "
1403 DELETE FROM $lp_db->tb_options
1404 WHERE option_name = %s
1405 AND option_id != %d
1406 ",
1407 $data_same->option_name,
1408 $data_same->option_id
1409 )
1410 );
1411
1412 $lp_db->check_execute_has_error();
1413 }
1414 }
1415
1416 // Create indexes for table options.
1417 $lp_db->create_indexes_tb_options();
1418 // End.
1419
1420 // Profile rename dashboard to overview.
1421 $learn_press_profile_endpoints = $lp_db->wpdb->get_var(
1422 "
1423 SELECT option_value FROM $lp_db->tb_options
1424 WHERE option_name = 'learn_press_profile_endpoints'
1425 "
1426 );
1427 $lp_db->check_execute_has_error();
1428
1429 $learn_press_profile_endpoints = maybe_unserialize( $learn_press_profile_endpoints );
1430
1431 $learn_press_profile_endpoints_tmp = array();
1432 if ( $learn_press_profile_endpoints ) {
1433 foreach ( $learn_press_profile_endpoints as $k => $val ) {
1434 if ( 'profile-dashboard' === $k ) {
1435 $learn_press_profile_endpoints_tmp['overview'] = $val;
1436 } else {
1437 $learn_press_profile_endpoints_tmp[ str_replace( 'profile-', '', $k ) ] = $val;
1438 }
1439 }
1440 }
1441
1442 $lp_db->wpdb->query(
1443 $lp_db->wpdb->prepare(
1444 "UPDATE $lp_db->tb_options
1445 SET option_value = %s
1446 WHERE option_name = 'learn_press_profile_endpoints'
1447 ",
1448 maybe_serialize( $learn_press_profile_endpoints_tmp )
1449 )
1450 );
1451 $lp_db->check_execute_has_error();
1452
1453 // Course settings.
1454 // Block course by duration.
1455 $lp_db->wpdb->query(
1456 "UPDATE $lp_db->tb_postmeta
1457 SET meta_key = '_lp_block_expire_duration'
1458 WHERE meta_key = '_lp_block_course_item_duration_content'
1459 "
1460 );
1461 $lp_db->check_execute_has_error();
1462
1463 // Block course when finished.
1464 $lp_db->wpdb->query(
1465 "UPDATE $lp_db->tb_postmeta
1466 SET meta_key = '_lp_block_finished'
1467 WHERE meta_key = '_lp_block_lesson_content'
1468 "
1469 );
1470 $lp_db->check_execute_has_error();
1471
1472 // Assessment course by quizzes - Evaluate.
1473 $lp_db->wpdb->query(
1474 "UPDATE $lp_db->tb_postmeta
1475 SET meta_value = 'evaluate_quiz'
1476 WHERE meta_key = '_lp_course_result'
1477 AND meta_value = 'evaluate_quizzes'
1478 "
1479 );
1480 $lp_db->check_execute_has_error();
1481
1482 // End course settings.
1483
1484 // Quiz settings.
1485 $lp_db->wpdb->query(
1486 "
1487 UPDATE $lp_db->tb_postmeta
1488 SET meta_key = 'lp_review'
1489 WHERE meta_key = '_lp_review_questions'
1490 "
1491 );
1492 $lp_db->check_execute_has_error();
1493
1494 $lp_db->wpdb->query(
1495 "
1496 UPDATE $lp_db->tb_postmeta
1497 SET meta_key = '_lp_negative_marking'
1498 WHERE meta_key = '_lp_minus_points'
1499 "
1500 );
1501 $lp_db->check_execute_has_error();
1502
1503 $lp_db->wpdb->query(
1504 "
1505 UPDATE $lp_db->tb_postmeta
1506 SET meta_value = 'yes'
1507 WHERE meta_key = '_lp_negative_marking'
1508 AND meta_value > 0
1509 "
1510 );
1511 $lp_db->check_execute_has_error();
1512
1513 $lp_db->wpdb->query(
1514 "
1515 UPDATE $lp_db->tb_postmeta
1516 SET meta_value = 'no'
1517 WHERE meta_key = '_lp_negative_marking'
1518 AND meta_value != 'yes'
1519 "
1520 );
1521 $lp_db->check_execute_has_error();
1522
1523 // Delete some fields not use.
1524
1525 // Finish upgrade.
1526 update_option( LP_KEY_DB_VERSION, 4 );
1527 // update_option( 'learnpress_version', LEARNPRESS_VERSION );
1528 // delete_option( 'lp_db_need_upgrade' );
1529 } catch ( Exception $e ) {
1530 $response->message = $this->error_step( $response->name, $e->getMessage() );
1531 return $response;
1532 }
1533
1534 return $this->finish_step( $response, __FUNCTION__ . ' finished' );
1535 }
1536 }
1537
1538 LP_Upgrade_4::get_instance();
1539