PluginProbe
Tutor LMS – eLearning and online course solution / 2.0.10
Tutor LMS – eLearning and online course solution v2.0.10
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0 3.9.15 3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 All 191 releases
← All changes | classes/Student.php +91 -204 trunk2.0.10 View file →
@@ -1,34 +1,26 @@
1 1 <?php
2 +
2 3 /**
3 - * Class Student
4 + * Class Instructor
4 5 *
5 - * @package Tutor\Student
6 - * @author Themeum <support@themeum.com>
7 - * @link https://themeum.com
8 - * @since 1.0.0
6 + * @package TUTOR
7 + *
8 + * @since v.1.0.0
9 9 */
10 10
11 11 namespace TUTOR;
12 12
13 -use Tutor\GDPR\Controllers\LegalConsent;
14 -
15 13 if ( ! defined( 'ABSPATH' ) ) {
16 14 exit;
17 15 }
18 16
19 -/**
20 - * Manage students
21 - *
22 - * @since 1.0.0
23 - */
17 +
24 18 class Student {
25 19
26 20 /**
27 21 * Bagged error messages
28 22 *
29 - * @since 1.0.0
30 - *
31 23 * @var $error_msgs
32 24 */
33 25 protected $error_msgs = '';
34 26
@@ -33,15 +25,14 @@
33 25 protected $error_msgs = '';
34 26
35 27 /**
36 28 * Handle Hooks
37 - *
38 - * @since 1.0.0
39 29 */
40 30 public function __construct() {
41 31 add_action( 'template_redirect', array( $this, 'register_student' ) );
42 32 add_filter( 'get_avatar_url', array( $this, 'filter_avatar' ), 10, 3 );
43 - add_action( 'wp_ajax_tutor_social_profile', array( $this, 'tutor_social_profile' ) );
33 + add_action( 'tutor_action_tutor_social_profile', array( $this, 'tutor_social_profile' ) );
34 +
44 35 add_action( 'wp_ajax_tutor_profile_password_reset', array( $this, 'tutor_reset_password' ) );
45 36 add_action( 'wp_ajax_tutor_update_profile', array( $this, 'update_profile' ) );
46 37 }
47 38
@@ -47,20 +38,19 @@
47 38
48 39 /**
49 40 * Register new user and mark him as student
50 41 *
51 - * @since 1.0.0
52 - *
53 - * @return void
42 + * @since v.1.0.0
54 43 */
55 44 public function register_student() {
56 - if ( 'tutor_register_student' !== Input::post( 'tutor_action', '' ) || ! get_option( 'users_can_register', false ) ) {
57 - // Action must be register, and registration must be enabled in dashboard.
45 + if ( tutor_utils()->array_get( 'tutor_action', $_POST ) !== 'tutor_register_student' || ! get_option( 'users_can_register', false ) ) {
46 + // Action must be register, and registrtion must be enabled in dashoard
58 47 return;
59 48 }
60 49
61 50 // Checking nonce.
62 51 tutor_utils()->checking_nonce();
52 +
63 53 $required_fields = apply_filters(
64 54 'tutor_student_registration_required_fields',
65 55 array(
66 56 'first_name' => __( 'First name field is required', 'tutor' ),
@@ -73,30 +63,27 @@
73 63 );
74 64
75 65 $validation_errors = array();
76 66
77 - // Registration error push into validation_errors.
67 + /*
68 + *registration_errors
69 + *push into validation_errors
70 + */
78 71 $errors = apply_filters( 'registration_errors', new \WP_Error(), '', '' );
79 72 foreach ( $errors->errors as $key => $value ) {
80 73 $validation_errors[ $key ] = $value[0];
74 +
81 75 }
82 76
83 77 foreach ( $required_fields as $required_key => $required_value ) {
84 - if ( empty( Input::post( $required_key, '' ) ) ) {
78 + if ( empty( $_POST[ $required_key ] ) ) {
85 79 $validation_errors[ $required_key ] = $required_value;
86 80 }
87 81 }
88 82
89 - // @since 4.0.0 legal consent added.
90 - $validate_consent = LegalConsent::validate_consent( LegalConsent::DISPLAY_ON_STD_REG, $_POST );
91 - if ( is_wp_error( $validate_consent ) ) {
92 - $validation_errors[ $validate_consent->get_error_code() ] = $validate_consent->get_error_message();
93 - }
94 -
95 83 if ( ! filter_var( tutor_utils()->input_old( 'email' ), FILTER_VALIDATE_EMAIL ) ) {
96 84 $validation_errors['email'] = __( 'Valid E-Mail is required', 'tutor' );
97 85 }
98 -
99 86 if ( tutor_utils()->input_old( 'password' ) !== tutor_utils()->input_old( 'password_confirmation' ) ) {
100 87 $validation_errors['password_confirmation'] = __( 'Your passwords should match each other. Please recheck.', 'tutor' );
101 88 }
102 89
@@ -110,101 +97,66 @@
110 97 $last_name = sanitize_text_field( tutor_utils()->input_old( 'last_name' ) );
111 98 $email = sanitize_text_field( tutor_utils()->input_old( 'email' ) );
112 99 $user_login = sanitize_text_field( tutor_utils()->input_old( 'user_login' ) );
113 100 $password = sanitize_text_field( tutor_utils()->input_old( 'password' ) );
114 - $userdata = array(
101 +
102 + $userdata = array(
115 103 'user_login' => $user_login,
116 104 'user_email' => $email,
117 105 'first_name' => $first_name,
118 106 'last_name' => $last_name,
107 + // 'role' => tutor()->student_role,
119 108 'user_pass' => $password,
120 109 );
121 110
122 - global $wpdb;
123 - $wpdb->query( 'START TRANSACTION' );
124 - $user_id = wp_insert_user( $userdata );
125 - $enroll_attempt = Input::post( 'tutor_course_enroll_attempt', '' );
126 - if ( is_wp_error( $user_id ) ) {
127 - $this->error_msgs = $user_id->get_error_messages();
128 - add_filter( 'tutor_student_register_validation_errors', array( $this, 'tutor_student_form_validation_errors' ) );
129 - return;
130 - }
131 -
132 - $user = get_user_by( 'id', $user_id );
133 -
134 - $redirect_url = '';
135 -
136 - $is_req_email_verification = apply_filters( 'tutor_require_email_verification', false );
137 - if ( $is_req_email_verification ) {
138 - $redirect_url = tutor_utils()->student_register_url();
139 -
140 - do_action( 'tutor_send_verification_mail', $user, $enroll_attempt );
141 - $reg_done = apply_filters( 'tutor_registration_done', true );
142 - if ( ! $reg_done ) {
143 - $wpdb->query( 'ROLLBACK' );
144 - return;
145 - } else {
146 - $wpdb->query( 'COMMIT' );
147 -
111 + $user_id = wp_insert_user( $userdata );
112 + if ( ! is_wp_error( $user_id ) ) {
113 + $user = get_user_by( 'id', $user_id );
114 + if ( $user ) {
115 + wp_set_current_user( $user_id, $user->user_login );
116 + wp_set_auth_cookie( $user_id );
148 117 }
149 - } else {
150 - /**
151 - * Tutor Free - reqular student reg process.
152 - */
153 - $wpdb->query( 'COMMIT' );
154 118
155 - wp_set_current_user( $user_id, $user->user_login );
156 - wp_set_auth_cookie( $user_id );
157 119 do_action( 'tutor_after_student_signup', $user_id );
158 -
159 - // since 1.9.8 do enroll if guest attempt to enroll.
160 - if ( ! empty( $enroll_attempt ) ) {
161 - do_action( 'tutor_do_enroll_after_login_if_attempt', $enroll_attempt, $user_id );
120 + // since 1.9.8 do enroll if guest attempt to enroll
121 + if(!empty($_POST['tutor_course_enroll_attempt'])) {
122 + do_action( 'tutor_do_enroll_after_login_if_attempt', $_POST['tutor_course_enroll_attempt'], $user_id );
162 123 }
163 -
164 - // Redirect page.
165 - $redirect_url = tutor_utils()->array_get( 'redirect_to', $_REQUEST ); //phpcs:ignore
166 - if ( ! $redirect_url ) {
167 - $redirect_url = tutor_utils()->tutor_dashboard_url();
124 +
125 + // Redirect page
126 + $redirect_page = tutor_utils()->array_get( 'redirect_to', $_REQUEST );
127 + if ( ! $redirect_page ) {
128 + $redirect_page = tutor_utils()->tutor_dashboard_url();
168 129 }
130 + wp_redirect(apply_filters('tutor_student_register_redirect_url', $redirect_page, $user));
131 + die();
132 + } else {
133 + $this->error_msgs = $user_id->get_error_messages();
134 + add_filter( 'tutor_student_register_validation_errors', array( $this, 'tutor_student_form_validation_errors' ) );
135 + return;
169 136 }
170 137
171 - do_action( 'tutor_new_user_registered', $user, $validate_consent );
172 - wp_safe_redirect( apply_filters( 'tutor_student_register_redirect_url', tutor_utils()->get_nocache_url( $redirect_url ), $user ) );
138 + $registration_page = tutor_utils()->student_register_url();
139 + wp_redirect( $registration_page );
173 140 die();
174 141 }
175 142
176 - /**
177 - * Get validation error messages
178 - *
179 - * @since 1.0.0
180 - *
181 - * @return mixed error messages
182 - */
183 143 public function tutor_student_form_validation_errors() {
184 144 return $this->error_msgs;
185 145 }
186 146
187 - /**
188 - * Update profile
189 - *
190 - * @since 1.0.0
191 - *
192 - * @return void send wp_json response
193 - */
194 147 public function update_profile() {
195 - // Checking nonce.
148 + // Checking nonce
196 149 tutor_utils()->checking_nonce();
197 150
198 151 $user_id = get_current_user_id();
199 152 do_action( 'tutor_profile_update_before', $user_id );
200 153
201 - $first_name = sanitize_text_field( tutor_utils()->input_old( 'first_name' ) );
202 - $last_name = sanitize_text_field( tutor_utils()->input_old( 'last_name' ) );
203 - $phone_number = sanitize_text_field( tutor_utils()->input_old( 'phone_number' ) );
204 - $tutor_profile_bio = wp_kses( Input::post( 'tutor_profile_bio', '', Input::TYPE_KSES_POST ), tutor_utils()->allowed_profile_bio_tags() );
154 + $first_name = sanitize_text_field( tutor_utils()->input_old( 'first_name' ) );
155 + $last_name = sanitize_text_field( tutor_utils()->input_old( 'last_name' ) );
156 + $phone_number = sanitize_text_field( tutor_utils()->input_old( 'phone_number' ) );
157 + $tutor_profile_bio = wp_kses_post( tutor_utils()->input_old( 'tutor_profile_bio' ) );
205 158 $tutor_profile_job_title = sanitize_text_field( tutor_utils()->input_old( 'tutor_profile_job_title' ) );
206 - $timezone = Input::post( 'timezone', '' );
207 159
208 160 $display_name = sanitize_text_field( tutor_utils()->input_old( 'display_name' ) );
209 161
210 162 $userdata = array(
@@ -212,50 +164,57 @@
212 164 'first_name' => $first_name,
213 165 'last_name' => $last_name,
214 166 'display_name' => $display_name,
215 167 );
168 + $user_id = wp_update_user( $userdata );
216 169
217 - $user_id = wp_update_user( $userdata );
170 + if ( ! is_wp_error( $user_id ) ) {
171 + update_user_meta( $user_id, 'phone_number', $phone_number );
172 + update_user_meta( $user_id, '_tutor_profile_bio', $tutor_profile_bio );
173 + update_user_meta( $user_id, '_tutor_profile_job_title', $tutor_profile_job_title );
218 174
219 - if ( ! is_wp_error( $user_id ) ) {
220 - update_user_meta( $user_id, User::PHONE_NUMBER_META, $phone_number );
221 - update_user_meta( $user_id, User::PROFILE_BIO_META, $tutor_profile_bio );
222 - update_user_meta( $user_id, User::PROFILE_JOB_TITLE_META, $tutor_profile_job_title );
223 - update_user_meta( $user_id, User::TIMEZONE_META, $timezone );
175 + $tutor_user_social = tutor_utils()->tutor_user_social_icons();
176 + foreach ( $tutor_user_social as $key => $social ) {
177 + $user_social_value = sanitize_text_field( tutor_utils()->input_old( $key ) );
178 + if ( $user_social_value ) {
179 + update_user_meta( $user_id, $key, $user_social_value );
180 + } else {
181 + delete_user_meta( $user_id, $key );
182 + }
183 + }
224 184 }
225 -
226 185 do_action( 'tutor_profile_update_after', $user_id );
227 -
228 - wp_send_json_success( array( 'message' => __( 'Profile Updated', 'tutor' ) ) );
186 +
187 + wp_send_json_success( array('message' => __('Profile Updated', 'tutor')) );
229 188 }
230 189
231 190 /**
232 - * Filter Avatar, Change avatar URL with Tutor User Photo
191 + * Filter Avatar
233 192 *
234 - * @since 1.0.0
193 + * @param $url
194 + * @param $id_or_email id or email
195 + * @param $args extra args
235 196 *
236 - * @param string $url url.
237 - * @param mixed $id_or_email id or email.
238 - * @param array $args extra args.
197 + * @return false|string
239 198 *
240 - * @return false|string
199 + * Change avatar URL with Tutor User Photo
241 200 */
242 201 public function filter_avatar( $url, $id_or_email, $args ) {
202 + global $wpdb;
243 203
244 204 $finder = false;
245 - $is_id = is_numeric( $id_or_email );
246 205
247 - if ( $is_id ) {
206 + if ( is_numeric( $id_or_email ) ) {
248 207 $finder = absint( $id_or_email );
249 208 } elseif ( is_string( $id_or_email ) ) {
250 209 $finder = $id_or_email;
251 - } elseif ( $id_or_email instanceof \WP_User ) {
252 - // User Object.
210 + } elseif ( $id_or_email instanceof WP_User ) {
211 + // User Object
253 212 $finder = $id_or_email->ID;
254 - } elseif ( $id_or_email instanceof \WP_Post ) {
255 - // Post Object.
213 + } elseif ( $id_or_email instanceof WP_Post ) {
214 + // Post Object
256 215 $finder = (int) $id_or_email->post_author;
257 - } elseif ( $id_or_email instanceof \WP_Comment ) {
216 + } elseif ( $id_or_email instanceof WP_Comment ) {
258 217 return $url;
259 218 }
260 219
261 220 if ( ! $finder ) {
@@ -261,15 +220,14 @@
261 220 if ( ! $finder ) {
262 221 return $url;
263 222 }
264 223
265 - $user = get_user_by( $is_id ? 'ID' : 'email', $finder );
266 -
267 - if ( $user ) {
268 - $profile_photo = get_user_meta( $user->ID, '_tutor_profile_photo', true );
224 + $user_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM {$wpdb->users} WHERE ID = %s OR user_email = %s ", $finder, $finder ) );
225 + if ( $user_id ) {
226 + $profile_photo = get_user_meta( $user_id, '_tutor_profile_photo', true );
269 227 if ( $profile_photo ) {
270 - $size = isset( $args['size'] ) ? $args['size'] : 'thumbnail';
271 - $url = wp_get_attachment_image_url( $profile_photo, $size );
228 + $size = isset($args['size']) ? $args['size'] : 'thumbnail';
229 + $url = wp_get_attachment_image_url( $profile_photo, $size );
272 230 }
273 231 }
274 232 return $url;
275 233 }
@@ -275,12 +233,8 @@
275 233 }
276 234
277 235 /**
278 236 * Password Rest
279 - *
280 - * @since 1.0.0
281 - *
282 - * @return void send wp_json response
283 237 */
284 238 public function tutor_reset_password() {
285 239 // Checking nonce.
286 240 tutor_utils()->checking_nonce();
@@ -286,11 +240,11 @@
286 240 tutor_utils()->checking_nonce();
287 241
288 242 $user = wp_get_current_user();
289 243
290 - $previous_password = Input::post( 'previous_password', '' );
291 - $new_password = Input::post( 'new_password', '' );
292 - $confirm_new_password = Input::post( 'confirm_new_password', '' );
244 + $previous_password = sanitize_text_field( $_POST['previous_password'] );
245 + $new_password = sanitize_text_field( $_POST['new_password'] );
246 + $confirm_new_password = sanitize_text_field( $_POST['confirm_new_password'] );
293 247
294 248 $previous_password_checked = wp_check_password( $previous_password, $user->user_pass, $user->ID );
295 249
296 250 $validation_errors = array();
@@ -305,24 +259,22 @@
305 259 }
306 260 if ( $new_password !== $confirm_new_password ) {
307 261 $validation_errors['password_not_matched'] = __( 'New password and confirm password does not matched', 'tutor' );
308 262 }
309 -
263 +
310 264 if ( $previous_password_checked && ! empty( $new_password ) && $new_password === $confirm_new_password ) {
311 265 wp_set_password( $new_password, $user->ID );
312 - wp_send_json_success( array( 'message' => __( 'Password Changed', 'tutor' ) ) );
266 + wp_send_json_success( array('message' => __('Password Changed', 'tutor')) );
313 267 }
314 268
315 - $first_message = count( $validation_errors ) ? $validation_errors[ array_keys( $validation_errors )[0] ] : __( 'Something went wrong!', 'tutor' );
316 - wp_send_json_error( array( 'message' => $first_message ) );
269 + $first_message = count($validation_errors) ? $validation_errors[array_keys($validation_errors)[0]] : __('Something went wrong!', 'tutor');
270 + wp_send_json_error( array('message' => $first_message) );
317 271 }
318 272
319 273 /**
320 274 * Handle social links
321 275 *
322 - * @since 2.0.0
323 - *
324 - * @return void
276 + * @since v2.0.0
325 277 */
326 278 public function tutor_social_profile() {
327 279 tutor_utils()->checking_nonce();
328 280
@@ -336,73 +288,8 @@
336 288 } else {
337 289 delete_user_meta( $user_id, $key );
338 290 }
339 291 }
340 -
341 - wp_send_json_success( array( 'message' => __( 'Social Profile Updated', 'tutor' ) ) );
292 + wp_redirect( wp_get_raw_referer() );
342 293 die();
343 - }
344 -
345 - /**
346 - * Get courses tab configuration for student dashboard
347 - *
348 - * Generates the tab structure for displaying student courses with dropdown options
349 - * for enrolled, active, and completed courses including counts and navigation URLs.
350 - *
351 - * @since 4.0.0
352 - *
353 - * @param string $active_tab The currently active tab identifier.
354 - * @param array $post_type_args Query arguments for post type filtering.
355 - * @param int $enrolled_course_count Number of enrolled courses.
356 - * @param int $active_course_count Number of active courses.
357 - * @param int $completed_course_count Number of completed courses.
358 - *
359 - * @return array Array containing tab configuration with dropdown options
360 - */
361 - public function get_courses_tab( $active_tab, $post_type_args, $enrolled_course_count, $active_course_count, $completed_course_count ) {
362 - $courses_tab = array(
363 - array(
364 - 'type' => 'dropdown',
365 - 'active' => ( ( 'courses' === $active_tab ) || ( 'courses/active-courses' === $active_tab ) || ( 'courses/completed-courses' === $active_tab ) ) ? true : false,
366 - 'options' => array(
367 - array(
368 - 'label' => __( 'Enrolled', 'tutor' ),
369 - 'icon' => Icon::ENROLLED,
370 - 'url' => esc_url( add_query_arg( $post_type_args, tutor_utils()->get_tutor_dashboard_page_permalink( 'courses' ) ) ),
371 - 'active' => 'courses' === $active_tab ? true : false,
372 - 'count' => $enrolled_course_count,
373 - ),
374 - array(
375 - 'label' => __( 'Active', 'tutor' ),
376 - 'icon' => Icon::PLAY_LINE_2,
377 - 'url' => esc_url( add_query_arg( $post_type_args, tutor_utils()->get_tutor_dashboard_page_permalink( 'courses/active-courses' ) ) ),
378 - 'active' => 'courses/active-courses' === $active_tab ? true : false,
379 - 'count' => $active_course_count,
380 - ),
381 - array(
382 - 'label' => __( 'Complete', 'tutor' ),
383 - 'icon' => Icon::COMPLETED_CIRCLE,
384 - 'url' => esc_url( add_query_arg( $post_type_args, tutor_utils()->get_tutor_dashboard_page_permalink( 'courses/completed-courses' ) ) ),
385 - 'active' => 'courses/completed-courses' === $active_tab ? true : false,
386 - 'count' => $completed_course_count,
387 - ),
388 - ),
389 - ),
390 - array(
391 - 'type' => 'link',
392 - 'label' => __( 'Wishlist', 'tutor' ),
393 - 'icon' => Icon::WISHLIST,
394 - 'url' => esc_url( tutor_utils()->tutor_dashboard_url( 'courses/wishlist' ) ),
395 - 'active' => 'courses/wishlist' === $active_tab ? true : false,
396 - ),
397 - array(
398 - 'type' => 'link',
399 - 'label' => __( 'Quiz Attempts', 'tutor' ),
400 - 'icon' => Icon::QUIZ_2,
401 - 'url' => esc_url( tutor_utils()->tutor_dashboard_url( 'courses/my-quiz-attempts' ) ),
402 - 'active' => 'courses/my-quiz-attempts' === $active_tab ? true : false,
403 - ),
404 - );
405 -
406 - return $courses_tab;
407 294 }
408 295 }