PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.0.2
Tutor LMS – eLearning and online course solution v3.0.2
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 1 year ago Admin.php 1 year ago Ajax.php 1 year ago Announcements.php 1 year ago Assets.php 1 year ago Backend_Page_Trait.php 1 year ago BaseController.php 1 year 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 1 year ago Course_Widget.php 3 years ago Custom_Validation.php 3 years ago Dashboard.php 1 year ago Earnings.php 1 year ago FormHandler.php 2 years ago Frontend.php 1 year ago Gutenberg.php 1 year ago Input.php 1 year ago Instructor.php 1 year 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 1 year ago Q_And_A.php 1 year ago Question_Answers_List.php 3 years ago Quiz.php 1 year ago QuizBuilder.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 Singleton.php 1 year ago Student.php 1 year ago Students_List.php 3 years ago Taxonomies.php 3 years ago Template.php 1 year ago Theme_Compatibility.php 3 years ago Tools.php 3 years ago Tools_V2.php 1 year ago Tutor.php 1 year ago TutorEDD.php 1 year ago Tutor_Base.php 2 years ago Tutor_Setup.php 1 year ago Upgrader.php 1 year ago User.php 1 year ago Utils.php 1 year ago Video_Stream.php 3 years ago WhatsNew.php 2 years ago Withdraw.php 1 year ago Withdraw_Requests_List.php 3 years ago WooCommerce.php 1 year ago
Student.php
337 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 = 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 $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 $user_id = wp_update_user( $userdata );
210
211 if ( ! is_wp_error( $user_id ) ) {
212 update_user_meta( $user_id, User::PHONE_NUMBER_META, $phone_number );
213 update_user_meta( $user_id, User::PROFILE_BIO_META, $tutor_profile_bio );
214 update_user_meta( $user_id, User::PROFILE_JOB_TITLE_META, $tutor_profile_job_title );
215 update_user_meta( $user_id, User::TIMEZONE_META, $timezone );
216 }
217
218 do_action( 'tutor_profile_update_after', $user_id );
219
220 wp_send_json_success( array( 'message' => __( 'Profile Updated', 'tutor' ) ) );
221 }
222
223 /**
224 * Filter Avatar, Change avatar URL with Tutor User Photo
225 *
226 * @since 1.0.0
227 *
228 * @param string $url url.
229 * @param mixed $id_or_email id or email.
230 * @param array $args extra args.
231 *
232 * @return false|string
233 */
234 public function filter_avatar( $url, $id_or_email, $args ) {
235
236 $finder = false;
237 $is_id = is_numeric( $id_or_email );
238
239 if ( $is_id ) {
240 $finder = absint( $id_or_email );
241 } elseif ( is_string( $id_or_email ) ) {
242 $finder = $id_or_email;
243 } elseif ( $id_or_email instanceof \WP_User ) {
244 // User Object.
245 $finder = $id_or_email->ID;
246 } elseif ( $id_or_email instanceof \WP_Post ) {
247 // Post Object.
248 $finder = (int) $id_or_email->post_author;
249 } elseif ( $id_or_email instanceof \WP_Comment ) {
250 return $url;
251 }
252
253 if ( ! $finder ) {
254 return $url;
255 }
256
257 $user = get_user_by( $is_id ? 'ID' : 'email', $finder );
258
259 if ( $user ) {
260 $profile_photo = get_user_meta( $user->ID, '_tutor_profile_photo', true );
261 if ( $profile_photo ) {
262 $size = isset( $args['size'] ) ? $args['size'] : 'thumbnail';
263 $url = wp_get_attachment_image_url( $profile_photo, $size );
264 }
265 }
266 return $url;
267 }
268
269 /**
270 * Password Rest
271 *
272 * @since 1.0.0
273 *
274 * @return void send wp_json response
275 */
276 public function tutor_reset_password() {
277 // Checking nonce.
278 tutor_utils()->checking_nonce();
279
280 $user = wp_get_current_user();
281
282 $previous_password = Input::post( 'previous_password', '' );
283 $new_password = Input::post( 'new_password', '' );
284 $confirm_new_password = Input::post( 'confirm_new_password', '' );
285
286 $previous_password_checked = wp_check_password( $previous_password, $user->user_pass, $user->ID );
287
288 $validation_errors = array();
289 if ( ! $previous_password_checked ) {
290 $validation_errors['incorrect_previous_password'] = __( 'Incorrect Previous Password', 'tutor' );
291 }
292 if ( empty( $new_password ) ) {
293 $validation_errors['new_password_required'] = __( 'New Password Required', 'tutor' );
294 }
295 if ( empty( $confirm_new_password ) ) {
296 $validation_errors['confirm_password_required'] = __( 'Confirm Password Required', 'tutor' );
297 }
298 if ( $new_password !== $confirm_new_password ) {
299 $validation_errors['password_not_matched'] = __( 'New password and confirm password does not matched', 'tutor' );
300 }
301
302 if ( $previous_password_checked && ! empty( $new_password ) && $new_password === $confirm_new_password ) {
303 wp_set_password( $new_password, $user->ID );
304 wp_send_json_success( array( 'message' => __( 'Password Changed', 'tutor' ) ) );
305 }
306
307 $first_message = count( $validation_errors ) ? $validation_errors[ array_keys( $validation_errors )[0] ] : __( 'Something went wrong!', 'tutor' );
308 wp_send_json_error( array( 'message' => $first_message ) );
309 }
310
311 /**
312 * Handle social links
313 *
314 * @since 2.0.0
315 *
316 * @return void
317 */
318 public function tutor_social_profile() {
319 tutor_utils()->checking_nonce();
320
321 $user_id = get_current_user_id();
322 $tutor_user_social = tutor_utils()->tutor_user_social_icons();
323
324 foreach ( $tutor_user_social as $key => $social ) {
325 $user_social_value = sanitize_text_field( tutor_utils()->input_old( $key ) );
326 if ( '' !== $user_social_value ) {
327 update_user_meta( $user_id, $key, $user_social_value );
328 } else {
329 delete_user_meta( $user_id, $key );
330 }
331 }
332
333 wp_send_json_success( array( 'message' => __( 'Social Profile Updated', 'tutor' ) ) );
334 die();
335 }
336 }
337