Version Description
= 0.9.19 = In this version, we have changed a little bit about LearnPress Plugin directory structure and moved all add-ons to become independence plugins. If you face any problems relate to add-ons, please completely remove old version and re-install LearnPress. It does not affect your current data. Thank you.
Download this release
Release Info
Developer | leehld |
Plugin | LearnPress – WordPress LMS Plugin |
Version | 3.0.12.1 |
Comparing to | |
See all releases |
Code changes from version 3.0.11.1 to 3.0.12.1
- assets/js/admin/quiz-editor.js +1 -1
- assets/js/frontend/course.js +3 -1
- assets/js/frontend/quiz.js +8 -3
- inc/class-lp-forms-handler.php +4 -1
- inc/class-lp-preview-course.php +11 -3
- inc/class-lp-query-list-table.php +7 -5
- inc/custom-post-types/lesson.php +1 -1
- inc/lesson/class-lp-lesson.php +2 -2
- inc/lesson/lp-lesson-functions.php +3 -3
- inc/lp-constants.php +1 -1
- inc/lp-core-functions.php +3 -0
- inc/lp-template-functions.php +5 -2
- inc/quiz/class-lp-quiz-factory.php +1 -0
- inc/user-item/class-lp-user-item-course-bk.php +0 -898
- inc/user-item/class-lp-user-item-quiz.php +1 -1
- inc/user/abstract-lp-user.php +4 -1
- inc/user/class-lp-profile.php +12 -12
- inc/user/class-lp-user-factory.php +7 -2
- learnpress.php +2 -2
- readme.txt +22 -3
- templates/profile/tabs/courses/owned.php +2 -3
- templates/profile/tabs/courses/purchased.php +2 -2
assets/js/admin/quiz-editor.js
CHANGED
@@ -933,7 +933,7 @@ var LP_List_Quiz_Questions_Store = (function (Vue, helpers, data, $) {
|
|
933 |
payload['nonce'] = $store.getters.nonce;
|
934 |
payload['lp-ajax'] = $store.getters.action;
|
935 |
|
936 |
-
payload['code'] =
|
937 |
$( '#publishing-action #publish' ).addClass( 'disabled' );
|
938 |
$( '#publishing-action .spinner' ).addClass( 'is-active' );
|
939 |
$( '#publishing-action' ).addClass( 'code-'+payload['code'] );
|
933 |
payload['nonce'] = $store.getters.nonce;
|
934 |
payload['lp-ajax'] = $store.getters.action;
|
935 |
|
936 |
+
payload['code'] = Date.now();
|
937 |
$( '#publishing-action #publish' ).addClass( 'disabled' );
|
938 |
$( '#publishing-action .spinner' ).addClass( 'is-active' );
|
939 |
$( '#publishing-action' ).addClass( 'code-'+payload['code'] );
|
assets/js/frontend/course.js
CHANGED
@@ -451,7 +451,9 @@
|
|
451 |
fitVideo();
|
452 |
|
453 |
fullScreen = window.localStorage && 'yes' === window.localStorage.getItem('lp-full-screen');
|
454 |
-
|
|
|
|
|
455 |
if (fullScreen) {
|
456 |
var curriculumWidth = getCurriculumWidth();
|
457 |
$body.addClass('full-screen-content-item');
|
451 |
fitVideo();
|
452 |
|
453 |
fullScreen = window.localStorage && 'yes' === window.localStorage.getItem('lp-full-screen');
|
454 |
+
if($(window).width()<=768){
|
455 |
+
fullScreen = true;
|
456 |
+
}
|
457 |
if (fullScreen) {
|
458 |
var curriculumWidth = getCurriculumWidth();
|
459 |
$body.addClass('full-screen-content-item');
|
assets/js/frontend/quiz.js
CHANGED
@@ -63,9 +63,8 @@
|
|
63 |
}
|
64 |
|
65 |
if (overtime) {
|
66 |
-
|
67 |
-
|
68 |
-
//
|
69 |
return;
|
70 |
}
|
71 |
thisSettings.remainingTime--;
|
@@ -143,6 +142,12 @@
|
|
143 |
return remainingTime;
|
144 |
}
|
145 |
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
init();
|
147 |
}
|
148 |
|
63 |
}
|
64 |
|
65 |
if (overtime) {
|
66 |
+
$('form.complete-quiz').off('submit.learn-press-confirm');
|
67 |
+
callbackEvents.callEvent('finish');
|
|
|
68 |
return;
|
69 |
}
|
70 |
thisSettings.remainingTime--;
|
142 |
return remainingTime;
|
143 |
}
|
144 |
|
145 |
+
if(thisSettings.remainingTime <= 0){
|
146 |
+
// Disable confirm message
|
147 |
+
$('form.complete-quiz').off('submit.learn-press-confirm');
|
148 |
+
callbackEvents.callEvent('finish');
|
149 |
+
}
|
150 |
+
|
151 |
init();
|
152 |
}
|
153 |
|
inc/class-lp-forms-handler.php
CHANGED
@@ -152,10 +152,13 @@ class LP_Forms_Handler {
|
|
152 |
|
153 |
learn_press_add_message( $message, 'success' );
|
154 |
}
|
|
|
|
|
|
|
155 |
|
156 |
learn_press_maybe_send_json( $result, 'learn_press_print_messages' );
|
157 |
|
158 |
-
if ( ( $result['result'] === 'success' ) && $redirect
|
159 |
wp_redirect( $redirect );
|
160 |
exit();
|
161 |
}
|
152 |
|
153 |
learn_press_add_message( $message, 'success' );
|
154 |
}
|
155 |
+
if ( ! $redirect = LP_Request::get( 'redirect_to' ) ) {
|
156 |
+
$redirect = LP_Request::get_redirect( learn_press_get_current_url() );
|
157 |
+
}
|
158 |
|
159 |
learn_press_maybe_send_json( $result, 'learn_press_print_messages' );
|
160 |
|
161 |
+
if ( ( $result['result'] === 'success' ) && $redirect ) {
|
162 |
wp_redirect( $redirect );
|
163 |
exit();
|
164 |
}
|
inc/class-lp-preview-course.php
CHANGED
@@ -150,8 +150,7 @@ class LP_Preview_Course {
|
|
150 |
|
151 |
//learn_press_debug($_SERVER);die();
|
152 |
|
153 |
-
}
|
154 |
-
catch ( Exception $ex ) {
|
155 |
learn_press_add_message( $ex->getMessage(), 'error' );
|
156 |
wp_redirect( get_home_url() );
|
157 |
exit();
|
@@ -229,7 +228,16 @@ class LP_Preview_Course {
|
|
229 |
|
230 |
public static function reduce_counts( $counts, $type, $perm ) {
|
231 |
if ( ( LP_COURSE_CPT === $type ) && ( $ids = self::get_preview_courses() ) ) {
|
232 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
233 |
}
|
234 |
|
235 |
return $counts;
|
150 |
|
151 |
//learn_press_debug($_SERVER);die();
|
152 |
|
153 |
+
} catch ( Exception $ex ) {
|
|
|
154 |
learn_press_add_message( $ex->getMessage(), 'error' );
|
155 |
wp_redirect( get_home_url() );
|
156 |
exit();
|
228 |
|
229 |
public static function reduce_counts( $counts, $type, $perm ) {
|
230 |
if ( ( LP_COURSE_CPT === $type ) && ( $ids = self::get_preview_courses() ) ) {
|
231 |
+
foreach ( $ids as $id ) {
|
232 |
+
switch ( get_post_status( $id ) ) {
|
233 |
+
case 'draft':
|
234 |
+
$counts->draft -= 1;
|
235 |
+
break;
|
236 |
+
default:
|
237 |
+
$counts->publish -= 1;
|
238 |
+
break;
|
239 |
+
}
|
240 |
+
}
|
241 |
}
|
242 |
|
243 |
return $counts;
|
inc/class-lp-query-list-table.php
CHANGED
@@ -92,8 +92,10 @@ class LP_Query_List_Table implements ArrayAccess {
|
|
92 |
*
|
93 |
* @return string
|
94 |
*/
|
95 |
-
public function get_nav_numbers( $echo = true ) {
|
96 |
-
|
|
|
|
|
97 |
if ( ! empty( $this->_data['nav_base'] ) ) {
|
98 |
if ( is_callable( $this->_data['nav_base'] ) ) {
|
99 |
$base = call_user_func_array( $this->_data['nav_base'], array( $this->_data['nav_format'] ) );
|
@@ -101,7 +103,7 @@ class LP_Query_List_Table implements ArrayAccess {
|
|
101 |
$base = $this->_data['nav_base'];
|
102 |
}
|
103 |
} else {
|
104 |
-
$base = trailingslashit( preg_replace( '~\/[0-9]+\/?$~', '',
|
105 |
}
|
106 |
|
107 |
return learn_press_paging_nav(
|
@@ -161,10 +163,10 @@ class LP_Query_List_Table implements ArrayAccess {
|
|
161 |
return $output;
|
162 |
}
|
163 |
|
164 |
-
public function get_nav( $format = '', $echo = false ) {
|
165 |
$output = '';
|
166 |
$offset = $this->get_offset_text( empty( $format ) ? $this->_data['format'] : $format, false );
|
167 |
-
$numbers = $this->get_nav_numbers( false );
|
168 |
|
169 |
if ( $offset && $numbers ) {
|
170 |
$output = sprintf( '<div class="learn-press-nav-items">%s%s</div>', $offset, $numbers );
|
92 |
*
|
93 |
* @return string
|
94 |
*/
|
95 |
+
public function get_nav_numbers( $echo = true, $base_url='' ) {
|
96 |
+
if( !$base_url ) {
|
97 |
+
$base_url = learn_press_get_current_url();
|
98 |
+
}
|
99 |
if ( ! empty( $this->_data['nav_base'] ) ) {
|
100 |
if ( is_callable( $this->_data['nav_base'] ) ) {
|
101 |
$base = call_user_func_array( $this->_data['nav_base'], array( $this->_data['nav_format'] ) );
|
103 |
$base = $this->_data['nav_base'];
|
104 |
}
|
105 |
} else {
|
106 |
+
$base = trailingslashit( preg_replace( '~\/[0-9]+\/?$~', '', $base_url ) );
|
107 |
}
|
108 |
|
109 |
return learn_press_paging_nav(
|
163 |
return $output;
|
164 |
}
|
165 |
|
166 |
+
public function get_nav( $format = '', $echo = false, $base_url = '' ) {
|
167 |
$output = '';
|
168 |
$offset = $this->get_offset_text( empty( $format ) ? $this->_data['format'] : $format, false );
|
169 |
+
$numbers = $this->get_nav_numbers( false, $base_url );
|
170 |
|
171 |
if ( $offset && $numbers ) {
|
172 |
$output = sprintf( '<div class="learn-press-nav-items">%s%s</div>', $offset, $numbers );
|
inc/custom-post-types/lesson.php
CHANGED
@@ -185,7 +185,7 @@ if ( ! class_exists( 'LP_Lesson_Post_Type' ) ) {
|
|
185 |
$query = $wpdb->prepare( "
|
186 |
SELECT COUNT(ID)
|
187 |
FROM {$wpdb->posts} p
|
188 |
-
WHERE p.post_type = %s
|
189 |
", LP_LESSON_CPT );
|
190 |
|
191 |
return $wpdb->get_var( $query ) - $this->get_preview_items();
|
185 |
$query = $wpdb->prepare( "
|
186 |
SELECT COUNT(ID)
|
187 |
FROM {$wpdb->posts} p
|
188 |
+
WHERE p.post_type = %s AND p.post_status NOT LIKE 'auto-draft'
|
189 |
", LP_LESSON_CPT );
|
190 |
|
191 |
return $wpdb->get_var( $query ) - $this->get_preview_items();
|
inc/lesson/class-lp-lesson.php
CHANGED
@@ -170,11 +170,11 @@ if ( ! function_exists( 'LP_Lesson' ) ) {
|
|
170 |
*/
|
171 |
public static function get_default_meta() {
|
172 |
$meta = array(
|
173 |
-
'duration' => '
|
174 |
'preview' => 'no'
|
175 |
);
|
176 |
|
177 |
-
return apply_filters( 'learn-press/course/default-meta', $meta );
|
178 |
}
|
179 |
|
180 |
/**
|
170 |
*/
|
171 |
public static function get_default_meta() {
|
172 |
$meta = array(
|
173 |
+
'duration' => '0 minute',
|
174 |
'preview' => 'no'
|
175 |
);
|
176 |
|
177 |
+
return apply_filters( 'learn-press/course/lesson/default-meta', $meta );
|
178 |
}
|
179 |
|
180 |
/**
|
inc/lesson/lp-lesson-functions.php
CHANGED
@@ -43,9 +43,9 @@ function learn_press_lesson_comment_form() {
|
|
43 |
|
44 |
$user = learn_press_get_current_user();
|
45 |
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
|
50 |
if ( $lesson->setup_postdata() ) {
|
51 |
|
43 |
|
44 |
$user = learn_press_get_current_user();
|
45 |
|
46 |
+
// if ( ! $user->is_admin() && ! $user->has_course_status( $course->get_id(), array( 'enrolled', 'finished' ) ) ) {
|
47 |
+
// return;
|
48 |
+
// }
|
49 |
|
50 |
if ( $lesson->setup_postdata() ) {
|
51 |
|
inc/lp-constants.php
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
*/
|
5 |
$upload_dir = wp_upload_dir();
|
6 |
// version
|
7 |
-
define( 'LEARNPRESS_VERSION', '3.0.
|
8 |
|
9 |
define( 'LP_WP_CONTENT', basename( WP_CONTENT_DIR ) );
|
10 |
|
4 |
*/
|
5 |
$upload_dir = wp_upload_dir();
|
6 |
// version
|
7 |
+
define( 'LEARNPRESS_VERSION', '3.0.12.1' );
|
8 |
|
9 |
define( 'LP_WP_CONTENT', basename( WP_CONTENT_DIR ) );
|
10 |
|
inc/lp-core-functions.php
CHANGED
@@ -2407,6 +2407,9 @@ function learn_press_auto_enroll_user_to_courses( $order_id ) {
|
|
2407 |
if ( $user->has_enrolled_course( $course->get_id() ) ) {
|
2408 |
continue;
|
2409 |
}
|
|
|
|
|
|
|
2410 |
// error. this scripts will create new order each course item
|
2411 |
$return = learn_press_update_user_item_field( array(
|
2412 |
'user_id' => $user->get_id(),
|
2407 |
if ( $user->has_enrolled_course( $course->get_id() ) ) {
|
2408 |
continue;
|
2409 |
}
|
2410 |
+
if( !$user->can_enroll_course($course->get_id()) ) {
|
2411 |
+
continue;
|
2412 |
+
}
|
2413 |
// error. this scripts will create new order each course item
|
2414 |
$return = learn_press_update_user_item_field( array(
|
2415 |
'user_id' => $user->get_id(),
|
inc/lp-template-functions.php
CHANGED
@@ -579,6 +579,8 @@ if ( ! function_exists( 'learn_press_get_course_tabs' ) ) {
|
|
579 |
if ( $request_tab === $v['id'] ) {
|
580 |
$v['active'] = true;
|
581 |
$has_active = $k;
|
|
|
|
|
582 |
}
|
583 |
$tabs[ $k ] = $v;
|
584 |
}
|
@@ -2884,7 +2886,7 @@ if ( ! function_exists( 'learn_press_content_item_lesson_content' ) ) {
|
|
2884 |
|
2885 |
return;
|
2886 |
}
|
2887 |
-
|
2888 |
learn_press_get_template( 'content-lesson/content.php' );
|
2889 |
}
|
2890 |
}
|
@@ -3054,6 +3056,7 @@ function learn_press_course_comments_open( $open, $post_id ) {
|
|
3054 |
if ( LP_COURSE_CPT == $post->post_type ) {
|
3055 |
$open = false;
|
3056 |
}
|
|
|
3057 |
return $open;
|
3058 |
}
|
3059 |
|
@@ -3772,7 +3775,7 @@ function learn_press_get_link_current_question_instead_of_continue_button( $link
|
|
3772 |
$user = LP_Global::user();
|
3773 |
$course = $item->get_course();
|
3774 |
$quiz_data = $user->get_item_data( $item->get_id(), $course->get_id() );
|
3775 |
-
if ( $quiz_data->get_status() === 'started' ) {
|
3776 |
$link = $item->get_question_link( $quiz_data->get_current_question() );
|
3777 |
}
|
3778 |
}
|
579 |
if ( $request_tab === $v['id'] ) {
|
580 |
$v['active'] = true;
|
581 |
$has_active = $k;
|
582 |
+
} elseif(isset($v['active']) && $v['active'] ){
|
583 |
+
$has_active = true;
|
584 |
}
|
585 |
$tabs[ $k ] = $v;
|
586 |
}
|
2886 |
|
2887 |
return;
|
2888 |
}
|
2889 |
+
do_action( 'learn-press/lesson-start', $item );
|
2890 |
learn_press_get_template( 'content-lesson/content.php' );
|
2891 |
}
|
2892 |
}
|
3056 |
if ( LP_COURSE_CPT == $post->post_type ) {
|
3057 |
$open = false;
|
3058 |
}
|
3059 |
+
|
3060 |
return $open;
|
3061 |
}
|
3062 |
|
3775 |
$user = LP_Global::user();
|
3776 |
$course = $item->get_course();
|
3777 |
$quiz_data = $user->get_item_data( $item->get_id(), $course->get_id() );
|
3778 |
+
if ( $quiz_data && $quiz_data->get_status() === 'started' ) {
|
3779 |
$link = $item->get_question_link( $quiz_data->get_current_question() );
|
3780 |
}
|
3781 |
}
|
inc/quiz/class-lp-quiz-factory.php
CHANGED
@@ -359,6 +359,7 @@ if ( ! class_exists( 'LP_Quiz_Factory' ) ) {
|
|
359 |
|
360 |
// Redirecting...
|
361 |
if ( ! empty( $result['redirect'] ) ) {
|
|
|
362 |
wp_redirect( $result['redirect'] );
|
363 |
exit();
|
364 |
}
|
359 |
|
360 |
// Redirecting...
|
361 |
if ( ! empty( $result['redirect'] ) ) {
|
362 |
+
wp_cache_flush();
|
363 |
wp_redirect( $result['redirect'] );
|
364 |
exit();
|
365 |
}
|
inc/user-item/class-lp-user-item-course-bk.php
DELETED
@@ -1,898 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
/**
|
4 |
-
* Class LP_User_Item_Course
|
5 |
-
*/
|
6 |
-
class LP_User_Item_CourseY extends LP_User_Item implements ArrayAccess {
|
7 |
-
/**
|
8 |
-
* Course's items
|
9 |
-
*
|
10 |
-
* @var array
|
11 |
-
*/
|
12 |
-
protected $_items = false;
|
13 |
-
|
14 |
-
/**
|
15 |
-
* Course
|
16 |
-
*
|
17 |
-
* @var LP_Course
|
18 |
-
*/
|
19 |
-
protected $_course = 0;
|
20 |
-
|
21 |
-
/**
|
22 |
-
* @var LP_User
|
23 |
-
*/
|
24 |
-
protected $_user = 0;
|
25 |
-
|
26 |
-
/**
|
27 |
-
* @var array
|
28 |
-
*/
|
29 |
-
protected $_items_by_item_ids = array();
|
30 |
-
|
31 |
-
/**
|
32 |
-
* @var bool
|
33 |
-
*/
|
34 |
-
protected $_loaded = false;
|
35 |
-
|
36 |
-
/**
|
37 |
-
* @var LP_User_CURD
|
38 |
-
*/
|
39 |
-
protected $_curd = null;
|
40 |
-
|
41 |
-
/**
|
42 |
-
* LP_User_Item_Course constructor.
|
43 |
-
*
|
44 |
-
* @param null $item
|
45 |
-
*/
|
46 |
-
public function __construct( $item ) {
|
47 |
-
|
48 |
-
parent::__construct( $item );
|
49 |
-
|
50 |
-
$this->_curd = new LP_User_CURD();
|
51 |
-
$this->_changes = array();
|
52 |
-
$this->load();
|
53 |
-
}
|
54 |
-
|
55 |
-
public function load() {
|
56 |
-
if ( ! $this->_loaded ) {
|
57 |
-
$this->read_items();
|
58 |
-
//$this->read_items_meta();
|
59 |
-
$this->_loaded = true;
|
60 |
-
}
|
61 |
-
}
|
62 |
-
|
63 |
-
/**
|
64 |
-
* Read items's data of course for the user.
|
65 |
-
*/
|
66 |
-
public function read_items() {
|
67 |
-
$this->_items = array();
|
68 |
-
$this->_course = learn_press_get_course( $this->get_id() );
|
69 |
-
|
70 |
-
if ( ! $this->_course || ( ! $user_course_item_id = $this->get_user_item_id() ) ) {
|
71 |
-
return false;
|
72 |
-
}
|
73 |
-
$course_items = $this->_course->get_item_ids();
|
74 |
-
|
75 |
-
if ( ! $course_items ) {
|
76 |
-
return false;
|
77 |
-
}
|
78 |
-
|
79 |
-
if ( $user_course_items = $this->_curd->read_course_items_by_user_item_id( $user_course_item_id ) ) {
|
80 |
-
|
81 |
-
// Convert keys of array from numeric to keys is item id
|
82 |
-
foreach ( array_keys( $user_course_items ) as $key ) {
|
83 |
-
$user_course_item = $user_course_items[ $key ];
|
84 |
-
$user_course_items[ $user_course_item->item_id ] = $user_course_item;
|
85 |
-
unset( $user_course_items[ $key ] );
|
86 |
-
}
|
87 |
-
} else {
|
88 |
-
$user_course_items = array();
|
89 |
-
}
|
90 |
-
|
91 |
-
foreach ( $course_items as $item_id ) {
|
92 |
-
|
93 |
-
if ( ! empty( $user_course_items[ $item_id ] ) ) {
|
94 |
-
$user_course_item = (array) $user_course_items[ $item_id ];
|
95 |
-
} else {
|
96 |
-
$user_course_item = array(
|
97 |
-
'item_id' => $item_id,
|
98 |
-
'ref_id' => $this->get_id(),
|
99 |
-
'parent_id' => $user_course_item_id
|
100 |
-
);
|
101 |
-
}
|
102 |
-
|
103 |
-
if ( $course_item = apply_filters( 'learn-press/user-course-item', LP_User_Item::get_item_object( $user_course_item ), $user_course_item, $this ) ) {
|
104 |
-
$this->_items[ $item_id ] = $course_item;
|
105 |
-
$this->_items_by_item_ids[ $course_item->get_user_item_id() ] = $item_id;
|
106 |
-
}
|
107 |
-
}
|
108 |
-
|
109 |
-
return true;
|
110 |
-
}
|
111 |
-
|
112 |
-
public function is_exceeded() {
|
113 |
-
$exceeded = DAY_IN_SECONDS * 360 * 100;
|
114 |
-
|
115 |
-
if ( ! $course = $this->get_course() ) {
|
116 |
-
return $exceeded;
|
117 |
-
}
|
118 |
-
|
119 |
-
if ( ! $course->get_duration() ) {
|
120 |
-
return $exceeded;
|
121 |
-
}
|
122 |
-
|
123 |
-
return parent::is_exceeded();
|
124 |
-
}
|
125 |
-
|
126 |
-
public function get_finishing_type() {
|
127 |
-
if ( ! $type = $this->get_meta( 'finishing_type' ) ) {
|
128 |
-
$type = $this->is_exceeded() <= 0 ? 'exceeded' : 'click';
|
129 |
-
learn_press_update_user_item_meta( $this->get_user_item_id(), 'finishing_type', $type );
|
130 |
-
$this->set_meta( 'finishing_type', $type );
|
131 |
-
}
|
132 |
-
|
133 |
-
return $type;
|
134 |
-
}
|
135 |
-
|
136 |
-
/**
|
137 |
-
* Read item meta.
|
138 |
-
*
|
139 |
-
* @return mixed|bool
|
140 |
-
*/
|
141 |
-
public function read_items_meta() {
|
142 |
-
|
143 |
-
$item_ids = array();
|
144 |
-
if ( $this->_items ) {
|
145 |
-
foreach ( $this->_items as $item ) {
|
146 |
-
if ( $item->get_user_item_id() ) {
|
147 |
-
$item_ids[ $item->get_user_item_id() ] = $item->get_item_id();
|
148 |
-
}
|
149 |
-
}
|
150 |
-
}
|
151 |
-
|
152 |
-
if ( ! $item_ids ) {
|
153 |
-
return false;
|
154 |
-
}
|
155 |
-
|
156 |
-
global $wpdb;
|
157 |
-
$meta_ids = array_keys( $item_ids );
|
158 |
-
$format = array_fill( 0, sizeof( $meta_ids ), '%d' );
|
159 |
-
$sql = $wpdb->prepare( "
|
160 |
-
SELECT *
|
161 |
-
FROM {$wpdb->learnpress_user_itemmeta}
|
162 |
-
WHERE learnpress_user_item_id IN(" . join( ',', $format ) . ")
|
163 |
-
", $meta_ids );
|
164 |
-
|
165 |
-
if ( $results = $wpdb->get_results( $sql ) ) {
|
166 |
-
foreach ( $results as $result ) {
|
167 |
-
$item_id = $item_ids[ $result->learnpress_user_item_id ];
|
168 |
-
|
169 |
-
if ( $item_id === $this->get_item_id() ) {
|
170 |
-
$this->add_meta( $result );
|
171 |
-
} else {
|
172 |
-
$item = $this->get_item( $item_id );
|
173 |
-
$result->meta_value = LP_Helper::maybe_unserialize( $result->meta_value );
|
174 |
-
|
175 |
-
$item->add_meta( $result );
|
176 |
-
}
|
177 |
-
}
|
178 |
-
}
|
179 |
-
|
180 |
-
return $this->_meta_data;
|
181 |
-
}
|
182 |
-
|
183 |
-
public function offsetSet( $offset, $value ) {
|
184 |
-
//$this->set_data( $offset, $value );
|
185 |
-
// Do not allow to set value directly!
|
186 |
-
}
|
187 |
-
|
188 |
-
public function offsetUnset( $offset ) {
|
189 |
-
// Do not allow to unset value directly!
|
190 |
-
}
|
191 |
-
|
192 |
-
public function offsetGet( $offset ) {
|
193 |
-
$this->load();
|
194 |
-
|
195 |
-
return $this->offsetExists( $offset ) ? $this->_items[ $offset ] : false;
|
196 |
-
}
|
197 |
-
|
198 |
-
public function offsetExists( $offset ) {
|
199 |
-
$this->load();
|
200 |
-
|
201 |
-
return array_key_exists( $offset, $this->_items );
|
202 |
-
}
|
203 |
-
|
204 |
-
public function evaluate() {
|
205 |
-
|
206 |
-
}
|
207 |
-
|
208 |
-
/**
|
209 |
-
* @return LP_User_Item|bool
|
210 |
-
*/
|
211 |
-
public function get_viewing_item() {
|
212 |
-
$item = LP_Global::course_item();
|
213 |
-
if ( $item ) {
|
214 |
-
return $this[ $item->get_id() ];
|
215 |
-
}
|
216 |
-
|
217 |
-
return false;
|
218 |
-
}
|
219 |
-
|
220 |
-
public function get_course( $return = '' ) {
|
221 |
-
$cid = $this->get_data( 'item_id' );
|
222 |
-
if ( $return == '' ) {
|
223 |
-
return $cid ? learn_press_get_course( $cid ) : false;
|
224 |
-
}
|
225 |
-
|
226 |
-
return $cid;
|
227 |
-
}
|
228 |
-
|
229 |
-
/**
|
230 |
-
* Get result of course.
|
231 |
-
*
|
232 |
-
* @param string $prop
|
233 |
-
*
|
234 |
-
* @return float|int
|
235 |
-
*/
|
236 |
-
public function get_results( $prop = 'result' ) {
|
237 |
-
|
238 |
-
if ( ! $course = $this->get_course() ) {
|
239 |
-
return false;
|
240 |
-
}
|
241 |
-
|
242 |
-
$this->load();
|
243 |
-
$course_result = $course->get_data( 'course_result' );
|
244 |
-
$results = false;
|
245 |
-
switch ( $course_result ) {
|
246 |
-
// Completed lessons per total
|
247 |
-
case 'evaluate_lesson':
|
248 |
-
$results = $this->_evaluate_course_by_lesson();
|
249 |
-
break;
|
250 |
-
// Results of final quiz
|
251 |
-
case 'evaluate_final_quiz':
|
252 |
-
$results = $this->_evaluate_course_by_final_quiz();
|
253 |
-
break;
|
254 |
-
// Points of quizzes per points of all quizzes
|
255 |
-
case 'evaluate_quizzes':
|
256 |
-
$results = $this->_evaluate_course_by_quizzes();
|
257 |
-
break;
|
258 |
-
// Points of passed quizzes per points of all quizzes
|
259 |
-
case 'evaluate_passed_quizzes':
|
260 |
-
$results = $this->_evaluate_course_by_passed_quizzes();
|
261 |
-
break;
|
262 |
-
// Points of completed (may not passed) quizzes per points of all quizzes
|
263 |
-
case 'evaluate_quiz':
|
264 |
-
$results = $this->_evaluate_course_by_completed_quizzes();
|
265 |
-
break;
|
266 |
-
default:
|
267 |
-
$results = apply_filters( 'learn-press/evaluate_passed_conditions', $course_result, $this );
|
268 |
-
break;
|
269 |
-
}
|
270 |
-
|
271 |
-
if ( is_array( $results ) ) {
|
272 |
-
$count_items = $course->count_items( '', true );
|
273 |
-
$completed_items = $this->get_completed_items();
|
274 |
-
$results = array_merge(
|
275 |
-
$results,
|
276 |
-
array(
|
277 |
-
'count_items' => $count_items,
|
278 |
-
'completed_items' => $completed_items,
|
279 |
-
'skipped_items' => $count_items - $completed_items,
|
280 |
-
'status' => $this->get_status(),
|
281 |
-
'grade' => ''
|
282 |
-
)
|
283 |
-
);
|
284 |
-
|
285 |
-
if ( ! in_array( $this->get_status(), array( 'purchased', 'viewed' ) ) ) {
|
286 |
-
$results['grade'] = $this->is_finished() ? $this->_is_passed( $results['result'] ) : 'in-progress';
|
287 |
-
} else {
|
288 |
-
}
|
289 |
-
}
|
290 |
-
|
291 |
-
if ( $prop === 'status' ) {
|
292 |
-
if ( isset( $results['grade'] ) ) {
|
293 |
-
$prop = 'grade';
|
294 |
-
}
|
295 |
-
}
|
296 |
-
|
297 |
-
///$result = wp_cache_get( 'user-course-' . $this->get_user_id() . '-' . $this->get_id(), 'learn-press/user-course-results' );
|
298 |
-
|
299 |
-
return $prop && $results && array_key_exists( $prop, $results ) ? $results[ $prop ] : $results;
|
300 |
-
}
|
301 |
-
|
302 |
-
/**
|
303 |
-
* @param string $context
|
304 |
-
*
|
305 |
-
* @return string
|
306 |
-
*/
|
307 |
-
public function get_grade( $context = '' ) {
|
308 |
-
$grade = $this->get_results( 'grade' );
|
309 |
-
|
310 |
-
return $context == 'display' ? learn_press_course_grade_html( $grade, false ) : $grade;
|
311 |
-
}
|
312 |
-
|
313 |
-
/**
|
314 |
-
* @return bool
|
315 |
-
*/
|
316 |
-
public function is_passed() {
|
317 |
-
return $this->get_grade() == 'passed';
|
318 |
-
}
|
319 |
-
|
320 |
-
/**
|
321 |
-
* @param int $decimal
|
322 |
-
*
|
323 |
-
* @return int|string
|
324 |
-
*/
|
325 |
-
public function get_percent_result( $decimal = 1 ) {
|
326 |
-
return apply_filters( 'learn-press/user/course-percent-result', sprintf( '%s%%', round( $this->get_results( 'result' ), $decimal ), $this->get_user_id(), $this->get_item_id() ) );
|
327 |
-
}
|
328 |
-
|
329 |
-
/**
|
330 |
-
* Evaluate course result by lessons.
|
331 |
-
*
|
332 |
-
* @return array
|
333 |
-
*/
|
334 |
-
protected function _evaluate_course_by_lesson() {
|
335 |
-
|
336 |
-
$cache_key = 'user-course-' . $this->get_user_id() . '-' . $this->get_id();
|
337 |
-
|
338 |
-
if ( false === ( $cached_data = wp_cache_get( $cache_key, 'learn-press/course-results' ) ) || ! array_key_exists( 'lessons', $cached_data ) ) {
|
339 |
-
$completing = $this->get_completed_items( LP_LESSON_CPT, true );
|
340 |
-
if ( $completing[1] ) {
|
341 |
-
$result = $completing[0] / $completing[1];
|
342 |
-
} else {
|
343 |
-
$result = 0;
|
344 |
-
}
|
345 |
-
$result *= 100;
|
346 |
-
$data = array(
|
347 |
-
'result' => $result,
|
348 |
-
'grade' => $this->is_finished() ? $this->_is_passed( $result ) : '',
|
349 |
-
'status' => $this->get_status()
|
350 |
-
);
|
351 |
-
|
352 |
-
settype( $cached_data, 'array' );
|
353 |
-
$cached_data['lessons'] = $data;
|
354 |
-
|
355 |
-
wp_cache_set( $cache_key, $cached_data, 'learn-press/course-results' );
|
356 |
-
}
|
357 |
-
|
358 |
-
return isset( $cached_data['lessons'] ) ? $cached_data['lessons'] : array();
|
359 |
-
}
|
360 |
-
|
361 |
-
/**
|
362 |
-
* Finish course for user
|
363 |
-
*
|
364 |
-
* @return int
|
365 |
-
*/
|
366 |
-
public function finish() {
|
367 |
-
|
368 |
-
$return = parent::complete( 'finished' );
|
369 |
-
|
370 |
-
return $return;
|
371 |
-
}
|
372 |
-
|
373 |
-
/**
|
374 |
-
* Evaluate course result by final quiz.
|
375 |
-
*
|
376 |
-
* @return array
|
377 |
-
*/
|
378 |
-
protected function _evaluate_course_by_final_quiz() {
|
379 |
-
|
380 |
-
$cache_key = 'user-course-' . $this->get_user_id() . '-' . $this->get_id();
|
381 |
-
|
382 |
-
if ( false === ( $cached_data = wp_cache_get( $cache_key, 'learn-press/course-results' ) ) || ! array_key_exists( 'final-quiz', $cached_data ) ) {
|
383 |
-
$course = $this->get_course();
|
384 |
-
$final_quiz = $course->get_final_quiz();
|
385 |
-
$result = false;
|
386 |
-
if ( $user_quiz = $this->get_item( $final_quiz ) ) {
|
387 |
-
$result = $user_quiz->get_results( false );
|
388 |
-
}
|
389 |
-
|
390 |
-
$percent = $result ? $result['result'] : 0;
|
391 |
-
$data = array(
|
392 |
-
'result' => $percent,
|
393 |
-
'grade' => $this->is_finished() ? $this->_is_passed( $percent ) : '',
|
394 |
-
'status' => $this->get_status()
|
395 |
-
);
|
396 |
-
settype( $cached_data, 'array' );
|
397 |
-
$cached_data['final-quiz'] = $data;
|
398 |
-
|
399 |
-
wp_cache_set( $cache_key, $cached_data, 'learn-press/course-results' );
|
400 |
-
}
|
401 |
-
|
402 |
-
return isset( $cached_data['final-quiz'] ) ? $cached_data['final-quiz'] : array();
|
403 |
-
}
|
404 |
-
|
405 |
-
/**
|
406 |
-
* Evaluate course result by point of quizzes doing/done per total quizzes.
|
407 |
-
*
|
408 |
-
* @return array
|
409 |
-
*/
|
410 |
-
protected function _evaluate_course_by_quizzes() {
|
411 |
-
|
412 |
-
$cache_key = 'user-course-' . $this->get_user_id() . '-' . $this->get_id();
|
413 |
-
|
414 |
-
if ( ( false === ( $cached_data = wp_cache_get( $cache_key, 'learn-press/course-results' ) ) ) || ! array_key_exists( 'quizzes', $cached_data ) ) {
|
415 |
-
|
416 |
-
$data = array( 'result' => 0, 'grade' => '', 'status' => $this->get_status() );
|
417 |
-
$result = 0;
|
418 |
-
$result_of_items = 0;
|
419 |
-
|
420 |
-
if ( $items = $this->get_items() ) {
|
421 |
-
foreach ( $items as $item ) {
|
422 |
-
if ( $item->get_type() !== LP_QUIZ_CPT ) {
|
423 |
-
continue;
|
424 |
-
}
|
425 |
-
if ( $item->get_quiz()->get_data( 'passing_grade' ) ) {
|
426 |
-
$result += $item->get_results( 'result' );
|
427 |
-
$result_of_items ++;
|
428 |
-
}
|
429 |
-
}
|
430 |
-
$result = $result_of_items ? $result / $result_of_items : 0;
|
431 |
-
$data['result'] = $result;
|
432 |
-
if ( $this->is_finished() ) {
|
433 |
-
$data['grade'] = $this->_is_passed( $result );
|
434 |
-
}
|
435 |
-
}
|
436 |
-
|
437 |
-
settype( $cached_data, 'array' );
|
438 |
-
$cached_data['quizzes'] = $data;
|
439 |
-
|
440 |
-
wp_cache_set( $cache_key, $cached_data, 'learn-press/course-results' );
|
441 |
-
}
|
442 |
-
|
443 |
-
return isset( $cached_data['quizzes'] ) ? $cached_data['quizzes'] : array();
|
444 |
-
}
|
445 |
-
|
446 |
-
/**
|
447 |
-
* Evaluate course result by point of quizzes doing/done per total quizzes.
|
448 |
-
*
|
449 |
-
* @return array
|
450 |
-
*/
|
451 |
-
protected function _evaluate_course_by_passed_quizzes() {
|
452 |
-
|
453 |
-
$cache_key = 'user-course-' . $this->get_user_id() . '-' . $this->get_id();
|
454 |
-
|
455 |
-
if ( false === ( $cached_data = wp_cache_get( $cache_key, 'learn-press/course-results' ) ) || ! array_key_exists( 'passed-quizzes', $cached_data ) ) {
|
456 |
-
|
457 |
-
$data = array( 'result' => 0, 'grade' => '', 'status' => $this->get_status() );
|
458 |
-
$result = 0;
|
459 |
-
$result_of_items = 0;
|
460 |
-
if ( $items = $this->get_items() ) {
|
461 |
-
foreach ( $items as $item ) {
|
462 |
-
if ( $item->get_type() !== LP_QUIZ_CPT ) {
|
463 |
-
continue;
|
464 |
-
}
|
465 |
-
if ( $item->get_quiz()->get_data( 'passing_grade' ) ) {
|
466 |
-
$result += $item->is_passed() ? $item->get_results( 'result' ) : 0;
|
467 |
-
$result_of_items ++;
|
468 |
-
}
|
469 |
-
}
|
470 |
-
$result = $result_of_items ? $result / $result_of_items : 0;
|
471 |
-
$data['result'] = $result;
|
472 |
-
|
473 |
-
if ( $this->is_finished() ) {
|
474 |
-
$data['grade'] = $this->_is_passed( $result );
|
475 |
-
}
|
476 |
-
}
|
477 |
-
|
478 |
-
settype( $cached_data, 'array' );
|
479 |
-
$cached_data['passed-quizzes'] = $data;
|
480 |
-
|
481 |
-
wp_cache_set( $cache_key, $cached_data, 'learn-press/course-results' );
|
482 |
-
}
|
483 |
-
|
484 |
-
return isset( $cached_data['passed-quizzes'] ) ? $cached_data['passed-quizzes'] : array();
|
485 |
-
}
|
486 |
-
|
487 |
-
/**
|
488 |
-
* Evaluate course result by number of passed quizzes per total quizzes.
|
489 |
-
*
|
490 |
-
* @return array
|
491 |
-
*/
|
492 |
-
protected function _evaluate_course_by_completed_quizzes() {
|
493 |
-
$cache_key = 'user-course-' . $this->get_user_id() . '-' . $this->get_id();
|
494 |
-
|
495 |
-
if ( false === ( $cached_data = wp_cache_get( $cache_key, 'learn-press/course-results' ) ) || ! array_key_exists( 'completed-quizzes', $cached_data ) ) {
|
496 |
-
$course = $this->get_course();
|
497 |
-
|
498 |
-
$data = array( 'result' => 0, 'grade' => '', 'status' => $this->get_status() );
|
499 |
-
$result = 0;
|
500 |
-
|
501 |
-
if ( $items = $this->get_items() ) {
|
502 |
-
$result_of_items = 0;
|
503 |
-
foreach ( $items as $item ) {
|
504 |
-
if ( $item->get_type() !== LP_QUIZ_CPT ) {
|
505 |
-
continue;
|
506 |
-
}
|
507 |
-
if ( $item->get_quiz()->get_data( 'passing_grade' ) ) {
|
508 |
-
$result += $item->is_passed() ? 1 : 0;
|
509 |
-
$result_of_items ++;
|
510 |
-
}
|
511 |
-
}
|
512 |
-
$result = $result_of_items ? $result * 100 / $result_of_items : 0;
|
513 |
-
$data['result'] = $result;
|
514 |
-
if ( $this->is_finished() ) {
|
515 |
-
$data['grade'] = $this->_is_passed( $result );
|
516 |
-
}
|
517 |
-
}
|
518 |
-
|
519 |
-
settype( $cached_data, 'array' );
|
520 |
-
$cached_data['completed-quizzes'] = $data;
|
521 |
-
|
522 |
-
wp_cache_set( $cache_key, $cached_data, 'learn-press/course-results' );
|
523 |
-
}
|
524 |
-
|
525 |
-
return isset( $cached_data['completed-quizzes'] ) ? $cached_data['completed-quizzes'] : array();
|
526 |
-
}
|
527 |
-
|
528 |
-
protected function _is_passed( $result ) {
|
529 |
-
$result = round( $result, 2 );
|
530 |
-
|
531 |
-
return $result >= $this->get_passing_condition() ? 'passed' : 'failed';
|
532 |
-
}
|
533 |
-
|
534 |
-
/**
|
535 |
-
* Get completed items.
|
536 |
-
*
|
537 |
-
* @param string $type - Optional. Filter by type (such lp_quiz, lp_lesson) if passed
|
538 |
-
* @param bool $with_total - Optional. Include total if TRUE
|
539 |
-
* @param int $section_id - Optional. Get in specific section
|
540 |
-
*
|
541 |
-
* @return array|bool|mixed
|
542 |
-
*/
|
543 |
-
public function get_completed_items( $type = '', $with_total = false, $section_id = 0 ) {
|
544 |
-
$this->load();
|
545 |
-
|
546 |
-
$key = sprintf( '%d-%d-%s', $this->get_user_id(), $this->_course->get_id(), md5( build_query( func_get_args() ) ) );
|
547 |
-
|
548 |
-
if ( false === ( $completed_items = wp_cache_get( $key, 'learn-press/user-completed-items' ) ) ) {
|
549 |
-
$completed = 0;
|
550 |
-
$total = 0;
|
551 |
-
$section_items = array();
|
552 |
-
|
553 |
-
if ( $section_id && $section = $this->_course->get_sections( 'object', $section_id ) ) {
|
554 |
-
$section_items = $section->get_items();
|
555 |
-
|
556 |
-
if ( $section_items ) {
|
557 |
-
$section_items = array_keys( $section_items );
|
558 |
-
}
|
559 |
-
}
|
560 |
-
|
561 |
-
if ( $items = $this->_items ) {
|
562 |
-
foreach ( $items as $item ) {
|
563 |
-
|
564 |
-
if ( $section_id && ! in_array( $item->get_id(), $section_items ) ) {
|
565 |
-
continue;
|
566 |
-
}
|
567 |
-
|
568 |
-
if ( $type ) {
|
569 |
-
$item_type = $item->get_data( 'item_type' );
|
570 |
-
} else {
|
571 |
-
$item_type = '';
|
572 |
-
}
|
573 |
-
|
574 |
-
if ( $type === $item_type ) {
|
575 |
-
if ( $item->get_status() == 'completed' ) {
|
576 |
-
$completed ++;
|
577 |
-
}
|
578 |
-
$completed = apply_filters( 'learn-press/course-item/completed', $completed, $item, $item->get_status() );
|
579 |
-
//if ( ! $item->is_preview() ) {
|
580 |
-
$total ++;
|
581 |
-
//}
|
582 |
-
}
|
583 |
-
}
|
584 |
-
}
|
585 |
-
$completed_items = array( $completed, $total );
|
586 |
-
wp_cache_set( $key, $completed_items, 'learn-press/user-completed-items' );
|
587 |
-
}
|
588 |
-
|
589 |
-
return $with_total ? $completed_items : $completed_items[0];
|
590 |
-
}
|
591 |
-
|
592 |
-
/**
|
593 |
-
* Get items completed by percentage.
|
594 |
-
*
|
595 |
-
* @param string $type - Optional. Filter by type or not
|
596 |
-
* @param int $section_id - Optional. Get in specific section
|
597 |
-
*
|
598 |
-
* @return float|int
|
599 |
-
*/
|
600 |
-
public function get_percent_completed_items( $type = '', $section_id = 0 ) {
|
601 |
-
$values = $this->get_completed_items( $type, true, $section_id );
|
602 |
-
if ( $values[1] ) {
|
603 |
-
return $values[0] / $values[1] * 100;
|
604 |
-
}
|
605 |
-
|
606 |
-
return 0;
|
607 |
-
}
|
608 |
-
|
609 |
-
/**
|
610 |
-
* Get passing condition criteria.
|
611 |
-
*
|
612 |
-
* @return string
|
613 |
-
*/
|
614 |
-
public function get_passing_condition() {
|
615 |
-
return $this->_course->get_passing_condition();
|
616 |
-
}
|
617 |
-
|
618 |
-
/**
|
619 |
-
* Get all items in course.
|
620 |
-
*
|
621 |
-
* @return LP_User_Item[]
|
622 |
-
*/
|
623 |
-
public function get_items() {
|
624 |
-
$this->load();
|
625 |
-
|
626 |
-
return $this->_items;
|
627 |
-
}
|
628 |
-
|
629 |
-
/**
|
630 |
-
* Check course is completed or not.
|
631 |
-
*
|
632 |
-
* @return bool
|
633 |
-
*/
|
634 |
-
public function is_finished() {
|
635 |
-
return $this->get_status() === 'finished';
|
636 |
-
}
|
637 |
-
|
638 |
-
/**
|
639 |
-
* Check course graduation is passed or not.
|
640 |
-
*
|
641 |
-
* @return bool
|
642 |
-
*/
|
643 |
-
public function is_graduated() {
|
644 |
-
return $this->get_results( 'grade' ) == 'passed';
|
645 |
-
}
|
646 |
-
|
647 |
-
/**
|
648 |
-
* @return bool
|
649 |
-
*/
|
650 |
-
public function can_graduated() {
|
651 |
-
return $this->get_results( 'result' ) >= $this->get_passing_condition();
|
652 |
-
}
|
653 |
-
|
654 |
-
function __destruct() {
|
655 |
-
// TODO: Implement __unset() method.
|
656 |
-
}
|
657 |
-
|
658 |
-
/**
|
659 |
-
* @param int $item_id
|
660 |
-
*
|
661 |
-
* @return LP_User_Item|LP_User_Item_Quiz|bool
|
662 |
-
*/
|
663 |
-
public function get_item( $item_id ) {
|
664 |
-
$this->load();
|
665 |
-
|
666 |
-
return ! empty( $this->_items[ $item_id ] ) ? $this->_items[ $item_id ] : false;
|
667 |
-
}
|
668 |
-
|
669 |
-
/**
|
670 |
-
* @param int $user_item_id
|
671 |
-
*
|
672 |
-
* @return LP_User_Item|LP_User_Item_Quiz|bool
|
673 |
-
*/
|
674 |
-
public function get_item_by_user_item_id( $user_item_id ) {
|
675 |
-
$this->load();
|
676 |
-
|
677 |
-
if ( ! empty( $this->_items_by_item_ids[ $user_item_id ] ) ) {
|
678 |
-
$item_id = $this->_items_by_item_ids[ $user_item_id ];
|
679 |
-
|
680 |
-
return $this->get_item( $item_id );
|
681 |
-
}
|
682 |
-
|
683 |
-
return false;
|
684 |
-
}
|
685 |
-
|
686 |
-
public function set_item( $item ) {
|
687 |
-
|
688 |
-
|
689 |
-
$this->load();
|
690 |
-
|
691 |
-
if ( $item = LP_User_Item::get_item_object( $item ) ) {
|
692 |
-
$this->_items[ $item->get_item_id() ] = $item;
|
693 |
-
}
|
694 |
-
}
|
695 |
-
|
696 |
-
/**
|
697 |
-
* @param $item_id
|
698 |
-
* @param string $prop
|
699 |
-
*
|
700 |
-
* @return bool|float|int
|
701 |
-
*/
|
702 |
-
public function get_item_result( $item_id, $prop = 'result' ) {
|
703 |
-
if ( $item = $this->get_item( $item_id ) ) {
|
704 |
-
return $item->get_result( $prop );
|
705 |
-
}
|
706 |
-
|
707 |
-
return false;
|
708 |
-
}
|
709 |
-
|
710 |
-
public function get_result( $prop = '' ) {
|
711 |
-
return $this->get_results( $prop );
|
712 |
-
}
|
713 |
-
|
714 |
-
/**
|
715 |
-
* @param int $at
|
716 |
-
*
|
717 |
-
* @return LP_User_Item_Course
|
718 |
-
*/
|
719 |
-
public function get_item_at( $at = 0 ) {
|
720 |
-
$this->load();
|
721 |
-
$values = array_values( $this->_items );
|
722 |
-
$item = ! empty( $values[ $at ] ) ? $values[ $at ] : false;
|
723 |
-
|
724 |
-
return $item;
|
725 |
-
}
|
726 |
-
|
727 |
-
/**
|
728 |
-
* @param $id
|
729 |
-
*
|
730 |
-
* @return LP_User_Item_Quiz|bool
|
731 |
-
*/
|
732 |
-
public function get_item_quiz( $id ) {
|
733 |
-
|
734 |
-
$this->load();
|
735 |
-
$item = ! empty( $this->_items[ $id ] ) ? $this->_items[ $id ] : new LP_User_Item_Quiz( array() );
|
736 |
-
|
737 |
-
return $item;
|
738 |
-
}
|
739 |
-
|
740 |
-
/**
|
741 |
-
* Get js settings of course.
|
742 |
-
*
|
743 |
-
* @return array
|
744 |
-
*/
|
745 |
-
public function get_js_args() {
|
746 |
-
$js_args = false;
|
747 |
-
if ( $course = $this->get_course() ) {
|
748 |
-
$item = false;
|
749 |
-
$js_args = array(
|
750 |
-
'root_url' => trailingslashit( get_home_url() ),
|
751 |
-
'id' => $course->get_id(),
|
752 |
-
'url' => $course->get_permalink(),
|
753 |
-
'result' => $this->get_results(),
|
754 |
-
'current_item' => $item ? $item->get_id() : false,
|
755 |
-
'items' => $this->get_items_for_js()
|
756 |
-
);
|
757 |
-
}
|
758 |
-
|
759 |
-
return apply_filters( 'learn-press/course/single-params', $js_args, $this->get_id() );
|
760 |
-
}
|
761 |
-
|
762 |
-
public function update_item_retaken_count( $item_id, $count = 0 ) {
|
763 |
-
$items = $this->get_meta( '_retaken_items' );
|
764 |
-
if ( is_string( $count ) && preg_match( '#^(\+|\-)([0-9]+)#', $count, $m ) ) {
|
765 |
-
$last_count = ! empty( $items[ $item_id ] ) ? $items[ $item_id ] : 0;
|
766 |
-
$count = $m[1] == '+' ? ( $last_count + $m[2] ) : ( $last_count - $m[2] );
|
767 |
-
}
|
768 |
-
|
769 |
-
$items[ $item_id ] = $count;
|
770 |
-
|
771 |
-
learn_press_update_user_item_meta( $this->get_user_item_id(), '_retaken_items', $items );
|
772 |
-
|
773 |
-
return $count;
|
774 |
-
}
|
775 |
-
|
776 |
-
public function get_item_retaken_count( $item_id ) {
|
777 |
-
$items = $this->get_meta( '_retaken_items' );
|
778 |
-
$count = false;
|
779 |
-
|
780 |
-
if ( is_array( $items ) && array_key_exists( $item_id, $items ) ) {
|
781 |
-
$count = absint( $items[ $item_id ] );
|
782 |
-
}
|
783 |
-
|
784 |
-
return $count;
|
785 |
-
}
|
786 |
-
|
787 |
-
/**
|
788 |
-
* Get number of retaken times for user course.
|
789 |
-
*
|
790 |
-
* @return int
|
791 |
-
*/
|
792 |
-
public function get_retaken_count() {
|
793 |
-
return absint( learn_press_get_user_item_meta( $this->get_user_item_id(), '_lp_retaken_count', true ) );
|
794 |
-
}
|
795 |
-
|
796 |
-
/**
|
797 |
-
* Increase retaken count.
|
798 |
-
*
|
799 |
-
* @return bool|int
|
800 |
-
*/
|
801 |
-
public function increase_retake_count() {
|
802 |
-
$count = $this->get_retaken_count();
|
803 |
-
$count ++;
|
804 |
-
|
805 |
-
return learn_press_update_user_item_meta( $this->get_user_item_id(), '_lp_retaken_count', $count );
|
806 |
-
}
|
807 |
-
|
808 |
-
/**
|
809 |
-
* Get js settings of course items.
|
810 |
-
*
|
811 |
-
* @return array
|
812 |
-
*/
|
813 |
-
public function get_items_for_js() {
|
814 |
-
|
815 |
-
/*** TEST CACHE ***/
|
816 |
-
return false;
|
817 |
-
$args = array();
|
818 |
-
if ( $items = $this->get_items() ) {
|
819 |
-
$user = $this->get_user();
|
820 |
-
$course = $this->get_course();
|
821 |
-
foreach ( $items as $item ) {
|
822 |
-
|
823 |
-
$args[ $item->get_id() ] = $item->get_js_args();// $item_js;
|
824 |
-
}
|
825 |
-
}
|
826 |
-
|
827 |
-
return apply_filters( 'learn-press/course/items-for-js', $args, $this->get_id(), $this->get_user_id() );
|
828 |
-
}
|
829 |
-
|
830 |
-
/**
|
831 |
-
* Add new item
|
832 |
-
*
|
833 |
-
* @param int|array $item_id
|
834 |
-
* @param int $user_id
|
835 |
-
*
|
836 |
-
* @return bool
|
837 |
-
*/
|
838 |
-
public function add_item( $item_id, $user_id = 0 ) {
|
839 |
-
$this->load();
|
840 |
-
|
841 |
-
if ( empty( $this->_items[ $item_id ] ) ) {
|
842 |
-
return false;
|
843 |
-
}
|
844 |
-
|
845 |
-
$item_data = is_numeric( $item_id ) ? array( 'item_id' => $item_id ) : (array) $item_id;
|
846 |
-
|
847 |
-
if ( func_num_args() == 2 ) {
|
848 |
-
$item_data['user_id'] = $user_id ? $user_id : get_current_user_id();
|
849 |
-
}
|
850 |
-
|
851 |
-
$current_time = new LP_Datetime();
|
852 |
-
$defaults = array(
|
853 |
-
'start_time' => $current_time,
|
854 |
-
'start_time_gtm' => $current_time->toSql( false ),
|
855 |
-
'end_time' => $current_time,
|
856 |
-
'end_time_gmt' => $current_time->toSql( false ),
|
857 |
-
'item_type' => learn_press_get_post_type( $item_id ),
|
858 |
-
'status' => '',
|
859 |
-
'ref_id' => $this->get_id(),
|
860 |
-
'ref_type' => learn_press_get_post_type( $this->get_id() ),
|
861 |
-
'parent_id' => $this->get_user_item_id()
|
862 |
-
);
|
863 |
-
$item_data = wp_parse_args(
|
864 |
-
$item_data,
|
865 |
-
$defaults
|
866 |
-
);
|
867 |
-
|
868 |
-
$this->_items[ $item_id ] = LP_User_Item::get_item_object( $item_data );
|
869 |
-
|
870 |
-
return $this->_items[ $item_id ];
|
871 |
-
}
|
872 |
-
|
873 |
-
/**
|
874 |
-
* Update user item
|
875 |
-
*/
|
876 |
-
public function save() {
|
877 |
-
$this->update();
|
878 |
-
|
879 |
-
if ( ! $items = $this->get_items() ) {
|
880 |
-
return false;
|
881 |
-
}
|
882 |
-
|
883 |
-
foreach ( $items as $item_id => $item ) {
|
884 |
-
|
885 |
-
if ( ! $item->get_status() ) {
|
886 |
-
continue;
|
887 |
-
}
|
888 |
-
|
889 |
-
$item->update();
|
890 |
-
}
|
891 |
-
|
892 |
-
//global $wp_object_cache;
|
893 |
-
//
|
894 |
-
// learn_press_debug($wp_object_cache);
|
895 |
-
|
896 |
-
return true;
|
897 |
-
}
|
898 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inc/user-item/class-lp-user-item-quiz.php
CHANGED
@@ -158,7 +158,7 @@ class LP_User_Item_Quiz extends LP_User_Item {
|
|
158 |
$result['question_empty'] ++;
|
159 |
} else {
|
160 |
// minus for each wrong, empty question
|
161 |
-
$result['user_mark'] -= $quiz->get_minus_points();
|
162 |
$result['question_wrong'] ++;
|
163 |
}
|
164 |
}
|
158 |
$result['question_empty'] ++;
|
159 |
} else {
|
160 |
// minus for each wrong, empty question
|
161 |
+
$result['user_mark'] -= intval($quiz->get_minus_points());
|
162 |
$result['question_wrong'] ++;
|
163 |
}
|
164 |
}
|
inc/user/abstract-lp-user.php
CHANGED
@@ -160,7 +160,10 @@ if ( ! class_exists( 'LP_Abstract_User' ) ) {
|
|
160 |
if ( ! $course_id ) {
|
161 |
$course_id = get_the_ID();
|
162 |
}
|
163 |
-
|
|
|
|
|
|
|
164 |
if ( false === ( $object_course_data = wp_cache_get( 'course-' . $this->get_id() . '-' . $course_id, 'lp-user-course-data' ) ) ) {
|
165 |
$this->_curd->read_course( $this->get_id(), $course_id );
|
166 |
if ( false !== ( $course_item = wp_cache_get( 'course-' . $this->get_id() . '-' . $course_id, 'lp-user-courses' ) ) ) {
|
160 |
if ( ! $course_id ) {
|
161 |
$course_id = get_the_ID();
|
162 |
}
|
163 |
+
/**
|
164 |
+
* @BUG: Cache enable => Not store all user answer of quiz, only store the last use answer for question
|
165 |
+
* @TODO: need improve this proccess
|
166 |
+
*/
|
167 |
if ( false === ( $object_course_data = wp_cache_get( 'course-' . $this->get_id() . '-' . $course_id, 'lp-user-course-data' ) ) ) {
|
168 |
$this->_curd->read_course( $this->get_id(), $course_id );
|
169 |
if ( false !== ( $course_item = wp_cache_get( 'course-' . $this->get_id() . '-' . $course_id, 'lp-user-courses' ) ) ) {
|
inc/user/class-lp-profile.php
CHANGED
@@ -228,12 +228,12 @@ if ( ! class_exists( 'LP_Profile' ) ) {
|
|
228 |
}
|
229 |
|
230 |
$settings = LP()->settings;
|
231 |
-
$this->_publicity = array(
|
232 |
'view-tab-dashboard' => $this->get_publicity( 'my-dashboard' ) == 'yes',
|
233 |
'view-tab-basic-information' => $this->get_publicity( 'dashboard' ) == 'yes',
|
234 |
'view-tab-courses' => $this->get_publicity( 'courses' ) == 'yes',
|
235 |
'view-tab-quizzes' => $this->get_publicity( 'quizzes' ) == 'yes'
|
236 |
-
);
|
237 |
}
|
238 |
|
239 |
return $this->_user;
|
@@ -397,7 +397,7 @@ if ( ! class_exists( 'LP_Profile' ) ) {
|
|
397 |
* Get current tab slug in query string.
|
398 |
*
|
399 |
* @param string $default Optional.
|
400 |
-
* @param bool
|
401 |
*
|
402 |
* @return string
|
403 |
*/
|
@@ -409,7 +409,7 @@ if ( ! class_exists( 'LP_Profile' ) ) {
|
|
409 |
* Get current section in query string.
|
410 |
*
|
411 |
* @param string $default
|
412 |
-
* @param bool
|
413 |
* @param string $tab
|
414 |
*
|
415 |
* @return bool|int|mixed|string
|
@@ -457,8 +457,8 @@ if ( ! class_exists( 'LP_Profile' ) ) {
|
|
457 |
/**
|
458 |
* Get current link of profile
|
459 |
*
|
460 |
-
* @param string $args
|
461 |
-
* @param bool
|
462 |
*
|
463 |
* @return mixed|string
|
464 |
*/
|
@@ -748,8 +748,8 @@ if ( ! class_exists( 'LP_Profile' ) ) {
|
|
748 |
);
|
749 |
}
|
750 |
|
751 |
-
}else{
|
752 |
-
$query = new LP_Query_List_Table($query);
|
753 |
}
|
754 |
|
755 |
return $query;
|
@@ -759,7 +759,7 @@ if ( ! class_exists( 'LP_Profile' ) ) {
|
|
759 |
* Query user's courses
|
760 |
*
|
761 |
* @param string $type - Optional. [own, purchased, enrolled, etc]
|
762 |
-
* @param mixed
|
763 |
*
|
764 |
* @return array|LP_Query_List_Table
|
765 |
*/
|
@@ -925,7 +925,7 @@ if ( ! class_exists( 'LP_Profile' ) ) {
|
|
925 |
/**
|
926 |
* Echo class for main div.
|
927 |
*
|
928 |
-
* @param bool
|
929 |
* @param string $more
|
930 |
*
|
931 |
* @return string
|
@@ -958,7 +958,7 @@ if ( ! class_exists( 'LP_Profile' ) ) {
|
|
958 |
* Return true if the tab is visible for current user.
|
959 |
*
|
960 |
* @param string $tab_key
|
961 |
-
* @param array
|
962 |
*
|
963 |
* @return bool
|
964 |
*/
|
@@ -970,7 +970,7 @@ if ( ! class_exists( 'LP_Profile' ) ) {
|
|
970 |
* Return true if the section is visible for current user.
|
971 |
*
|
972 |
* @param string $section_key
|
973 |
-
* @param array
|
974 |
*
|
975 |
* @return bool
|
976 |
*/
|
228 |
}
|
229 |
|
230 |
$settings = LP()->settings;
|
231 |
+
$this->_publicity = apply_filters( 'learn-press/check-publicity-setting', array(
|
232 |
'view-tab-dashboard' => $this->get_publicity( 'my-dashboard' ) == 'yes',
|
233 |
'view-tab-basic-information' => $this->get_publicity( 'dashboard' ) == 'yes',
|
234 |
'view-tab-courses' => $this->get_publicity( 'courses' ) == 'yes',
|
235 |
'view-tab-quizzes' => $this->get_publicity( 'quizzes' ) == 'yes'
|
236 |
+
), $this );
|
237 |
}
|
238 |
|
239 |
return $this->_user;
|
397 |
* Get current tab slug in query string.
|
398 |
*
|
399 |
* @param string $default Optional.
|
400 |
+
* @param bool $key Optional. True if return the key instead of value.
|
401 |
*
|
402 |
* @return string
|
403 |
*/
|
409 |
* Get current section in query string.
|
410 |
*
|
411 |
* @param string $default
|
412 |
+
* @param bool $key
|
413 |
* @param string $tab
|
414 |
*
|
415 |
* @return bool|int|mixed|string
|
457 |
/**
|
458 |
* Get current link of profile
|
459 |
*
|
460 |
+
* @param string $args - Optional. Add more query args to url.
|
461 |
+
* @param bool $with_permalink - Optional. TRUE to build url as friendly url.
|
462 |
*
|
463 |
* @return mixed|string
|
464 |
*/
|
748 |
);
|
749 |
}
|
750 |
|
751 |
+
} else {
|
752 |
+
$query = new LP_Query_List_Table( $query );
|
753 |
}
|
754 |
|
755 |
return $query;
|
759 |
* Query user's courses
|
760 |
*
|
761 |
* @param string $type - Optional. [own, purchased, enrolled, etc]
|
762 |
+
* @param mixed $args - Optional.
|
763 |
*
|
764 |
* @return array|LP_Query_List_Table
|
765 |
*/
|
925 |
/**
|
926 |
* Echo class for main div.
|
927 |
*
|
928 |
+
* @param bool $echo
|
929 |
* @param string $more
|
930 |
*
|
931 |
* @return string
|
958 |
* Return true if the tab is visible for current user.
|
959 |
*
|
960 |
* @param string $tab_key
|
961 |
+
* @param array $tab_data
|
962 |
*
|
963 |
* @return bool
|
964 |
*/
|
970 |
* Return true if the section is visible for current user.
|
971 |
*
|
972 |
* @param string $section_key
|
973 |
+
* @param array $section_data
|
974 |
*
|
975 |
* @return bool
|
976 |
*/
|
inc/user/class-lp-user-factory.php
CHANGED
@@ -191,11 +191,16 @@ class LP_User_Factory {
|
|
191 |
$item = $curd->get_user_item_by_id( $user_item_id );
|
192 |
$last_status = $curd->get_user_item_meta( $user_item_id, '_last_status' );
|
193 |
$args = array( 'status' => $last_status );
|
194 |
-
|
|
|
|
|
|
|
|
|
195 |
$args['status'] = 'enrolled';
|
196 |
}
|
197 |
if ( ! $last_status ) {
|
198 |
-
|
|
|
199 |
$time = new LP_Datetime();
|
200 |
$args['start_time'] = $time->toSql();
|
201 |
$args['start_time_gmt'] = $time->toSql( false );
|
191 |
$item = $curd->get_user_item_by_id( $user_item_id );
|
192 |
$last_status = $curd->get_user_item_meta( $user_item_id, '_last_status' );
|
193 |
$args = array( 'status' => $last_status );
|
194 |
+
$user = learn_press_get_user($user_id);
|
195 |
+
$course_id = $item['item_id'];
|
196 |
+
$can_enroll = $user->can_enroll_course($course_id);
|
197 |
+
$auto_enroll = LP()->settings->get( 'auto_enroll' ) == 'yes';
|
198 |
+
if ( $new_status == 'completed' && $can_enroll && $auto_enroll) {
|
199 |
$args['status'] = 'enrolled';
|
200 |
}
|
201 |
if ( ! $last_status ) {
|
202 |
+
$args['status'] = $auto_enroll && $can_enroll ? 'enrolled' : 'purchased';
|
203 |
+
if ( 'enrolled' == $args['status'] ) {
|
204 |
$time = new LP_Datetime();
|
205 |
$args['start_time'] = $time->toSql();
|
206 |
$args['start_time_gmt'] = $time->toSql( false );
|
learnpress.php
CHANGED
@@ -4,7 +4,7 @@ Plugin Name: LearnPress
|
|
4 |
Plugin URI: http://thimpress.com/learnpress
|
5 |
Description: LearnPress is a WordPress complete solution for creating a Learning Management System (LMS). It can help you to create courses, lessons and quizzes.
|
6 |
Author: ThimPress
|
7 |
-
Version: 3.0.
|
8 |
Author URI: http://thimpress.com
|
9 |
Requires at least: 3.8
|
10 |
Tested up to: 4.9.6
|
@@ -137,7 +137,7 @@ if ( ! class_exists( 'LearnPress' ) ) {
|
|
137 |
}
|
138 |
|
139 |
if ( file_exists( $file ) ) {
|
140 |
-
$this->backgrounds[ $name ] =
|
141 |
}
|
142 |
}
|
143 |
}
|
4 |
Plugin URI: http://thimpress.com/learnpress
|
5 |
Description: LearnPress is a WordPress complete solution for creating a Learning Management System (LMS). It can help you to create courses, lessons and quizzes.
|
6 |
Author: ThimPress
|
7 |
+
Version: 3.0.12.1
|
8 |
Author URI: http://thimpress.com
|
9 |
Requires at least: 3.8
|
10 |
Tested up to: 4.9.6
|
137 |
}
|
138 |
|
139 |
if ( file_exists( $file ) ) {
|
140 |
+
$this->backgrounds[ $name ] = include_once $file;
|
141 |
}
|
142 |
}
|
143 |
}
|
readme.txt
CHANGED
@@ -4,7 +4,7 @@ Donate link:
|
|
4 |
Tags: WordPress LMS, LMS, eLearning, e-Learning, Learning Management System, LMS WordPress, Course, Courses, Quiz, Quizzes, Training, Guru, Sell Courses
|
5 |
Requires at least: 3.8
|
6 |
Tested up to: 4.9.5
|
7 |
-
Stable tag: 3.0.
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
@@ -36,8 +36,8 @@ Take a look at Premium **[Education WordPress Theme](http://themeforest.net/item
|
|
36 |
|
37 |
- **[How to create a Udemy or Coursera clone easily with LearnPress](https://thimpress.com/create-udemy-coursera-clone-easily-learnpress/?utm_source=wporg&utm_medium=learnpress&ref=thimpress&utm_campaign=learnpress)**
|
38 |
|
39 |
-
- Step-by-step Youtube guide on setting up your own Online Course site. **[Click here >>](https://www.youtube.com/watch?v=
|
40 |
-
[youtube https://www.youtube.com/watch?v=
|
41 |
|
42 |
Are you looking for *best LMS WordPress plugin*?
|
43 |
|
@@ -199,6 +199,25 @@ https://www.transifex.com/projects/p/learnpress/
|
|
199 |
8. Add-ons of LearnPress.
|
200 |
|
201 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
202 |
|
203 |
= 3.0.10 =
|
204 |
+ Added quiz option to minus a number of point for each wrong question in quiz
|
4 |
Tags: WordPress LMS, LMS, eLearning, e-Learning, Learning Management System, LMS WordPress, Course, Courses, Quiz, Quizzes, Training, Guru, Sell Courses
|
5 |
Requires at least: 3.8
|
6 |
Tested up to: 4.9.5
|
7 |
+
Stable tag: 3.0.12.1
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
36 |
|
37 |
- **[How to create a Udemy or Coursera clone easily with LearnPress](https://thimpress.com/create-udemy-coursera-clone-easily-learnpress/?utm_source=wporg&utm_medium=learnpress&ref=thimpress&utm_campaign=learnpress)**
|
38 |
|
39 |
+
- Step-by-step Youtube guide on setting up your own Online Course site. **[Click here >>](https://www.youtube.com/watch?v=3LDa8vtDIAk)**
|
40 |
+
[youtube https://www.youtube.com/watch?v=3LDa8vtDIAk&hd=1&&cc_load_policy=1]
|
41 |
|
42 |
Are you looking for *best LMS WordPress plugin*?
|
43 |
|
199 |
8. Add-ons of LearnPress.
|
200 |
|
201 |
== Changelog ==
|
202 |
+
= 3.0.12 =
|
203 |
+
~ Fixed minor bug in gradebook list in admin
|
204 |
+
~ Made hook learn-press/course-tabs work
|
205 |
+
~ Fixed bug: not auto complete quiz. Add 1 more filter hook for checking publicity in profile page
|
206 |
+
~ Fixed bug: auto enroll course without permission to enroll course
|
207 |
+
~ Changed filter tag for get_default_meta of lesson
|
208 |
+
~ Auto full-screen in mobile view
|
209 |
+
~ Fixed bug: wrong count number in No Preview at Lessons List back end page
|
210 |
+
~ Fixed bug: Instructor user cannot see comments of lesson
|
211 |
+
~ Changed version for template files
|
212 |
+
~ Added base url for construct nav in user profile
|
213 |
+
~ Added param for get_nav method
|
214 |
+
~ Fixed bug: answer correct all question but quiz result is failse with 0%
|
215 |
+
~ Fixed small bug in quiz editor
|
216 |
+
~ Fixed bug: wrong count number of the courses in back end because of the status of preview course
|
217 |
+
~ Fixed bug: not redirect to correct page after logged in in Profile page
|
218 |
+
~ Fixed bug fatal error include file
|
219 |
+
~ Added icon for chat-type-format of content item
|
220 |
+
~ Fixed header-sent when log file
|
221 |
|
222 |
= 3.0.10 =
|
223 |
+ Added quiz option to minus a number of point for each wrong question in quiz
|
templates/profile/tabs/courses/owned.php
CHANGED
@@ -6,7 +6,7 @@
|
|
6 |
*
|
7 |
* @author ThimPress
|
8 |
* @package Learnpress/Templates
|
9 |
-
* @version 3.0.
|
10 |
*/
|
11 |
|
12 |
/**
|
@@ -49,8 +49,7 @@ $query = $profile->query_courses( 'own', array( 'status' => $filter_stat
|
|
49 |
wp_reset_postdata();
|
50 |
?>
|
51 |
</ul>
|
52 |
-
|
53 |
-
<?php $query->get_nav( '', true ); ?>
|
54 |
|
55 |
<?php } ?>
|
56 |
</div>
|
6 |
*
|
7 |
* @author ThimPress
|
8 |
* @package Learnpress/Templates
|
9 |
+
* @version 3.0.11.2
|
10 |
*/
|
11 |
|
12 |
/**
|
49 |
wp_reset_postdata();
|
50 |
?>
|
51 |
</ul>
|
52 |
+
<?php $query->get_nav( '', true, $profile->get_current_url() ); ?>
|
|
|
53 |
|
54 |
<?php } ?>
|
55 |
</div>
|
templates/profile/tabs/courses/purchased.php
CHANGED
@@ -6,7 +6,7 @@
|
|
6 |
*
|
7 |
* @author ThimPress
|
8 |
* @package Learnpress/Templates
|
9 |
-
* @version 3.0.
|
10 |
*/
|
11 |
|
12 |
/**
|
@@ -73,7 +73,7 @@ $query = $profile->query_courses( 'purchased', array( 'status' => $filte
|
|
73 |
<?php echo $query->get_offset_text(); ?>
|
74 |
</td>
|
75 |
<td colspan="2" class="nav-pages">
|
76 |
-
<?php $query->get_nav_numbers( true ); ?>
|
77 |
</td>
|
78 |
</tr>
|
79 |
</tfoot>
|
6 |
*
|
7 |
* @author ThimPress
|
8 |
* @package Learnpress/Templates
|
9 |
+
* @version 3.0.11.2
|
10 |
*/
|
11 |
|
12 |
/**
|
73 |
<?php echo $query->get_offset_text(); ?>
|
74 |
</td>
|
75 |
<td colspan="2" class="nav-pages">
|
76 |
+
<?php $query->get_nav_numbers( true, $profile->get_current_url() ); ?>
|
77 |
</td>
|
78 |
</tr>
|
79 |
</tfoot>
|