PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.7.6
Tutor LMS – eLearning and online course solution v2.7.6
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 2 years ago Admin.php 2 years ago Ajax.php 1 year ago Announcements.php 1 year ago Assets.php 2 years ago Backend_Page_Trait.php 3 years ago Course.php 1 year ago Course_Embed.php 3 years ago Course_Filter.php 1 year ago Course_List.php 1 year ago Course_Settings_Tabs.php 3 years ago Course_Widget.php 3 years ago Custom_Validation.php 3 years ago Dashboard.php 3 years ago FormHandler.php 2 years ago Frontend.php 2 years ago Gutenberg.php 3 years ago Input.php 3 years ago Instructor.php 2 years ago Instructors_List.php 1 year ago Lesson.php 1 year ago Options_V2.php 1 year ago Permalink.php 2 years ago Post_types.php 2 years ago Private_Course_Access.php 3 years ago Q_And_A.php 1 year ago Question_Answers_List.php 3 years ago Quiz.php 1 year ago Quiz_Attempts_List.php 1 year ago RestAPI.php 2 years ago Reviews.php 3 years ago Rewrite_Rules.php 2 years ago Shortcode.php 1 year ago Student.php 2 years ago Students_List.php 3 years ago Taxonomies.php 3 years ago Template.php 2 years ago Theme_Compatibility.php 3 years ago Tools.php 3 years ago Tools_V2.php 2 years ago Tutor.php 2 years ago TutorEDD.php 2 years ago Tutor_Base.php 2 years ago Tutor_Setup.php 2 years ago Upgrader.php 2 years ago User.php 2 years ago Utils.php 1 year ago Video_Stream.php 3 years ago WhatsNew.php 2 years ago Withdraw.php 2 years ago Withdraw_Requests_List.php 3 years ago WooCommerce.php 1 year ago
Student.php
343 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( 'tutor_action_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 = Input::post( 'tutor_profile_bio', '', Input::TYPE_KSES_POST );
198 $tutor_profile_job_title = sanitize_text_field( tutor_utils()->input_old( 'tutor_profile_job_title' ) );
199
200 $display_name = sanitize_text_field( tutor_utils()->input_old( 'display_name' ) );
201
202 $userdata = array(
203 'ID' => $user_id,
204 'first_name' => $first_name,
205 'last_name' => $last_name,
206 'display_name' => $display_name,
207 );
208 $user_id = wp_update_user( $userdata );
209
210 if ( ! is_wp_error( $user_id ) ) {
211 update_user_meta( $user_id, 'phone_number', $phone_number );
212 update_user_meta( $user_id, '_tutor_profile_bio', $tutor_profile_bio );
213 update_user_meta( $user_id, '_tutor_profile_job_title', $tutor_profile_job_title );
214
215 $tutor_user_social = tutor_utils()->tutor_user_social_icons();
216 foreach ( $tutor_user_social as $key => $social ) {
217 $user_social_value = sanitize_text_field( tutor_utils()->input_old( $key ) );
218 if ( $user_social_value ) {
219 update_user_meta( $user_id, $key, $user_social_value );
220 } else {
221 delete_user_meta( $user_id, $key );
222 }
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 wp_safe_redirect( wp_get_raw_referer() );
340 die();
341 }
342 }
343