PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.8
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.8
4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 All 139 releases
← All changes | inc/class-lp-ajax.php +135 -239 4.1.74.4.8 View file →
@@ -1,5 +1,12 @@
1 1 <?php
2 +
3 +use LearnPress\Helpers\Template;
4 +use LearnPress\Models\CourseModel;
5 +use LearnPress\Models\UserItems\UserCourseModel;
6 +use LearnPress\Models\UserItems\UserItemModel;
7 +use LearnPress\Models\UserModel;
8 +
2 9 defined( 'ABSPATH' ) || exit;
3 10
4 11 if ( ! class_exists( 'LP_AJAX' ) ) {
5 12 class LP_AJAX {
@@ -10,16 +17,12 @@
10 17 $ajax_events = array(
11 18 'checkout-user-email-exists:nopriv',
12 19 'recover-order',
13 20 'request-become-a-teacher:nonce',
14 - // 'upload-user-avatar',
15 21 'checkout:nopriv',
16 - 'complete-lesson',
22 + //'complete-lesson',
17 23 'finish-course', // finish_course.
18 - // 'retake-course', // retake_course.
19 24 'external-link:nopriv',
20 - // 'save-uploaded-user-avatar',
21 - // 'load-more-courses',
22 25 );
23 26
24 27 $ajax_events = apply_filters( 'learn-press/ajax/events', $ajax_events );
25 28
@@ -38,52 +41,10 @@
38 41 }
39 42
40 43 LP_Request::register_ajax( $action, $callback );
41 44 }
42 -
43 - //add_action( 'wp_ajax_learnpress_upload-user-avatar', array( __CLASS__, 'upload_user_avatar' ) );
44 45 }
45 46
46 - /**
47 - * @depecated v4.1.6.4
48 - */
49 - /*public static function load_more_courses() {
50 - _deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.1.6.4' );
51 - $type = LP_Request::get( 'type' );
52 - $user_id = LP_Request::get_int( 'user', 0 );
53 - $paged = LP_Request::get_int( 'current_page', 1 );
54 - $template = LP_Request::get( 'template' );
55 -
56 - $user = learn_press_get_user( $user_id );
57 - $template_args = array();
58 -
59 - if ( in_array( $type, array( 'featured', 'latest' ) ) ) {
60 - $query_args = array(
61 - 'paginate' => true,
62 - 'return' => 'ids',
63 - 'author' => $user->get_id(),
64 - 'paged' => $paged,
65 - );
66 -
67 - if ( 'featured' === $type ) {
68 - $query_args['featured'] = 1;
69 - }
70 -
71 - $query = new LP_Course_Query( $query_args );
72 - $template_args = (array) $query->get_courses();
73 - $template = "profile/dashboard/{$type}-courses";
74 -
75 - } else {
76 - $profile = LP_Profile::instance( $user_id );
77 - $filter_status = LP_Request::get_string( 'filter-status' );
78 - $query = $profile->query_courses( 'purchased', array( 'status' => $filter_status ) );
79 - }
80 -
81 - learn_press_get_template( $template, $template_args );
82 -
83 - wp_die();
84 - }*/
85 -
86 47 public static function external_link() {
87 48 $nonce = LP_Request::get( 'nonce' );
88 49 $id = LP_Request::get( 'id' );
89 50 $course = learn_press_get_course( $id );
@@ -104,9 +65,9 @@
104 65 }
105 66 }
106 67
107 68 public static function checkout() {
108 - LP()->checkout()->process_checkout_handler();
69 + LearnPress::instance()->checkout()->process_checkout_handler();
109 70 }
110 71
111 72 public static function request_become_a_teacher() {
112 73 LP_Forms_Handler::process_become_teacher();
@@ -111,9 +72,18 @@
111 72 public static function request_become_a_teacher() {
112 73 LP_Forms_Handler::process_become_teacher();
113 74 }
114 75
76 + /**
77 + * Recover order
78 + *
79 + * @since 4.0.0
80 + * @version 4.0.1
81 + * @return void
82 + */
115 83 public static function recover_order() {
84 + $response = new LP_REST_Response();
85 +
116 86 if ( ! LP_Request::verify_nonce( 'recover-order' ) ) {
117 87 return;
118 88 }
119 89
@@ -120,93 +90,57 @@
120 90 $factory = new LP_Order_CURD();
121 91 $user_id = get_current_user_id();
122 92 $order_key = LP_Request::get_string( 'order-key' );
123 93 $order = $factory->recover( $order_key, $user_id );
124 - $result = array( 'result' => 'success' );
125 94
126 95 if ( is_wp_error( $order ) ) {
127 - $result['message'] = $order->get_error_message();
128 - $result['result'] = 'error';
96 + $response->message = $order->get_error_message();
129 97 } else {
130 - $result['message'] = sprintf(
98 + $response->status = 'success';
99 + $response->message = sprintf(
131 100 __( 'The order %s has been successfully recovered.', 'learnpress' ),
132 101 $order_key
133 102 );
134 - $result['redirect'] = $order->get_view_order_url();
103 + $response->data->redirect = $order->get_view_order_url();
135 104 }
136 105
137 - $result = apply_filters( 'learn-press/order/recover-result', $result, $order_key, $user_id );
138 -
139 - learn_press_maybe_send_json( $result );
140 -
141 - if ( ! empty( $result['message'] ) ) {
142 - learn_press_add_message( $result['message'] );
143 - }
144 -
145 - if ( ! empty( $result['redirect'] ) ) {
146 - wp_redirect( $result['redirect'] );
147 - exit();
148 - }
106 + wp_send_json( $response );
149 107 }
150 108
151 109 public static function checkout_user_email_exists() {
152 - $email = LP_Request::get_email( 'email' );
153 - $response = array(
154 - 'exists' => 0,
155 - );
110 + $response = new LP_REST_Response();
156 111
157 - if ( email_exists( $email ) ) {
158 - $response['exists'] = $email;
159 - $output = '<div class="lp-guest-checkout-output">' . __(
160 - 'Your email is already exists. Continue with this email?',
161 - 'learnpress'
162 - ) . '</div>';
163 - } else {
164 - $output = '<label class="lp-guest-checkout-output">
165 - <input type="checkbox" name="checkout-email-option" value="new-account">
166 - ' . __(
167 - 'Create new account with this email? Account information will be sent to this email.',
168 - 'learnpress'
169 - ) . '
170 - </label>';
171 - }
112 + try {
113 + $email = LP_Request::get_email( 'email' );
114 + $user_can_register = get_option( 'users_can_register' );
115 + $html_wrapper = [
116 + '<label class="lp-guest-checkout-output">' => '</label>',
117 + ];
172 118
173 - $response['output'] = apply_filters( 'learnpress/guest_checkout_email_exist_output', $output, $email );
119 + if ( email_exists( $email ) ) {
120 + $output = __(
121 + 'Your email already exists. Do you want to continue with this email?',
122 + 'learnpress'
123 + );
124 + } elseif ( $user_can_register ) {
125 + $output = sprintf(
126 + '<input type="checkbox" name="checkout-email-option" value="new-account"> <span>%s</span>',
127 + __(
128 + 'Create a new account with this email. The account information will be sent with this email.',
129 + 'learnpress'
130 + )
131 + );
132 + } else {
133 + $output = __( 'The system does not allow the creation of a new account, you must enter an existing account.', 'learnpress' );
134 + }
174 135
175 - learn_press_maybe_send_json( $response );
176 - }
177 -
178 - /*public static function upload_user_avatar() {
179 - $file = $_FILES['lp-upload-avatar'];
180 - $upload_dir = learn_press_user_profile_picture_upload_dir();
181 -
182 - add_filter( 'upload_dir', array( __CLASS__, '_user_avatar_upload_dir' ), 10000 );
183 -
184 - $result = wp_handle_upload(
185 - $file,
186 - array(
187 - 'test_form' => false,
188 - )
189 - );
190 -
191 - remove_filter( 'upload_dir', array( __CLASS__, '_user_avatar_upload_dir' ), 10000 );
192 -
193 - if ( is_array( $result ) ) {
194 - $result['name'] = $upload_dir['subdir'] . '/' . basename( $result['file'] );
195 - unset( $result['file'] );
196 - } else {
197 - $result = array(
198 - 'error' => __( 'Profile picture upload failed', 'learnpress' ),
199 - );
136 + $response->status = 'success';
137 + $response->data->content = Template::instance()->nest_elements( $html_wrapper, $output );
138 + } catch ( Throwable $e ) {
139 + $response->message = $e->getMessage();
200 140 }
201 141
202 - learn_press_send_json( $result );
203 - }*/
204 -
205 - public static function _user_avatar_upload_dir( $dir ) {
206 - $dir = learn_press_user_profile_picture_upload_dir();
207 -
208 - return $dir;
142 + wp_send_json( $response );
209 143 }
210 144
211 145 /**
212 146 * Request finish course
@@ -213,80 +147,99 @@
213 147 *
214 148 * TODO: should move this function to api - tungnx
215 149 */
216 150 public static function finish_course() {
217 - $nonce = LP_Request::get_string( 'finish-course-nonce' );
218 - $course_id = LP_Request::get_int( 'course-id' );
219 - $course = learn_press_get_course( $course_id );
220 - $user = learn_press_get_current_user();
151 + $link_redirect = '';
152 + $message_data = [
153 + 'status' => 'error',
154 + 'content' => '',
155 + ];
221 156
222 - $nonce_action = sprintf( 'finish-course-%d-%d', $course_id, $user->get_id() );
157 + try {
158 + $nonce = LP_Request::get_param( 'finish-course-nonce', '', 'text', 'post' );
159 + $course_id = LP_Request::get_param( 'course-id', 0, 'int', 'post' );
160 + $courseModel = CourseModel::find( $course_id, true );
161 + $user_id = get_current_user_id();
162 + $userModel = UserModel::find( $user_id, true );
223 163
224 - if ( ! $user->get_id() || ! $course || ! wp_verify_nonce( $nonce, $nonce_action ) ) {
225 - wp_die( __( 'Access denied!', 'learnpress' ) );
226 - }
164 + $nonce_action = sprintf( 'finish-course-%d-%d', $course_id, $user_id );
165 + if ( ! $courseModel || ! $userModel || ! wp_verify_nonce( $nonce, $nonce_action ) ) {
166 + throw new Exception( __( 'Request is invalid!', 'learnpress' ) );
167 + }
227 168
228 - $finished = $user->finish_course( $course_id );
229 - $lp_redirect = LP_Settings::get_option( 'course_finish_redirect' );
230 - $redirect = ! empty( $lp_redirect ) ? $lp_redirect : get_the_permalink( $course_id );
169 + $userCourseModel = UserCourseModel::find( $user_id, $course_id, true );
170 + if ( ! $userCourseModel instanceof UserCourseModel ) {
171 + throw new Exception( __( 'You have not enrolled in this course.', 'learnpress' ) );
172 + }
231 173
232 - $response = array(
233 - 'redirect' => apply_filters(
234 - 'learn-press/finish-course-redirect',
235 - $redirect,
236 - $course_id
237 - ),
238 - );
174 + $can_finish = $userCourseModel->can_finish();
175 + if ( is_wp_error( $can_finish ) ) {
176 + throw new Exception( $can_finish->get_error_message() );
177 + }
239 178
240 - if ( $finished ) {
241 - learn_press_update_user_item_meta( $finished, 'finishing_type', 'click' );
242 - learn_press_add_message( sprintf( __( 'You have finished this course "%s"', 'learnpress' ), $course->get_title() ) );
243 - $response['result'] = 'success';
244 - } else {
245 - learn_press_add_message( __( 'Error! You cannot finish this course. Please contact your administrator for more information.', 'learnpress' ) );
246 - $response['result'] = 'error';
179 + $userCourseModel->handle_finish();
180 + $lp_redirect = LP_Settings::get_option( 'course_finish_redirect' );
181 + $link_redirect = ! empty( $lp_redirect ) ? $lp_redirect : $courseModel->get_permalink();
182 + $link_redirect = esc_url_raw( $link_redirect );
183 + $message_data['status'] = 'success';
184 + $message_data['content'] = __( 'Course has been finished successfully.', 'learnpress' );
185 + } catch ( Throwable $e ) {
186 + $message_data['content'] = $e->getMessage();
247 187 }
248 188
249 - learn_press_maybe_send_json( $response );
250 -
251 - if ( ! empty( $response['redirect'] ) ) {
252 - wp_redirect( $response['redirect'] );
253 - exit();
189 + learn_press_set_message( $message_data );
190 + if ( ! empty( $link_redirect ) ) {
191 + wp_redirect( $link_redirect );
192 + die();
254 193 }
255 194 }
256 195
257 196 /**
258 197 * Complete lesson
198 + * @deprecated 4.2.7.6
259 199 */
260 - public static function complete_lesson() {
261 - $nonce = LP_Request::get_string( 'complete-lesson-nonce' );
262 - $item_id = LP_Request::get_int( 'id' );
263 - $course_id = LP_Request::get_int( 'course_id' );
264 -
265 - $post = get_post( $item_id );
266 - $user = learn_press_get_current_user();
267 - $course = learn_press_get_course( $course_id );
268 - if ( ! $course ) {
269 - return;
270 - }
271 -
200 + /*public static function complete_lesson() {
272 201 $response = array(
273 - 'result' => 'success',
274 - 'redirect' => $course->get_item_link( $item_id ),
202 + 'result' => 'error',
203 + 'redirect' => '',
275 204 );
276 205
277 206 try {
278 - // security check
279 - if ( ! $post || ( $post && ! wp_verify_nonce( $nonce, 'lesson-complete' ) ) ) {
280 - throw new Exception( __( 'Error! Invalid lesson or failed security check.', 'learnpress' ), 8000 );
207 + $nonce = LP_Request::get_param( 'complete-lesson-nonce' );
208 + $lesson_id = LP_Request::get_param( 'id', 0, 'int' );
209 + $course_id = LP_Request::get_param( 'course_id', 0, 'int' );
210 + $item_id_next = LP_Request::get_param( 'item_id_next', 0, 'int' );
211 +
212 + if ( ! wp_verify_nonce( $nonce, 'lesson-complete' ) ) {
213 + throw new Exception( __( 'Error! Invalid lesson or failed security check.', 'learnpress' ) );
281 214 }
282 215
283 - $item = $course->get_item( $item_id );
216 + $lesson = get_post( $lesson_id );
217 + if ( ! $lesson || $lesson->post_type !== LP_LESSON_CPT ) {
218 + throw new Exception( __( 'Error! Invalid lesson.', 'learnpress' ) );
219 + }
220 +
221 + $user = learn_press_get_current_user();
222 + if ( $user instanceof LP_User_Guest ) {
223 + throw new Exception( __( 'Please login.', 'learnpress' ) );
224 + }
225 +
226 + $course = learn_press_get_course( $course_id );
227 + if ( ! $course ) {
228 + throw new Exception( __( 'Course is invalid!.', 'learnpress' ) );
229 + }
230 +
231 + $item = $course->get_item( $lesson_id );
284 232 if ( ! $item instanceof LP_Course_Item ) {
285 - throw new Exception( 'Item is invalid!' );
233 + throw new Exception( 'Item is invalid!', 'learnpress' );
286 234 }
287 235
288 - $result = $user->complete_lesson( $item_id );
236 + $result = $user->complete_lesson( $lesson_id, $course_id );
237 + if ( $item_id_next ) {
238 + $response['redirect'] = $course->get_item_link( $item_id_next );
239 + } else {
240 + $response['redirect'] = $item->get_permalink();
241 + }
289 242
290 243 if ( ! is_wp_error( $result ) ) {
291 244 if ( $course->get_next_item() ) {
292 245 $next = $course->get_next_item();
@@ -292,85 +245,28 @@
292 245 $next = $course->get_next_item();
293 246 $response['redirect'] = $course->get_item_link( $next );
294 247 }
295 248
296 - learn_press_add_message( sprintf( __( 'Congrats! You have completed "%s".', 'learnpress' ), $item->get_title() ) );
249 + $message_data = [
250 + 'status' => 'success',
251 + 'content' => sprintf( __( 'Congrats! You have completed "%s".', 'learnpress' ), $item->get_title() ),
252 + ];
253 + learn_press_set_message( $message_data );
254 + $response['result'] = 'success';
297 255 } else {
298 - throw new Exception( $result->get_error_message(), 'error' );
256 + throw new Exception( $result->get_error_message() );
299 257 }
300 258
301 - $response = apply_filters( 'learn-press/user-completed-lesson-result', $response, $item_id, $course_id, $user->get_id() );
302 - } catch ( Exception $ex ) {
303 - learn_press_add_message( $ex->getMessage(), 'error' );
259 + $response = apply_filters( 'learn-press/user-completed-lesson-result', $response, $lesson_id, $course_id, $user->get_id() );
260 + } catch ( Throwable $e ) {
261 + $message_data = [
262 + 'status' => 'error',
263 + 'content' => $e->getMessage(),
264 + ];
265 + learn_press_set_message( $message_data );
304 266 }
305 267
306 - if ( learn_press_message_count( 'error' ) ) {
307 - $response['result'] = 'error';
308 - }
309 -
310 - learn_press_maybe_send_json( $response );
311 -
312 - if ( ! empty( $response['redirect'] ) ) {
313 - // wp_cache_flush();
314 - wp_redirect( $response['redirect'] );
315 - exit();
316 - }
317 - }
318 -
319 - /**
320 - * Retake course action
321 - *
322 - * @TODO move this function to API
323 - */
324 - /*
325 - public static function retake_course() {
326 - $security = LP_Request::get_string( 'retake-course-nonce' );
327 - $course_id = LP_Request::get_int( 'retake-course' );
328 - $user = learn_press_get_current_user();
329 - $course = learn_press_get_course( $course_id );
330 - $response = array(
331 - 'result' => 'error',
332 - );
333 -
334 - $security_action = sprintf( 'retake-course-%d-%d', $course->get_id(), $user->get_id() );
335 - // security check
336 - if ( ! wp_verify_nonce( $security, $security_action ) ) {
337 - learn_press_add_message( __( 'Error! Invalid course or failed security check.', 'learnpress' ),
338 - 'error' );
339 - } else {
340 - if ( $user->can_retake_course( $course_id ) ) {
341 - $result = $user->retry_course( $course_id );
342 -
343 - if ( ! $result ) {
344 - learn_press_add_message( __( 'Error!', 'learnpress' ), 'error' );
345 - } else {
346 - learn_press_add_message( sprintf( __( 'You have retaken the course "%s"', 'learnpress' ),
347 - $course->get_title() ) );
348 - $response['result'] = 'success';
349 - }
350 - } else {
351 - learn_press_add_message( __( 'Error! You can not retake the course', 'learnpress' ), 'error' );
352 - }
353 - }
354 -
355 - if ( learn_press_message_count( 'error' ) == 0 ) {
356 - $item = $course->get_item_at( 0 );
357 -
358 - if ( $item ) {
359 - $redirect = $course->get_item_link( $item );
360 - } else {
361 - $redirect = $course->get_permalink();
362 - }
363 - $response['redirect'] = apply_filters( 'learn-press/user-retake-course-redirect', $redirect );
364 - $response = apply_filters( 'learn-press/user-retaken-course-result', $response, $course_id,
365 - $user->get_id() );
366 - } else {
367 - $response['redirect'] = $course->get_permalink();
368 - $response = apply_filters( 'learn-press/user-retake-course-failed-result', $response,
369 - $course_id, $user->get_id() );
370 - }
371 -
372 - learn_press_maybe_send_json( $response );
268 + //learn_press_maybe_send_json( $response );
373 269
374 270 if ( ! empty( $response['redirect'] ) ) {
375 271 wp_redirect( $response['redirect'] );
376 272 exit();