PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 1.9.4
Tutor LMS – eLearning and online course solution v1.9.4
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 / Instructor.php
tutor / classes Last commit date
Addons.php 4 years ago Admin.php 4 years ago Ajax.php 4 years ago Assets.php 4 years ago Course.php 4 years ago Course_Filter.php 4 years ago Course_Settings_Tabs.php 5 years ago Course_Widget.php 5 years ago Custom_Validation.php 5 years ago Dashboard.php 5 years ago Email.php 5 years ago FormHandler.php 5 years ago Frontend.php 5 years ago Gutenberg.php 5 years ago Instructor.php 4 years ago Instructors_List.php 4 years ago Lesson.php 4 years ago Options.php 4 years ago Post_types.php 4 years ago Private_Course_Access.php 5 years ago Q_and_A.php 5 years ago Question_Answers_List.php 4 years ago Quiz.php 5 years ago Quiz_Attempts_List.php 4 years ago RestAPI.php 5 years ago Rewrite_Rules.php 5 years ago Shortcode.php 4 years ago Student.php 5 years ago Students_List.php 5 years ago Taxonomies.php 5 years ago Template.php 4 years ago Theme_Compatibility.php 5 years ago Tools.php 5 years ago Tutor.php 4 years ago TutorEDD.php 5 years ago Tutor_Base.php 5 years ago Tutor_List_Table.php 5 years ago Tutor_Setup.php 5 years ago Upgrader.php 5 years ago User.php 4 years ago Utils.php 4 years ago Video_Stream.php 5 years ago Withdraw.php 5 years ago Withdraw_Requests_List.php 4 years ago WooCommerce.php 4 years ago
Instructor.php
322 lines
1 <?php
2
3 /**
4 * Class Instructor
5 * @package TUTOR
6 *
7 * @since v.1.0.0
8 */
9
10 namespace TUTOR;
11
12 if ( ! defined( 'ABSPATH' ) )
13 exit;
14
15
16 class Instructor {
17
18 protected $error_msgs = '';
19 public function __construct() {
20 add_action('template_redirect', array($this, 'register_instructor'));
21 add_action('template_redirect', array($this, 'apply_instructor'));
22
23 //Add instructor from admin panel.
24 add_action('wp_ajax_tutor_add_instructor', array($this, 'add_new_instructor'));
25
26 /**
27 * Instructor Approval
28 * Block Unblock
29 *
30 * @since v.1.5.3
31 */
32 add_action('wp_ajax_instructor_approval_action', array($this, 'instructor_approval_action'));
33
34 /**
35 * Check if instructor can publish courses
36 * @since v.1.5.9
37 */
38 add_action('tutor_option_save_after', array($this, 'can_publish_tutor_courses'));
39
40 /**
41 * Hide instructor rejection message
42 * @since v1.9.2
43 */
44 add_action( 'wp_loaded', array($this, 'hide_instructor_notice') );
45 }
46
47 /**
48 * Register new user and mark him as instructor
49 *
50 * @since v.1.0.0
51 */
52 public function register_instructor(){
53 if ( ! isset($_POST['tutor_action']) || $_POST['tutor_action'] !== 'tutor_register_instructor' ){
54 return;
55 }
56 //Checking nonce
57 tutor_utils()->checking_nonce();
58
59 $required_fields = apply_filters('tutor_instructor_registration_required_fields', array(
60 'first_name' => __('First name field is required', 'tutor'),
61 'last_name' => __('Last name field is required', 'tutor'),
62 'email' => __('E-Mail field is required', 'tutor'),
63 'user_login' => __('User Name field is required', 'tutor'),
64 'password' => __('Password field is required', 'tutor'),
65 'password_confirmation' => __('Password Confirmation field is required', 'tutor'),
66 ));
67
68 $validation_errors = array();
69
70 /*
71 *registration_errors
72 *push into validation_errors
73 */
74 $errors = apply_filters('registration_errors',new \WP_Error,'','');
75 foreach ($errors->errors as $key => $value)
76 {
77 $validation_errors[$key] = $value[0];
78
79 }
80
81 foreach ($required_fields as $required_key => $required_value){
82 if (empty($_POST[$required_key])){
83 $validation_errors[$required_key] = $required_value;
84 }
85 }
86
87 if (!filter_var(tutor_utils()->input_old('email'), FILTER_VALIDATE_EMAIL)) {
88 $validation_errors['email'] = __('Valid E-Mail is required', 'tutor');
89 }
90 if (tutor_utils()->input_old('password') !== tutor_utils()->input_old('password_confirmation')){
91 $validation_errors['password_confirmation'] = __('Confirm password does not matched with Password field', 'tutor');
92 }
93
94 if (count($validation_errors)){
95 $this->error_msgs = $validation_errors;
96 add_filter('tutor_instructor_register_validation_errors', array($this, 'tutor_instructor_form_validation_errors'));
97 return;
98 }
99
100 $first_name = sanitize_text_field(tutor_utils()->input_old('first_name'));
101 $last_name = sanitize_text_field(tutor_utils()->input_old('last_name'));
102 $email = sanitize_text_field(tutor_utils()->input_old('email'));
103 $user_login = sanitize_text_field(tutor_utils()->input_old('user_login'));
104 $password = sanitize_text_field(tutor_utils()->input_old('password'));
105
106 $userdata = array(
107 'user_login' => $user_login,
108 'user_email' => $email,
109 'first_name' => $first_name,
110 'last_name' => $last_name,
111 //'role' => tutor()->instructor_role,
112 'user_pass' => $password,
113 );
114
115 $user_id = wp_insert_user( $userdata ) ;
116 if ( ! is_wp_error($user_id)){
117 update_user_meta($user_id, '_is_tutor_instructor', tutor_time());
118 update_user_meta($user_id, '_tutor_instructor_status', apply_filters('tutor_initial_instructor_status', 'pending'));
119
120 do_action('tutor_new_instructor_after', $user_id);
121
122 $user = get_user_by( 'id', $user_id );
123 if( $user ) {
124 wp_set_current_user( $user_id, $user->user_login );
125 wp_set_auth_cookie( $user_id );
126 }
127 }else{
128 $this->error_msgs = $user_id->get_error_messages();
129 add_filter('tutor_instructor_register_validation_errors', array($this, 'tutor_instructor_form_validation_errors'));
130 return;
131 }
132
133 wp_redirect(tutor_utils()->input_old('_wp_http_referer'));
134 die();
135 }
136
137 public function tutor_instructor_form_validation_errors(){
138 return $this->error_msgs;
139 }
140
141 /**
142 *
143 * Usage for instructor applying when a user already logged in
144 *
145 * @since v.1.0.0
146 */
147 public function apply_instructor(){
148 if ( ! isset($_POST['tutor_action']) || $_POST['tutor_action'] !== 'tutor_apply_instructor' ){
149 return;
150 }
151 //Checking nonce
152 tutor_utils()->checking_nonce();
153
154 $user_id = get_current_user_id();
155 if ($user_id){
156 if (tutor_utils()->is_instructor()){
157 die(__('Already applied for instructor', 'tutor'));
158 }else{
159 update_user_meta($user_id, '_is_tutor_instructor', tutor_time());
160 update_user_meta($user_id, '_tutor_instructor_status', apply_filters('tutor_initial_instructor_status', 'pending'));
161
162 do_action('tutor_new_instructor_after', $user_id);
163 }
164 }else{
165 die(__('Permission denied', 'tutor'));
166 }
167
168 wp_redirect(tutor_utils()->input_old('_wp_http_referer'));
169 die();
170 }
171
172
173 public function add_new_instructor(){
174
175 tutils()->checking_nonce();
176
177 // Only admin should be able to add instructor
178 if(!current_user_can( 'manage_options' ) || !get_option( 'users_can_register', false )) {
179 wp_send_json_error( );
180 }
181
182
183 $required_fields = apply_filters('tutor_instructor_registration_required_fields', array(
184 'first_name' => __('First name field is required', 'tutor'),
185 'last_name' => __('Last name field is required', 'tutor'),
186 'email' => __('E-Mail field is required', 'tutor'),
187 'user_login' => __('User Name field is required', 'tutor'),
188 'phone_number' => __('Phone Number field is required', 'tutor'),
189 'password' => __('Password field is required', 'tutor'),
190 'password_confirmation' => __('Password Confirmation field is required', 'tutor'),
191 ));
192
193 $validation_errors = array();
194 foreach ($required_fields as $required_key => $required_value){
195 if (empty($_POST[$required_key])){
196 $validation_errors[$required_key] = $required_value;
197 }
198 }
199
200 if (!filter_var(tutor_utils()->input_old('email'), FILTER_VALIDATE_EMAIL)) {
201 $validation_errors['email'] = __('Valid E-Mail is required', 'tutor');
202 }
203 if (tutor_utils()->input_old('password') !== tutor_utils()->input_old('password_confirmation')){
204 $validation_errors['password_confirmation'] = __('Confirm password does not matched with Password field', 'tutor');
205 }
206
207 if (count($validation_errors)){
208 wp_send_json_error(array('errors' => $validation_errors));
209 }
210
211 $first_name = sanitize_text_field(tutor_utils()->input_old('first_name'));
212 $last_name = sanitize_text_field(tutor_utils()->input_old('last_name'));
213 $email = sanitize_text_field(tutor_utils()->input_old('email'));
214 $user_login = sanitize_text_field(tutor_utils()->input_old('user_login'));
215 $phone_number = sanitize_text_field(tutor_utils()->input_old('phone_number'));
216 $password = sanitize_text_field(tutor_utils()->input_old('password'));
217 $tutor_profile_bio = wp_kses_post(tutor_utils()->input_old('tutor_profile_bio'));
218
219 $userdata = apply_filters('add_new_instructor_data', array(
220 'user_login' => $user_login,
221 'user_email' => $email,
222 'first_name' => $first_name,
223 'last_name' => $last_name,
224 'role' => tutor()->instructor_role,
225 'user_pass' => $password,
226 ));
227
228 do_action('tutor_add_new_instructor_before');
229
230 $user_id = wp_insert_user( $userdata ) ;
231 if ( ! is_wp_error($user_id)) {
232 update_user_meta($user_id, 'phone_number', $phone_number);
233 update_user_meta($user_id, 'description', $tutor_profile_bio);
234 update_user_meta($user_id, '_tutor_profile_bio', $tutor_profile_bio);
235 update_user_meta($user_id, '_is_tutor_instructor', tutor_time());
236 update_user_meta($user_id, '_tutor_instructor_status', apply_filters('tutor_initial_instructor_status', 'approved'));
237
238 do_action('tutor_add_new_instructor_after', $user_id);
239
240 wp_send_json_success(array('msg' => __('Instructor has been added successfully', 'tutor') ));
241 }
242
243 wp_send_json_error(array('errors' => $user_id));
244 }
245
246 public function instructor_approval_action(){
247 tutils()->checking_nonce();
248
249 if(!current_user_can( 'manage_options' )) {
250 wp_send_json_error( array('message' =>__('Access Denied', 'tutor')) );
251 }
252
253 $instructor_id = (int) sanitize_text_field(tutils()->array_get('instructor_id', $_POST));
254 $action = sanitize_text_field(tutils()->array_get('action_name', $_POST));
255
256 if( 'approve' === $action ) {
257 do_action('tutor_before_approved_instructor', $instructor_id);
258
259 update_user_meta($instructor_id, '_tutor_instructor_status', 'approved');
260 update_user_meta($instructor_id, '_tutor_instructor_approved', tutor_time());
261
262 $instructor = new \WP_User($instructor_id);
263 $instructor->add_role(tutor()->instructor_role);
264
265 // Send E-Mail to this user about instructor approval via hook
266 do_action('tutor_after_approved_instructor', $instructor_id);
267 }
268
269 if( 'blocked' === $action ) {
270 do_action('tutor_before_blocked_instructor', $instructor_id);
271 update_user_meta($instructor_id, '_tutor_instructor_status', 'blocked');
272
273 $instructor = new \WP_User($instructor_id);
274 $instructor->remove_role(tutor()->instructor_role);
275 do_action('tutor_after_blocked_instructor', $instructor_id);
276
277 //TODO: send E-Mail to this user about instructor blocked, should via hook
278 }
279
280 if( 'remove-instructor' === $action)
281 {
282 do_action('tutor_before_rejected_instructor', $instructor_id);
283
284 $user = new \WP_User($instructor_id);
285 $user->remove_role(tutor()->instructor_role);
286
287 tutor_utils()->remove_instructor_role($instructor_id);
288 update_user_meta($instructor_id, '_is_tutor_instructor_rejected', tutor_time());
289 update_user_meta($instructor_id, 'tutor_instructor_show_rejection_message', true);
290
291 // Send E-Mail to this user about instructor rejection via hook
292 do_action('tutor_after_rejected_instructor', $instructor_id);
293 }
294
295 wp_send_json_success();
296 }
297
298 public function hide_instructor_notice() {
299 if(isset( $_GET['tutor_action'] ) && $_GET['tutor_action']=='hide_instructor_notice') {
300 delete_user_meta( get_current_user_id(), 'tutor_instructor_show_rejection_message' );
301 }
302 }
303
304 /**
305 * Can instructor publish courses directly
306 * Fixed in Gutenberg @since v.1.5.9
307 */
308
309 public function can_publish_tutor_courses(){
310 $can_publish_course = (bool) tutor_utils()->get_option('instructor_can_publish_course');
311
312 $instructor_role = tutor()->instructor_role;
313 $instructor = get_role( $instructor_role );
314
315 if ($can_publish_course){
316 $instructor->add_cap('publish_tutor_courses');
317 }else{
318 $instructor->remove_cap('publish_tutor_courses');
319 }
320 }
321
322 }