PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.9.1
Tutor LMS – eLearning and online course solution v3.9.1
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 8 months ago Ajax.php 9 months ago Announcements.php 1 year ago Assets.php 8 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 9 months ago Course_Embed.php 3 years ago Course_Filter.php 1 year ago Course_List.php 10 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 1 year ago Instructors_List.php 11 months ago Lesson.php 8 months ago Options_V2.php 9 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 9 months ago QuizBuilder.php 11 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 1 year 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 9 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 1 year ago Utils.php 8 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 9 months ago
Student.php
338 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 $validation_errors = array();
75
76 // Registration error push into validation_errors.
77 $errors = apply_filters( 'registration_errors', new \WP_Error(), '', '' );
78 foreach ( $errors->errors as $key => $value ) {
79 $validation_errors[ $key ] = $value[0];
80
81 }
82
83 foreach ( $required_fields as $required_key => $required_value ) {
84 if ( empty( Input::post( $required_key, '' ) ) ) {
85 $validation_errors[ $required_key ] = $required_value;
86 }
87 }
88
89 if ( ! filter_var( tutor_utils()->input_old( 'email' ), FILTER_VALIDATE_EMAIL ) ) {
90 $validation_errors['email'] = __( 'Valid E-Mail is required', 'tutor' );
91 }
92 if ( tutor_utils()->input_old( 'password' ) !== tutor_utils()->input_old( 'password_confirmation' ) ) {
93 $validation_errors['password_confirmation'] = __( 'Your passwords should match each other. Please recheck.', 'tutor' );
94 }
95
96 if ( count( $validation_errors ) ) {
97 $this->error_msgs = $validation_errors;
98 add_filter( 'tutor_student_register_validation_errors', array( $this, 'tutor_student_form_validation_errors' ) );
99 return;
100 }
101
102 $first_name = sanitize_text_field( tutor_utils()->input_old( 'first_name' ) );
103 $last_name = sanitize_text_field( tutor_utils()->input_old( 'last_name' ) );
104 $email = sanitize_text_field( tutor_utils()->input_old( 'email' ) );
105 $user_login = sanitize_text_field( tutor_utils()->input_old( 'user_login' ) );
106 $password = sanitize_text_field( tutor_utils()->input_old( 'password' ) );
107
108 $userdata = array(
109 'user_login' => $user_login,
110 'user_email' => $email,
111 'first_name' => $first_name,
112 'last_name' => $last_name,
113 'user_pass' => $password,
114 );
115
116 global $wpdb;
117 $wpdb->query( 'START TRANSACTION' );
118
119 $user_id = wp_insert_user( $userdata );
120 $enroll_attempt = Input::post( 'tutor_course_enroll_attempt', '' );
121
122 if ( is_wp_error( $user_id ) ) {
123 $this->error_msgs = $user_id->get_error_messages();
124 add_filter( 'tutor_student_register_validation_errors', array( $this, 'tutor_student_form_validation_errors' ) );
125 return;
126 }
127
128 $user = get_user_by( 'id', $user_id );
129
130 $is_req_email_verification = apply_filters( 'tutor_require_email_verification', false );
131 if ( $is_req_email_verification ) {
132 do_action( 'tutor_send_verification_mail', $user, $enroll_attempt );
133 $reg_done = apply_filters( 'tutor_registration_done', true );
134 if ( ! $reg_done ) {
135 $wpdb->query( 'ROLLBACK' );
136 return;
137 } else {
138 $wpdb->query( 'COMMIT' );
139 }
140 } else {
141 /**
142 * Tutor Free - reqular student reg process.
143 */
144 $wpdb->query( 'COMMIT' );
145
146 wp_set_current_user( $user_id, $user->user_login );
147 wp_set_auth_cookie( $user_id );
148
149 do_action( 'tutor_after_student_signup', $user_id );
150 // since 1.9.8 do enroll if guest attempt to enroll.
151 if ( ! empty( $enroll_attempt ) ) {
152 do_action( 'tutor_do_enroll_after_login_if_attempt', $enroll_attempt, $user_id );
153 }
154
155 // Redirect page.
156 $redirect_page = tutor_utils()->array_get( 'redirect_to', $_REQUEST ); //phpcs:ignore
157 if ( ! $redirect_page ) {
158 $redirect_page = tutor_utils()->tutor_dashboard_url();
159 }
160 wp_safe_redirect( apply_filters( 'tutor_student_register_redirect_url', $redirect_page, $user ) );
161 die();
162 }
163
164 $registration_page = tutor_utils()->student_register_url();
165 wp_safe_redirect( $registration_page );
166 die();
167 }
168
169 /**
170 * Get validation error messages
171 *
172 * @since 1.0.0
173 *
174 * @return mixed error messages
175 */
176 public function tutor_student_form_validation_errors() {
177 return $this->error_msgs;
178 }
179
180 /**
181 * Update profile
182 *
183 * @since 1.0.0
184 *
185 * @return void send wp_json response
186 */
187 public function update_profile() {
188 // Checking nonce.
189 tutor_utils()->checking_nonce();
190
191 $user_id = get_current_user_id();
192 do_action( 'tutor_profile_update_before', $user_id );
193
194 $first_name = sanitize_text_field( tutor_utils()->input_old( 'first_name' ) );
195 $last_name = sanitize_text_field( tutor_utils()->input_old( 'last_name' ) );
196 $phone_number = sanitize_text_field( tutor_utils()->input_old( 'phone_number' ) );
197 $tutor_profile_bio = wp_kses( Input::post( 'tutor_profile_bio', '', Input::TYPE_KSES_POST ), tutor_utils()->allowed_profile_bio_tags() );
198 $tutor_profile_job_title = sanitize_text_field( tutor_utils()->input_old( 'tutor_profile_job_title' ) );
199 $timezone = Input::post( 'timezone', '' );
200
201 $display_name = sanitize_text_field( tutor_utils()->input_old( 'display_name' ) );
202
203 $userdata = array(
204 'ID' => $user_id,
205 'first_name' => $first_name,
206 'last_name' => $last_name,
207 'display_name' => $display_name,
208 );
209
210 $user_id = wp_update_user( $userdata );
211
212 if ( ! is_wp_error( $user_id ) ) {
213 update_user_meta( $user_id, User::PHONE_NUMBER_META, $phone_number );
214 update_user_meta( $user_id, User::PROFILE_BIO_META, $tutor_profile_bio );
215 update_user_meta( $user_id, User::PROFILE_JOB_TITLE_META, $tutor_profile_job_title );
216 update_user_meta( $user_id, User::TIMEZONE_META, $timezone );
217 }
218
219 do_action( 'tutor_profile_update_after', $user_id );
220
221 wp_send_json_success( array( 'message' => __( 'Profile Updated', 'tutor' ) ) );
222 }
223
224 /**
225 * Filter Avatar, Change avatar URL with Tutor User Photo
226 *
227 * @since 1.0.0
228 *
229 * @param string $url url.
230 * @param mixed $id_or_email id or email.
231 * @param array $args extra args.
232 *
233 * @return false|string
234 */
235 public function filter_avatar( $url, $id_or_email, $args ) {
236
237 $finder = false;
238 $is_id = is_numeric( $id_or_email );
239
240 if ( $is_id ) {
241 $finder = absint( $id_or_email );
242 } elseif ( is_string( $id_or_email ) ) {
243 $finder = $id_or_email;
244 } elseif ( $id_or_email instanceof \WP_User ) {
245 // User Object.
246 $finder = $id_or_email->ID;
247 } elseif ( $id_or_email instanceof \WP_Post ) {
248 // Post Object.
249 $finder = (int) $id_or_email->post_author;
250 } elseif ( $id_or_email instanceof \WP_Comment ) {
251 return $url;
252 }
253
254 if ( ! $finder ) {
255 return $url;
256 }
257
258 $user = get_user_by( $is_id ? 'ID' : 'email', $finder );
259
260 if ( $user ) {
261 $profile_photo = get_user_meta( $user->ID, '_tutor_profile_photo', true );
262 if ( $profile_photo ) {
263 $size = isset( $args['size'] ) ? $args['size'] : 'thumbnail';
264 $url = wp_get_attachment_image_url( $profile_photo, $size );
265 }
266 }
267 return $url;
268 }
269
270 /**
271 * Password Rest
272 *
273 * @since 1.0.0
274 *
275 * @return void send wp_json response
276 */
277 public function tutor_reset_password() {
278 // Checking nonce.
279 tutor_utils()->checking_nonce();
280
281 $user = wp_get_current_user();
282
283 $previous_password = Input::post( 'previous_password', '' );
284 $new_password = Input::post( 'new_password', '' );
285 $confirm_new_password = Input::post( 'confirm_new_password', '' );
286
287 $previous_password_checked = wp_check_password( $previous_password, $user->user_pass, $user->ID );
288
289 $validation_errors = array();
290 if ( ! $previous_password_checked ) {
291 $validation_errors['incorrect_previous_password'] = __( 'Incorrect Previous Password', 'tutor' );
292 }
293 if ( empty( $new_password ) ) {
294 $validation_errors['new_password_required'] = __( 'New Password Required', 'tutor' );
295 }
296 if ( empty( $confirm_new_password ) ) {
297 $validation_errors['confirm_password_required'] = __( 'Confirm Password Required', 'tutor' );
298 }
299 if ( $new_password !== $confirm_new_password ) {
300 $validation_errors['password_not_matched'] = __( 'New password and confirm password does not matched', 'tutor' );
301 }
302
303 if ( $previous_password_checked && ! empty( $new_password ) && $new_password === $confirm_new_password ) {
304 wp_set_password( $new_password, $user->ID );
305 wp_send_json_success( array( 'message' => __( 'Password Changed', 'tutor' ) ) );
306 }
307
308 $first_message = count( $validation_errors ) ? $validation_errors[ array_keys( $validation_errors )[0] ] : __( 'Something went wrong!', 'tutor' );
309 wp_send_json_error( array( 'message' => $first_message ) );
310 }
311
312 /**
313 * Handle social links
314 *
315 * @since 2.0.0
316 *
317 * @return void
318 */
319 public function tutor_social_profile() {
320 tutor_utils()->checking_nonce();
321
322 $user_id = get_current_user_id();
323 $tutor_user_social = tutor_utils()->tutor_user_social_icons();
324
325 foreach ( $tutor_user_social as $key => $social ) {
326 $user_social_value = sanitize_text_field( tutor_utils()->input_old( $key ) );
327 if ( '' !== $user_social_value ) {
328 update_user_meta( $user_id, $key, $user_social_value );
329 } else {
330 delete_user_meta( $user_id, $key );
331 }
332 }
333
334 wp_send_json_success( array( 'message' => __( 'Social Profile Updated', 'tutor' ) ) );
335 die();
336 }
337 }
338