PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.1.7.3.2
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.1.7.3.2
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 / user / class-lp-user-factory.php

class-lp-user-factory.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.1.7.3.2, at inc/user/class-lp-user-factory.php

428 lines 12.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 defined( 'ABSPATH' ) || exit;
4
5 /**
6 * Class LP_User_Factory
7 */
8 class LP_User_Factory {
9 /**
10 * @var array
11 */
12 protected static $_users = array();
13
14 /**
15 * @var int
16 */
17 protected static $_guest_transient = 0;
18
19 public static $_deleted_users = array();
20
21 /**
22 * Init hooks
23 */
24 public static function init() {
25 self::$_guest_transient = WEEK_IN_SECONDS;
26 add_action( 'learn-press/user/quiz-started', array( __CLASS__, 'start_quiz' ), 10, 3 );
27 add_action( 'learn_press_activate', array( __CLASS__, 'register_event' ), 15 );
28
29 /**
30 * Filters into wp users manager
31 */
32 add_filter( 'users_list_table_query_args', array( __CLASS__, 'exclude_temp_users' ) );
33
34 add_action( 'learn-press/order/status-changed', array( __CLASS__, 'update_user_items' ), 10, 3 );
35 }
36
37 /**
38 * Handle when order changed status
39 *
40 * @param $the_id
41 * @param $old_status
42 * @param $new_status
43 * @Todo tungnx - should write on class LP_Order
44 */
45 public static function update_user_items( $the_id, $old_status, $new_status ) {
46 $order = learn_press_get_order( $the_id );
47
48 if ( ! $order ) {
49 return;
50 }
51
52 try {
53 switch ( $new_status ) {
54 case 'pending':
55 case 'processing':
56 case 'cancelled':
57 case 'failed':
58 self::_update_user_item_order_pending( $order, $old_status, $new_status );
59 break;
60 case 'completed':
61 self::_update_user_item_order_completed( $order, $old_status, $new_status );
62 break;
63 }
64 } catch ( Exception $ex ) {
65 error_log( __METHOD__ . ': ' . $ex->getMessage() );
66 }
67 }
68
69 /**
70 * Update lp_user_items has Order
71 *
72 * @param LP_Order $order
73 * @param string $old_status
74 * @param string $new_status
75 *
76 * @throws Exception
77 * @author Nhamdv <email@email.com>
78 * @editor tungnx
79 * @modify 4.1.4
80 * @version 1.0.1
81 */
82 protected static function _update_user_item_order_pending( $order, $old_status, $new_status ) {
83 $items = $order->get_items();
84 $lp_order_db = LP_Order_DB::getInstance();
85 $lp_user_items_db = LP_User_Items_DB::getInstance();
86
87 if ( ! $items ) {
88 return;
89 }
90
91 foreach ( $order->get_users() as $user_id ) {
92 foreach ( $items as $item ) {
93 if ( ! isset( $item['course_id'] ) ) {
94 continue;
95 }
96
97 $course_id = $item['course_id'];
98
99 // Check this order is the latest by user and course_id
100 $last_order_id = $lp_order_db->get_last_lp_order_id_of_user_course( $user_id, $course_id );
101 if ( $last_order_id && $last_order_id != $order->get_id() ) {
102 continue;
103 }
104
105 $lp_user_items_db->delete_user_items_old( $user_id, $course_id );
106 }
107 }
108 }
109
110 /**
111 * Enroll course if Order completed
112 *
113 * @param LP_Order $order
114 * @param string $old_status
115 * @param string $new_status
116 * @throws Exception
117 * @editor tungnx
118 * @modify 4.1.2
119 * @version 1.0.2
120 */
121 protected static function _update_user_item_order_completed( LP_Order $order, string $old_status, string $new_status ) {
122 $lp_order_db = LP_Order_DB::getInstance();
123 $items = $order->get_items();
124
125 if ( ! $items ) {
126 return;
127 }
128
129 $created_via = $order->get_created_via();
130
131 foreach ( $order->get_users() as $user_id ) {
132 $user = learn_press_get_user( $user_id );
133
134 foreach ( $items as $item ) {
135 if ( ! isset( $item['course_id'] ) || get_post_type( $item['course_id'] ) !== LP_COURSE_CPT ) {
136 continue;
137 }
138
139 $course_id = $item['course_id'];
140
141 // Check this order is the latest by user and course_id
142 $last_order_id = $lp_order_db->get_last_lp_order_id_of_user_course( $user_id, $course_id );
143 if ( $last_order_id && $last_order_id != $order->get_id() ) {
144 continue;
145 }
146
147 if ( 'manual' === $created_via ) {
148 self::handle_item_manual_order_completed( $order, $user, $item );
149 } else {
150 self::handle_item_order_completed( $order, $user, $item );
151 }
152 }
153 }
154 }
155
156 /**
157 * Handle something when Order completed
158 *
159 * @author tungnx
160 * @since 4.1.3
161 * @version 1.0.2
162 */
163 protected static function handle_item_order_completed( LP_Order $order, LP_User $user, $item ) {
164 $lp_user_items_db = LP_User_Items_DB::getInstance();
165
166 try {
167 $course = learn_press_get_course( $item['course_id'] );
168 $auto_enroll = LP_Settings::is_auto_start_course();
169
170 $user_id = $user->get_id();
171 if ( $user instanceof LP_User_Guest ) {
172 $user_id = 0;
173 }
174
175 /** Get the newest user_item_id of course for allow_repurchase */
176 $filter = new LP_User_Items_Filter();
177 $filter->user_id = $user_id;
178 $filter->item_id = $item['course_id'];
179 $user_course = $lp_user_items_db->get_last_user_course( $filter );
180
181 $latest_user_item_id = 0;
182 $allow_repurchase_type = '';
183
184 // Data user_item for save database
185 $user_item_data = [
186 'user_id' => $user_id,
187 'item_id' => $course->get_id(),
188 'ref_id' => $order->get_id(),
189 ];
190
191 if ( ! $user instanceof LP_User_Guest && $user_course && isset( $user_course->user_item_id ) ) {
192 $latest_user_item_id = $user_course->user_item_id;
193
194 /** Get allow_repurchase_type for reset, update. Add in: rest-api/v1/frontend/class-lp-courses-controller.php: purchase_course */
195 $allow_repurchase_type = learn_press_get_user_item_meta( $latest_user_item_id, '_lp_allow_repurchase_type' );
196 }
197
198 // If > 1 time purchase same course and allow repurchase
199 if ( ! empty( $allow_repurchase_type ) && $course->allow_repurchase() && ! empty( $latest_user_item_id ) && ! $course->is_free() ) {
200 /**
201 * If keep course progress will reset start_time, end_time, status, graduation
202 * where user_item_id = $latest_user_item_id
203 */
204 if ( $allow_repurchase_type === 'keep' ) {
205 // Set data for update user item
206 $user_item_data['user_item_id'] = $latest_user_item_id;
207 $user_item_data['start_time'] = time();
208 $user_item_data['end_time'] = null;
209 $user_item_data['status'] = LP_COURSE_ENROLLED;
210 $user_item_data['graduation'] = LP_COURSE_GRADUATION_IN_PROGRESS;
211
212 do_action( 'lp/allow_repurchase_options/continue/db/update', $user_item_data, $latest_user_item_id );
213 } elseif ( $allow_repurchase_type === 'reset' ) {
214 if ( $auto_enroll ) {
215 $user_item_data['status'] = LP_COURSE_ENROLLED;
216 $user_item_data['graduation'] = LP_COURSE_GRADUATION_IN_PROGRESS;
217 } else {
218 $user_item_data['status'] = LP_COURSE_PURCHASED;
219 }
220 }
221
222 learn_press_delete_user_item_meta( $latest_user_item_id, '_lp_allow_repurchase_type' );
223 } elseif ( ! $course->is_free() ) { // First purchase course
224 // Set data for create user_item
225 if ( $auto_enroll ) {
226 $user_item_data['status'] = LP_COURSE_ENROLLED;
227 $user_item_data['graduation'] = LP_COURSE_GRADUATION_IN_PROGRESS;
228 } else {
229 $user_item_data['status'] = LP_COURSE_PURCHASED;
230 }
231 } else { // Enroll course free
232 // Set data for create user_item
233 $user_item_data['status'] = LP_COURSE_ENROLLED;
234 $user_item_data['graduation'] = LP_COURSE_GRADUATION_IN_PROGRESS;
235 }
236
237 $user_item_new_or_update = new LP_User_Item_Course( $user_item_data );
238 $result = $user_item_new_or_update->update();
239
240 if ( $result && isset( $user_item_data['status'] ) && LP_COURSE_ENROLLED == $user_item_data['status'] ) {
241 do_action( 'learnpress/user/course-enrolled', $order->get_id(), $user_item_data['item_id'], $user_item_data['user_id'] );
242 }
243 } catch ( Throwable $e ) {
244 error_log( __FUNCTION__ . ': ' . $e->getMessage() );
245 }
246 }
247
248 /**
249 * Handle something when Manual Order completed
250 *
251 * @author tungnx
252 * @since 4.1.3
253 * @version 1.0.1
254 */
255 protected static function handle_item_manual_order_completed( LP_Order $order, LP_User $user, $item ) {
256 try {
257 $course = learn_press_get_course( $item['course_id'] );
258 $auto_enroll = LP_Settings::is_auto_start_course();
259
260 // Data user_item for save database
261 $user_item_data = [
262 'user_id' => $user->get_id(),
263 'item_id' => $course->get_id(),
264 'ref_id' => $order->get_id(),
265 ];
266
267 if ( $auto_enroll ) {
268 $user_item_data['status'] = LP_COURSE_ENROLLED;
269 $user_item_data['graduation'] = LP_COURSE_GRADUATION_IN_PROGRESS;
270 } else {
271 $user_item_data['status'] = LP_COURSE_PURCHASED;
272 }
273
274 $user_item_data = apply_filters( 'learnpress/lp_order/item/handle_item_manual_order_completed', $user_item_data, $order, $user, $course, $item );
275
276 // Delete lp_user_items old
277 LP_User_Items_DB::getInstance()->delete_user_items_old( $user->get_id(), $course->get_id() );
278 // End
279
280 if ( isset( $user_item_data['status'] ) ) {
281 $user_item_new = new LP_User_Item_Course( $user_item_data );
282 $result = $user_item_new->update();
283
284 if ( $result && LP_COURSE_ENROLLED == $user_item_data['status'] ) {
285 do_action( 'learnpress/user/course-enrolled', $order->get_id(), $user_item_data['item_id'], $user_item_data['user_id'] );
286 }
287 }
288 } catch ( Throwable $e ) {
289 error_log( __FUNCTION__ . ': ' . $e->getMessage() );
290 }
291 }
292
293 /**
294 * Hook into wp users list to exclude our temp users.
295 *
296 * @param array $args
297 *
298 * @return mixed
299 */
300 public static function exclude_temp_users( $args ) {
301 if ( LP_Request::get_string( 'lp-action' ) == 'pending-request' ) {
302 $args['include'] = self::get_pending_requests();
303 }
304
305 return $args;
306 }
307
308 /**
309 * Get pending requests be come a Teacher.
310 *
311 * @return array
312 */
313 public static function get_pending_requests() {
314 global $wpdb;
315 $query = $wpdb->prepare(
316 "
317 SELECT ID
318 FROM {$wpdb->users} u
319 INNER JOIN {$wpdb->usermeta} um ON um.user_id = u.ID AND um.meta_key = %s
320 WHERE um.meta_value = %s
321 ",
322 '_requested_become_teacher',
323 'yes'
324 );
325
326 return $wpdb->get_col( $query );
327 }
328
329 public static function get_guest_id() {
330 return 0;// empty( $_COOKIE['learn_press_user_guest_id'] ) ? false : $_COOKIE['learn_press_user_guest_id'];
331 }
332
333 /**
334 * @param $the_user
335 * @param bool $force
336 *
337 * @return LP_Abstract_User
338 */
339 public static function get_user( $the_user, $force = false ) {
340 $the_id = 0;
341 if ( is_numeric( $the_user ) ) {
342 $the_id = $the_user;
343 } elseif ( $the_user instanceof LP_Abstract_User ) {
344 $the_id = $the_user->id;
345 } elseif ( isset( $the_user->ID ) ) {
346 $the_id = $the_user->ID;
347 } elseif ( null === $the_user ) {
348 $the_id = get_current_user_id();
349 }
350
351 $user_class = self::get_user_class( $the_id );
352 if ( $user_class instanceof LP_User_Guest ) {
353 $the_id = self::get_guest_id();
354 }
355 if ( empty( self::$_users[ $the_id ] ) || $force ) {
356 self::$_users[ $the_id ] = new $user_class( $the_id );
357 }
358
359 return self::$_users[ $the_id ];
360 }
361
362 /**
363 * Get class name for User Object
364 *
365 * @param int
366 *
367 * @return string
368 */
369 public static function get_user_class( $the_id = 0 ) {
370 $deleted = in_array( $the_id, self::$_deleted_users );
371 $exists_user = ! $deleted ? get_userdata( $the_id ) : false;
372 if ( $exists_user ) {
373 $class = 'LP_User';
374 } else {
375 if ( ! $deleted ) {
376 self::$_deleted_users[] = $the_id;
377 /**
378 * Prevent loading user does not exists in database
379 */
380 $user = new LP_User_Guest( $the_id );
381 wp_cache_add( $the_id, $user, 'users' );
382 wp_cache_add( '', $the_id, 'userlogins' );
383 wp_cache_add( '', $the_id, 'useremail' );
384 wp_cache_add( '', $the_id, 'userslugs' );
385 }
386 $is_logged_in = function_exists( 'is_user_logged_in' ) && is_user_logged_in();
387 $class = $is_logged_in ? 'LP_User' : 'LP_User_Guest';
388 }
389
390 return apply_filters( 'learn_press_user_class', $class );
391 }
392
393 /**
394 * @param int $quiz_id
395 * @param int $course_id
396 * @param int $user_id
397 */
398 public static function start_quiz( $quiz_id, $course_id, $user_id ) {
399 if ( learn_press_get_user( $user_id ) ) {
400 $user = learn_press_get_user( $user_id );
401 if ( $user->get_item_data( $quiz_id, $course_id ) ) {
402 self::_update_user_item_meta( $user->get_item_data( $quiz_id, $course_id ), $quiz_id, $course_id, $user_id );
403 }
404 }
405 }
406
407 /**
408 * @param LP_User_Item $item
409 * @param int $quiz_id
410 * @param int $course_id
411 * @param int $user_id
412 */
413 private static function _update_user_item_meta( $item, $quiz_id, $course_id, $user_id ) {
414 if ( get_user_by( 'id', $user_id ) ) {
415 return;
416 }
417
418 if ( ! $item ) {
419 return;
420 }
421
422 learn_press_add_user_item_meta( $item->get_user_item_id(), 'temp_user_id', 'yes' );
423 learn_press_add_user_item_meta( $item->get_user_item_id(), 'temp_user_time', gmdate( 'Y-m-d H:i:s', time() ) );
424 }
425 }
426
427 LP_User_Factory::init();
428