PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.9.9
Tutor LMS – eLearning and online course solution v3.9.9
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 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / classes / Student.php
tutor / classes Last commit date
Addons.php 11 months ago Admin.php 2 months ago Ajax.php 9 months ago Announcements.php 1 year ago Assets.php 7 months ago Backend_Page_Trait.php 1 year ago BaseController.php 1 year ago Config.php 11 months ago Container.php 11 months ago Course.php 2 months ago Course_Embed.php 3 years ago Course_Filter.php 1 year ago Course_List.php 5 months ago Course_Settings_Tabs.php 1 year ago Course_Widget.php 1 year ago Custom_Validation.php 3 years ago Dashboard.php 1 year ago Earnings.php 9 months ago FormHandler.php 2 years ago Frontend.php 1 year ago Gutenberg.php 1 year ago Icon.php 8 months ago Input.php 1 year ago Instructor.php 2 months ago Instructors_List.php 2 months ago Lesson.php 8 months ago Options_V2.php 7 months ago Permalink.php 2 years ago Post_types.php 1 year ago Private_Course_Access.php 1 year ago Q_And_A.php 10 months ago Question_Answers_List.php 11 months ago Quiz.php 5 months ago QuizBuilder.php 3 months ago Quiz_Attempts_List.php 9 months ago RestAPI.php 2 years ago Reviews.php 9 months ago Rewrite_Rules.php 2 years ago Shortcode.php 9 months ago Singleton.php 1 year ago Student.php 2 months ago Students_List.php 1 year ago Taxonomies.php 1 year ago Template.php 9 months ago Theme_Compatibility.php 3 years ago Tools.php 1 year ago Tools_V2.php 1 year ago Tutor.php 3 months ago TutorEDD.php 1 year ago Tutor_Base.php 2 years ago Tutor_Setup.php 8 months ago Upgrader.php 9 months ago User.php 4 months ago Utils.php 5 months ago Video_Stream.php 3 years ago WhatsNew.php 9 months ago Withdraw.php 1 year ago Withdraw_Requests_List.php 11 months ago WooCommerce.php 7 months ago
Student.php
344 lines
1 <?php
2 /**
3 * Class Student
4 *
5 * @package Tutor\Student
6 * @author Themeum <support@themeum.com>
7 * @link https://themeum.com
8 * @since 1.0.0
9 */
10
11 namespace TUTOR;
12
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Manage students
19 *
20 * @since 1.0.0
21 */
22 class Student {
23
24 /**
25 * Bagged error messages
26 *
27 * @since 1.0.0
28 *
29 * @var $error_msgs
30 */
31 protected $error_msgs = '';
32
33 /**
34 * Handle Hooks
35 *
36 * @since 1.0.0
37 */
38 public function __construct() {
39 add_action( 'template_redirect', array( $this, 'register_student' ) );
40 add_filter( 'get_avatar_url', array( $this, 'filter_avatar' ), 10, 3 );
41 add_action( 'wp_ajax_tutor_social_profile', array( $this, 'tutor_social_profile' ) );
42 add_action( 'wp_ajax_tutor_profile_password_reset', array( $this, 'tutor_reset_password' ) );
43 add_action( 'wp_ajax_tutor_update_profile', array( $this, 'update_profile' ) );
44 }
45
46 /**
47 * Register new user and mark him as student
48 *
49 * @since 1.0.0
50 *
51 * @return void
52 */
53 public function register_student() {
54 if ( 'tutor_register_student' !== Input::post( 'tutor_action', '' ) || ! get_option( 'users_can_register', false ) ) {
55 // Action must be register, and registration must be enabled in dashboard.
56 return;
57 }
58
59 // Checking nonce.
60 tutor_utils()->checking_nonce();
61
62 $required_fields = apply_filters(
63 'tutor_student_registration_required_fields',
64 array(
65 'first_name' => __( 'First name field is required', 'tutor' ),
66 'last_name' => __( 'Last name field is required', 'tutor' ),
67 'email' => __( 'E-Mail field is required', 'tutor' ),
68 'user_login' => __( 'User Name field is required', 'tutor' ),
69 'password' => __( 'Password field is required', 'tutor' ),
70 'password_confirmation' => __( 'Password Confirmation field is required', 'tutor' ),
71 )
72 );
73
74 $terms_conditions_link = tutor_utils()->get_toc_page_link();
75 if ( $terms_conditions_link ) {
76 $required_fields['terms_conditions'] = __( 'Please accept the Terms and Conditions to continue', 'tutor' );
77 }
78
79 $validation_errors = array();
80
81 // Registration error push into validation_errors.
82 $errors = apply_filters( 'registration_errors', new \WP_Error(), '', '' );
83 foreach ( $errors->errors as $key => $value ) {
84 $validation_errors[ $key ] = $value[0];
85
86 }
87
88 foreach ( $required_fields as $required_key => $required_value ) {
89 if ( empty( Input::post( $required_key, '' ) ) ) {
90 $validation_errors[ $required_key ] = $required_value;
91 }
92 }
93
94
95 if ( ! filter_var( tutor_utils()->input_old( 'email' ), FILTER_VALIDATE_EMAIL ) ) {
96 $validation_errors['email'] = __( 'Valid E-Mail is required', 'tutor' );
97 }
98 if ( tutor_utils()->input_old( 'password' ) !== tutor_utils()->input_old( 'password_confirmation' ) ) {
99 $validation_errors['password_confirmation'] = __( 'Your passwords should match each other. Please recheck.', 'tutor' );
100 }
101
102 if ( count( $validation_errors ) ) {
103 $this->error_msgs = $validation_errors;
104 add_filter( 'tutor_student_register_validation_errors', array( $this, 'tutor_student_form_validation_errors' ) );
105 return;
106 }
107
108 $first_name = sanitize_text_field( tutor_utils()->input_old( 'first_name' ) );
109 $last_name = sanitize_text_field( tutor_utils()->input_old( 'last_name' ) );
110 $email = sanitize_text_field( tutor_utils()->input_old( 'email' ) );
111 $user_login = sanitize_text_field( tutor_utils()->input_old( 'user_login' ) );
112 $password = sanitize_text_field( tutor_utils()->input_old( 'password' ) );
113
114 $userdata = array(
115 'user_login' => $user_login,
116 'user_email' => $email,
117 'first_name' => $first_name,
118 'last_name' => $last_name,
119 'user_pass' => $password,
120 );
121
122 global $wpdb;
123 $wpdb->query( 'START TRANSACTION' );
124
125 $user_id = wp_insert_user( $userdata );
126 $enroll_attempt = Input::post( 'tutor_course_enroll_attempt', '' );
127
128 if ( is_wp_error( $user_id ) ) {
129 $this->error_msgs = $user_id->get_error_messages();
130 add_filter( 'tutor_student_register_validation_errors', array( $this, 'tutor_student_form_validation_errors' ) );
131 return;
132 }
133
134 $user = get_user_by( 'id', $user_id );
135
136 $is_req_email_verification = apply_filters( 'tutor_require_email_verification', false );
137 if ( $is_req_email_verification ) {
138 do_action( 'tutor_send_verification_mail', $user, $enroll_attempt );
139 $reg_done = apply_filters( 'tutor_registration_done', true );
140 if ( ! $reg_done ) {
141 $wpdb->query( 'ROLLBACK' );
142 return;
143 } else {
144 $wpdb->query( 'COMMIT' );
145 }
146 } else {
147 /**
148 * Tutor Free - reqular student reg process.
149 */
150 $wpdb->query( 'COMMIT' );
151
152 wp_set_current_user( $user_id, $user->user_login );
153 wp_set_auth_cookie( $user_id );
154
155 do_action( 'tutor_after_student_signup', $user_id );
156 // since 1.9.8 do enroll if guest attempt to enroll.
157 if ( ! empty( $enroll_attempt ) ) {
158 do_action( 'tutor_do_enroll_after_login_if_attempt', $enroll_attempt, $user_id );
159 }
160
161 // Redirect page.
162 $redirect_page = tutor_utils()->array_get( 'redirect_to', $_REQUEST ); //phpcs:ignore
163 if ( ! $redirect_page ) {
164 $redirect_page = tutor_utils()->tutor_dashboard_url();
165 }
166 wp_safe_redirect( apply_filters( 'tutor_student_register_redirect_url', $redirect_page, $user ) );
167 die();
168 }
169
170 $registration_page = tutor_utils()->student_register_url();
171 wp_safe_redirect( $registration_page );
172 die();
173 }
174
175 /**
176 * Get validation error messages
177 *
178 * @since 1.0.0
179 *
180 * @return mixed error messages
181 */
182 public function tutor_student_form_validation_errors() {
183 return $this->error_msgs;
184 }
185
186 /**
187 * Update profile
188 *
189 * @since 1.0.0
190 *
191 * @return void send wp_json response
192 */
193 public function update_profile() {
194 // Checking nonce.
195 tutor_utils()->checking_nonce();
196
197 $user_id = get_current_user_id();
198 do_action( 'tutor_profile_update_before', $user_id );
199
200 $first_name = sanitize_text_field( tutor_utils()->input_old( 'first_name' ) );
201 $last_name = sanitize_text_field( tutor_utils()->input_old( 'last_name' ) );
202 $phone_number = sanitize_text_field( tutor_utils()->input_old( 'phone_number' ) );
203 $tutor_profile_bio = wp_kses( Input::post( 'tutor_profile_bio', '', Input::TYPE_KSES_POST ), tutor_utils()->allowed_profile_bio_tags() );
204 $tutor_profile_job_title = sanitize_text_field( tutor_utils()->input_old( 'tutor_profile_job_title' ) );
205 $timezone = Input::post( 'timezone', '' );
206
207 $display_name = sanitize_text_field( tutor_utils()->input_old( 'display_name' ) );
208
209 $userdata = array(
210 'ID' => $user_id,
211 'first_name' => $first_name,
212 'last_name' => $last_name,
213 'display_name' => $display_name,
214 );
215
216 $user_id = wp_update_user( $userdata );
217
218 if ( ! is_wp_error( $user_id ) ) {
219 update_user_meta( $user_id, User::PHONE_NUMBER_META, $phone_number );
220 update_user_meta( $user_id, User::PROFILE_BIO_META, $tutor_profile_bio );
221 update_user_meta( $user_id, User::PROFILE_JOB_TITLE_META, $tutor_profile_job_title );
222 update_user_meta( $user_id, User::TIMEZONE_META, $timezone );
223 }
224
225 do_action( 'tutor_profile_update_after', $user_id );
226
227 wp_send_json_success( array( 'message' => __( 'Profile Updated', 'tutor' ) ) );
228 }
229
230 /**
231 * Filter Avatar, Change avatar URL with Tutor User Photo
232 *
233 * @since 1.0.0
234 *
235 * @param string $url url.
236 * @param mixed $id_or_email id or email.
237 * @param array $args extra args.
238 *
239 * @return false|string
240 */
241 public function filter_avatar( $url, $id_or_email, $args ) {
242
243 $finder = false;
244 $is_id = is_numeric( $id_or_email );
245
246 if ( $is_id ) {
247 $finder = absint( $id_or_email );
248 } elseif ( is_string( $id_or_email ) ) {
249 $finder = $id_or_email;
250 } elseif ( $id_or_email instanceof \WP_User ) {
251 // User Object.
252 $finder = $id_or_email->ID;
253 } elseif ( $id_or_email instanceof \WP_Post ) {
254 // Post Object.
255 $finder = (int) $id_or_email->post_author;
256 } elseif ( $id_or_email instanceof \WP_Comment ) {
257 return $url;
258 }
259
260 if ( ! $finder ) {
261 return $url;
262 }
263
264 $user = get_user_by( $is_id ? 'ID' : 'email', $finder );
265
266 if ( $user ) {
267 $profile_photo = get_user_meta( $user->ID, '_tutor_profile_photo', true );
268 if ( $profile_photo ) {
269 $size = isset( $args['size'] ) ? $args['size'] : 'thumbnail';
270 $url = wp_get_attachment_image_url( $profile_photo, $size );
271 }
272 }
273 return $url;
274 }
275
276 /**
277 * Password Rest
278 *
279 * @since 1.0.0
280 *
281 * @return void send wp_json response
282 */
283 public function tutor_reset_password() {
284 // Checking nonce.
285 tutor_utils()->checking_nonce();
286
287 $user = wp_get_current_user();
288
289 $previous_password = Input::post( 'previous_password', '' );
290 $new_password = Input::post( 'new_password', '' );
291 $confirm_new_password = Input::post( 'confirm_new_password', '' );
292
293 $previous_password_checked = wp_check_password( $previous_password, $user->user_pass, $user->ID );
294
295 $validation_errors = array();
296 if ( ! $previous_password_checked ) {
297 $validation_errors['incorrect_previous_password'] = __( 'Incorrect Previous Password', 'tutor' );
298 }
299 if ( empty( $new_password ) ) {
300 $validation_errors['new_password_required'] = __( 'New Password Required', 'tutor' );
301 }
302 if ( empty( $confirm_new_password ) ) {
303 $validation_errors['confirm_password_required'] = __( 'Confirm Password Required', 'tutor' );
304 }
305 if ( $new_password !== $confirm_new_password ) {
306 $validation_errors['password_not_matched'] = __( 'New password and confirm password does not matched', 'tutor' );
307 }
308
309 if ( $previous_password_checked && ! empty( $new_password ) && $new_password === $confirm_new_password ) {
310 wp_set_password( $new_password, $user->ID );
311 wp_send_json_success( array( 'message' => __( 'Password Changed', 'tutor' ) ) );
312 }
313
314 $first_message = count( $validation_errors ) ? $validation_errors[ array_keys( $validation_errors )[0] ] : __( 'Something went wrong!', 'tutor' );
315 wp_send_json_error( array( 'message' => $first_message ) );
316 }
317
318 /**
319 * Handle social links
320 *
321 * @since 2.0.0
322 *
323 * @return void
324 */
325 public function tutor_social_profile() {
326 tutor_utils()->checking_nonce();
327
328 $user_id = get_current_user_id();
329 $tutor_user_social = tutor_utils()->tutor_user_social_icons();
330
331 foreach ( $tutor_user_social as $key => $social ) {
332 $user_social_value = sanitize_text_field( tutor_utils()->input_old( $key ) );
333 if ( '' !== $user_social_value ) {
334 update_user_meta( $user_id, $key, $user_social_value );
335 } else {
336 delete_user_meta( $user_id, $key );
337 }
338 }
339
340 wp_send_json_success( array( 'message' => __( 'Social Profile Updated', 'tutor' ) ) );
341 die();
342 }
343 }
344