PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.6.1
Tutor LMS – eLearning and online course solution v2.6.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 / User.php
tutor / classes Last commit date
Addons.php 2 years ago Admin.php 2 years ago Ajax.php 2 years ago Announcements.php 3 years ago Assets.php 2 years ago Backend_Page_Trait.php 3 years ago Course.php 2 years ago Course_Embed.php 3 years ago Course_Filter.php 2 years ago Course_List.php 2 years 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 2 years ago Lesson.php 2 years ago Options_V2.php 2 years ago Permalink.php 2 years ago Post_types.php 2 years ago Private_Course_Access.php 3 years ago Q_and_A.php 2 years ago Question_Answers_List.php 3 years ago Quiz.php 2 years ago Quiz_Attempts_List.php 2 years ago RestAPI.php 2 years ago Reviews.php 3 years ago Rewrite_Rules.php 2 years ago Shortcode.php 2 years 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 3 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 2 years 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 2 years ago
User.php
396 lines
1 <?php
2 /**
3 * Manage user
4 *
5 * @package Tutor\User
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 * User class
19 *
20 * @since 1.0.0
21 */
22 class User {
23
24 const STUDENT = 'subscriber';
25 const INSTRUCTOR = 'tutor_instructor';
26 const ADMIN = 'administrator';
27
28 const REVIEW_POPUP_META = 'tutor_review_course_popup';
29 const LAST_LOGIN_META = 'tutor_last_login';
30
31 /**
32 * Registration notice
33 *
34 * @since 1.0.0
35 *
36 * @var boolean
37 */
38 private static $hide_registration_notice = false;
39
40 /**
41 * Register hooks
42 *
43 * @since 1.0.0
44 * @since 2.2.0 $register_hooks param added to resuse the class without hooks register.
45 *
46 * @param bool $register_hooks register hooks.
47 *
48 * @return void
49 */
50 public function __construct( $register_hooks = true ) {
51 if ( ! $register_hooks ) {
52 return;
53 }
54
55 add_action( 'edit_user_profile', array( $this, 'edit_user_profile' ) );
56 add_action( 'show_user_profile', array( $this, 'edit_user_profile' ), 10, 1 );
57
58 add_action( 'profile_update', array( $this, 'profile_update' ) );
59 add_action( 'set_user_role', array( $this, 'set_user_role' ), 10, 3 );
60
61 add_action( 'wp_ajax_tutor_user_photo_remove', array( $this, 'tutor_user_photo_remove' ) );
62 add_action( 'wp_ajax_tutor_user_photo_upload', array( $this, 'update_user_photo' ) );
63
64 add_action( 'admin_notices', array( $this, 'show_registration_disabled' ) );
65 add_action( 'admin_init', array( $this, 'hide_notices' ) );
66 add_action( 'wp_login', array( $this, 'update_user_last_login' ), 10, 2 );
67 }
68
69 /**
70 * Get meta key name for review popup.
71 *
72 * @since 2.4.0
73 *
74 * @param int $course_id course id.
75 *
76 * @return string user meta key name.
77 */
78 public static function get_review_popup_meta( $course_id ) {
79 return self::REVIEW_POPUP_META . '_' . $course_id;
80 }
81
82 /**
83 * Check user has provided role.
84 *
85 * @since 2.2.0
86 *
87 * @param string $role role.
88 *
89 * @return boolean
90 */
91 public static function is( string $role ) {
92 return current_user_can( $role );
93 }
94
95 /**
96 * Check user has any role.
97 *
98 * @since 2.2.0
99 *
100 * @param array $roles roles.
101 *
102 * @return boolean
103 */
104 public static function has_any_role( array $roles ) {
105 $user = wp_get_current_user();
106 if ( empty( $user->roles ) || empty( $roles ) ) {
107 return false;
108 }
109
110 foreach ( $roles as $role ) {
111 if ( in_array( $role, $user->roles, true ) ) {
112 return true;
113 break;
114 }
115 }
116
117 return false;
118 }
119
120 /**
121 * Check user is student.
122 *
123 * @since 2.2.0
124 *
125 * @return boolean
126 */
127 public static function is_student() {
128 return current_user_can( self::STUDENT );
129 }
130
131 /**
132 * Check user is admin.
133 *
134 * @since 2.2.0
135 *
136 * @return boolean
137 */
138 public static function is_admin() {
139 return current_user_can( self::ADMIN );
140 }
141
142 /**
143 * Check current user is instructor.
144 *
145 * @since 2.2.0
146 *
147 * @param bool $is_approved instructor is approved or not.
148 *
149 * @return boolean
150 */
151 public static function is_instructor( $is_approved = true ) {
152 return tutils()->is_instructor( 0, $is_approved );
153 }
154
155 /**
156 * Profile layouts
157 *
158 * @since 1.0.0
159 *
160 * @var array
161 */
162 private $profile_layout = array(
163 'pp-circle',
164 'pp-rectangle',
165 'no-cp',
166 );
167
168 /**
169 * Include edit user template
170 *
171 * @since 1.0.0
172 *
173 * @param mixed $user user.
174 *
175 * @return void
176 */
177 public function edit_user_profile( $user ) {
178 include tutor()->path . 'views/metabox/user-profile-fields.php';
179 }
180
181 /**
182 * Delete existing user's photo
183 *
184 * @since 1.0.0
185 *
186 * @param int $user_id user id.
187 * @param string $type photo type.
188 *
189 * @return void
190 */
191 private function delete_existing_user_photo( $user_id, $type ) {
192 $meta_key = 'cover_photo' == $type ? '_tutor_cover_photo' : '_tutor_profile_photo';
193 $photo_id = get_user_meta( $user_id, $meta_key, true );
194 is_numeric( $photo_id ) ? wp_delete_attachment( $photo_id, true ) : 0;
195 delete_user_meta( $user_id, $meta_key );
196 }
197
198 /**
199 * User photo remove
200 *
201 * @since 1.0.0
202 *
203 * @return void
204 */
205 public function tutor_user_photo_remove() {
206 tutor_utils()->checking_nonce();
207 $this->delete_existing_user_photo(
208 get_current_user_id(),
209 Input::post( 'photo_type', '' )
210 );
211 }
212
213 /**
214 * User photo update
215 *
216 * @since 1.0.0
217 *
218 * @return void
219 */
220 public function update_user_photo() {
221 tutor_utils()->checking_nonce();
222
223 $user_id = get_current_user_id();
224 $photo_type = Input::post( 'photo_type', '' );
225 $meta_key = 'cover_photo' === $photo_type ? '_tutor_cover_photo' : '_tutor_profile_photo';
226
227 /**
228 * Photo Update from profile
229 */
230 $photo = tutor_utils()->array_get( 'photo_file', $_FILES );
231 $photo_size = tutor_utils()->array_get( 'size', $photo );
232 $photo_type = tutor_utils()->array_get( 'type', $photo );
233
234 if ( $photo_size && strpos( $photo_type, 'image' ) !== false ) {
235 if ( ! function_exists( 'wp_handle_upload' ) ) {
236 require_once ABSPATH . 'wp-admin/includes/file.php';
237 }
238 $upload_overrides = array( 'test_form' => false );
239 $movefile = wp_handle_upload( $photo, $upload_overrides );
240
241 if ( $movefile && ! isset( $movefile['error'] ) ) {
242 $file_path = tutor_utils()->array_get( 'file', $movefile );
243 $file_url = tutor_utils()->array_get( 'url', $movefile );
244 $mime_type = '';
245 if ( file_exists( $file_path ) ) {
246 $image_info = getimagesize( $file_path );
247 $mime_type = is_array( $image_info ) && count( $image_info ) ? $image_info['mime'] : '';
248 }
249
250 $media_id = wp_insert_attachment(
251 array(
252 'guid' => $file_path,
253 'post_mime_type' => $mime_type,
254 'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $file_url ) ),
255 'post_content' => '',
256 'post_status' => 'inherit',
257 ),
258 $file_path,
259 0
260 );
261
262 if ( $media_id ) {
263 // wp_generate_attachment_metadata() won't work if you do not include this file.
264 require_once ABSPATH . 'wp-admin/includes/image.php';
265
266 // Generate and save the attachment metas into the database.
267 wp_update_attachment_metadata( $media_id, wp_generate_attachment_metadata( $media_id, $file_path ) );
268
269 // Update it to user profile.
270 $this->delete_existing_user_photo( $user_id, Input::post( 'photo_type', '' ) );
271 update_user_meta( $user_id, $meta_key, $media_id );
272
273 exit( wp_json_encode( array( 'status' => 'success' ) ) );
274 }
275 }
276 }
277 }
278
279 /**
280 * Profile update
281 *
282 * @since 1.0.0
283 *
284 * @param int $user_id user id.
285 *
286 * @return void
287 */
288 public function profile_update( $user_id ) {
289 if ( 'tutor_profile_update_by_wp' !== Input::post( 'tutor_action' ) ) {
290 return;
291 }
292
293 $_tutor_profile_job_title = Input::post( '_tutor_profile_job_title', '' );
294 $_tutor_profile_bio = Input::post( '_tutor_profile_bio', '', Input::TYPE_KSES_POST );
295 $_tutor_profile_image = Input::post( '_tutor_profile_photo', '', Input::TYPE_KSES_POST );
296
297 update_user_meta( $user_id, '_tutor_profile_job_title', $_tutor_profile_job_title );
298 update_user_meta( $user_id, '_tutor_profile_bio', $_tutor_profile_bio );
299 update_user_meta( $user_id, '_tutor_profile_photo', $_tutor_profile_image );
300 }
301
302 /**
303 * Set user role
304 *
305 * @since 1.0.0
306 *
307 * @param int $user_id user id.
308 * @param string $role user role.
309 * @param array $old_roles old role.
310 *
311 * @return void
312 */
313 public function set_user_role( $user_id, $role, $old_roles ) {
314 $instructor_role = tutor()->instructor_role;
315
316 if ( $role === $instructor_role || in_array( $instructor_role, $old_roles ) ) {
317 tutor_utils()->add_instructor_role( $user_id );
318 }
319 }
320
321 /**
322 * Hide notices
323 *
324 * @since 1.0.0
325 *
326 * @return void
327 */
328 public function hide_notices() {
329 $hide_notice = Input::get( 'tutor-hide-notice', '' );
330 $is_register_enabled = Input::get( 'tutor-registration', '' );
331 if ( is_admin() && 'registration' === $hide_notice ) {
332 tutor_utils()->checking_nonce( 'get' );
333
334 if ( 'enable' === $is_register_enabled ) {
335 update_option( 'users_can_register', 1 );
336 } else {
337 self::$hide_registration_notice = true;
338 setcookie( 'tutor_notice_hide_registration', 1, time() + ( 86400 * 30 ), tutor()->basepath );
339 }
340 }
341 }
342
343 /**
344 * Show registration disabled
345 *
346 * @since 1.0.0
347 *
348 * @return void
349 */
350 public function show_registration_disabled() {
351 if ( self::$hide_registration_notice ||
352 ( '0' !== get_option( 'users_can_register' ) ) ||
353 isset( $_COOKIE['tutor_notice_hide_registration'] ) ||
354 ! current_user_can( 'manage_options' )
355 ) {
356 return;
357 }
358
359 $hide_url = wp_nonce_url( add_query_arg( 'tutor-hide-notice', 'registration' ), tutor()->nonce_action, tutor()->nonce );
360 ?>
361 <div class="wrap tutor-user-registration-notice-wrapper">
362 <div class="tutor-user-registration-notice">
363 <div>
364 <img src="<?php echo esc_url( tutor()->url . 'assets/images/icon-info-round.svg' ); ?>"/>
365 </div>
366 <div>
367 <?php echo wp_kses( 'As membership is turned off, students and instructors will not be able to sign up. <strong>Press Enable</strong> or go to <strong>Settings > General > Membership</strong> and enable "Anyone can register".', array( 'strong' => true ) ); ?>
368 </div>
369 <div>
370 <a href="<?php echo esc_url( add_query_arg( 'tutor-registration', 'enable', $hide_url ) ); ?>"><?php esc_html_e( 'Enable', 'tutor' ); ?></a>
371 <hr/>
372 <a href="<?php echo esc_url( $hide_url ); ?>">
373 <?php esc_html_e( 'Dismiss', 'tutor' ); ?>
374 </a>
375 </div>
376 </div>
377 </div>
378 <?php
379 }
380
381 /**
382 * Set the user last active timestamp to now.
383 *
384 * @since 2.5.0
385 *
386 * @param string $user_login active user name.
387 * @param \WP_User $user User object data.
388 *
389 * @return void
390 */
391 public function update_user_last_login( $user_login, $user ) {
392 update_user_meta( $user->ID, self::LAST_LOGIN_META, time() );
393 }
394
395 }
396