PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 1.3.4
Tutor LMS – eLearning and online course solution v1.3.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 / Admin.php
tutor / classes Last commit date
Addons.php 6 years ago Admin.php 6 years ago Ajax.php 6 years ago Assets.php 6 years ago Course.php 6 years ago Course_Widget.php 6 years ago Dashboard.php 6 years ago Gutenberg.php 6 years ago Instructor.php 6 years ago Instructors_List.php 6 years ago Lesson.php 6 years ago Options.php 6 years ago Post_types.php 6 years ago Q_and_A.php 6 years ago Question.php 6 years ago Question_Answers_List.php 6 years ago Quiz.php 6 years ago Quiz_Attempts_List.php 6 years ago Rewrite_Rules.php 6 years ago Shortcode.php 6 years ago Student.php 6 years ago Students_List.php 6 years ago Taxonomies.php 6 years ago Template.php 6 years ago Theme_Compatibility.php 6 years ago Tools.php 6 years ago Tutor.php 6 years ago TutorEDD.php 6 years ago Tutor_Base.php 6 years ago Tutor_List_Table.php 6 years ago Upgrader.php 6 years ago User.php 6 years ago Utils.php 6 years ago Video_Stream.php 6 years ago Withdraw.php 6 years ago Withdraw_Requests_List.php 6 years ago WooCommerce.php 6 years ago
Admin.php
471 lines
1 <?php
2 namespace TUTOR;
3
4 /**
5 * Class Admin
6 * @package TUTOR
7 *
8 * @since v.1.0.0
9 */
10
11 if ( ! defined( 'ABSPATH' ) )
12 exit;
13
14 class Admin{
15 public function __construct() {
16 add_action('admin_menu', array($this, 'register_menu'));
17 //Force activate menu for necessary
18 add_filter('parent_file', array($this, 'parent_menu_active'));
19 add_filter('submenu_file', array($this, 'submenu_file_active'), 10, 2);
20
21 add_action('admin_init', array($this, 'filter_posts_for_instructors'));
22 add_action('load-post.php', array($this, 'check_if_current_users_post') );
23
24 add_action('admin_action_uninstall_tutor_and_erase', array($this, 'erase_tutor_data'));
25 add_filter('plugin_action_links_' . plugin_basename(TUTOR_FILE), array( $this, 'plugin_action_links' ) );
26
27 //Plugin Row Meta
28 add_filter('plugin_row_meta', array($this, 'plugin_row_meta'), 10, 2);
29
30 //Admin Footer Text
31 add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ), 1 );
32 //Register Course Widget
33 add_action( 'widgets_init', array($this, 'register_course_widget') );
34 }
35
36 public function register_menu(){
37 $hasPro = tutor()->has_pro;
38
39 $unanswered_questions = tutor_utils()->unanswered_question_count();
40 $unanswered_bubble = '';
41 if ($unanswered_questions){
42 $unanswered_bubble = '<span class="update-plugins count-'.$unanswered_questions.'"><span class="plugin-count">'.$unanswered_questions.'</span></span>';
43 }
44
45 $course_post_type = tutor()->course_post_type;
46
47 $pro_text = '';
48 if ($hasPro){
49 $pro_text = ' '.__('Pro', 'tutor');
50 }
51
52 add_menu_page(__('Tutor LMS', 'tutor').$pro_text, __('Tutor LMS', 'tutor').$pro_text, 'manage_tutor_instructor', 'tutor', null,
53 'dashicons-welcome-learn-more', 2);
54 add_submenu_page('tutor', __('Categories', 'tutor'), __('Categories', 'tutor'), 'manage_tutor', 'edit-tags.php?taxonomy=course-category&post_type='.$course_post_type, null );
55
56 add_submenu_page('tutor', __('Tags', 'tutor'), __('Tags', 'tutor'), 'manage_tutor', 'edit-tags.php?taxonomy=course-tag&post_type='.$course_post_type, null );
57
58 add_submenu_page('tutor', __('Students', 'tutor'), __('Students', 'tutor'), 'manage_tutor', 'tutor-students', array($this, 'tutor_students') );
59
60 add_submenu_page('tutor', __('Instructors', 'tutor'), __('Instructors', 'tutor'), 'manage_tutor', 'tutor-instructors', array($this, 'tutor_instructors') );
61
62 add_submenu_page('tutor', __('Q & A', 'tutor'), __('Q & A '.$unanswered_bubble, 'tutor'), 'manage_tutor_instructor', 'question_answer', array($this, 'question_answer') );
63
64 add_submenu_page('tutor', __('Quiz Attempts', 'tutor'), __('Quiz Attempts', 'tutor'), 'manage_tutor_instructor', 'tutor_quiz_attempts',array($this, 'quiz_attempts') );
65 add_submenu_page('tutor', __('Withdraw Requests', 'tutor'), __('Withdraw Requests', 'tutor'), 'manage_tutor_instructor', 'tutor_withdraw_requests', array($this, 'withdraw_requests') );
66
67 //add_submenu_page('tutor', __('Add-ons', 'tutor'), __('Add-ons', 'tutor'), 'manage_tutor', 'tutor-addons', array(new Addons(),'addons_page') );
68 add_submenu_page( 'tutor', __( 'Add-ons', 'tutor' ), __( 'Add-ons', 'tutor' ), 'manage_tutor', 'tutor-addons', array( $this, 'enable_disable_addons' ) );
69
70
71 add_submenu_page('tutor', __('Status', 'tutor'), __('Status', 'tutor'), 'manage_tutor', 'tutor-status', array($this, 'tutor_status') );
72
73 do_action('tutor_admin_register');
74
75 add_submenu_page('tutor', __('Settings', 'tutor'), __('Settings', 'tutor'), 'manage_tutor', 'tutor_settings', array($this, 'tutor_page') );
76
77 add_submenu_page('tutor',__('Uninstall Tutor LMS', 'tutor'), null, 'deactivate_plugin', 'tutor-uninstall', array($this, 'tutor_uninstall'));
78
79 if ( ! $hasPro){
80 add_submenu_page( 'tutor', __( 'Get Pro', 'tutor' ), __( '<span class="dashicons dashicons-awards tutor-get-pro-text"></span> Get Pro', 'tutor' ), 'manage_options', 'tutor-get-pro', array($this, 'tutor_get_pro') );
81 }
82
83 }
84
85 public function tutor_page(){
86 $tutor_option = new Options();
87 echo apply_filters('tutor/options/generated-html', $tutor_option->generate());
88 }
89
90 public function tutor_students(){
91 include tutor()->path.'views/pages/students.php';
92 }
93
94 public function tutor_instructors(){
95 include tutor()->path.'views/pages/instructors.php';
96 }
97
98 public function question_answer(){
99 include tutor()->path.'views/pages/question_answer.php';
100 }
101
102 public function quiz_attempts(){
103 include tutor()->path.'views/pages/quiz_attempts.php';
104 }
105
106 /**
107 * Show the withdraw requests table
108 *
109 * @since v.1.2.0
110 */
111 public function withdraw_requests(){
112 include tutor()->path.'views/pages/withdraw_requests.php';
113 }
114
115 public function enable_disable_addons(){
116
117 if (defined('TUTOR_PRO_VERSION')) {
118 include tutor()->path.'views/pages/enable_disable_addons.php';
119 }else{
120 include tutor()->path.'views/pages/tutor-pro-addons.php';
121 }
122 }
123
124 public function tutor_status(){
125 include tutor()->path.'views/pages/status.php';
126 }
127
128 public function tutor_uninstall(){
129 include tutor()->path.'views/pages/uninstall.php';
130 }
131
132 public function tutor_get_pro(){
133 include tutor()->path.'views/pages/get-pro.php';
134 }
135
136 public function parent_menu_active( $parent_file ){
137 $taxonomy = tutor_utils()->avalue_dot('taxonomy', $_GET);
138 if ($taxonomy === 'course-category' || $taxonomy === 'course-tag'){
139 return 'tutor';
140 }
141
142 return $parent_file;
143 }
144
145 public function submenu_file_active($submenu_file, $parent_file){
146 $taxonomy = tutor_utils()->avalue_dot('taxonomy', $_GET);
147 $course_post_type = tutor()->course_post_type;
148
149 if ($taxonomy === 'course-category'){
150 return 'edit-tags.php?taxonomy=course-category&post_type='.$course_post_type;
151 }
152 if ($taxonomy === 'course-tag'){
153 return 'edit-tags.php?taxonomy=course-tag&post_type='.$course_post_type;
154 }
155
156
157 return $submenu_file;
158 }
159
160 /**
161 * Filter posts for instructor
162 */
163 public function filter_posts_for_instructors(){
164 if ( ! current_user_can('administrator') && current_user_can(tutor()->instructor_role)){
165 remove_menu_page( 'edit-comments.php' ); //Comments
166 add_filter( 'posts_clauses_request', array($this, 'posts_clauses_request') );
167 }
168 }
169
170 public function posts_clauses_request($clauses){
171 global $wpdb;
172
173 $user_id = get_current_user_id();
174
175 $get_assigned_courses_ids = $wpdb->get_col("SELECT meta_value from {$wpdb->usermeta} WHERE meta_key = '_tutor_instructor_course_id' AND user_id = {$user_id} ");
176
177 $custom_author_query = "AND {$wpdb->posts}.post_author = {$user_id}";
178 if (is_array($get_assigned_courses_ids) && count($get_assigned_courses_ids)){
179 $in_query_pre = implode(',', $get_assigned_courses_ids);
180 $custom_author_query = " AND ( {$wpdb->posts}.post_author = {$user_id} OR {$wpdb->posts}.ID IN({$in_query_pre}) ) ";
181 }
182
183 $clauses['where'] .= $custom_author_query;
184
185 return $clauses;
186 }
187
188 /**
189 * Prevent unauthorised course/lesson edit page by direct URL
190 *
191 * @since v.1.0.0
192 */
193 public function check_if_current_users_post(){
194 if (current_user_can('administrator') || ! current_user_can(tutor()->instructor_role)) {
195 return;
196 }
197
198 if (! empty($_GET['post']) ) {
199 $get_post_id = (int) sanitize_text_field($_GET['post']);
200 $get_post = get_post($get_post_id);
201 $tutor_post_types = array(tutor()->course_post_type, tutor()->lesson_post_type);
202
203 $current_user = get_current_user_id();
204
205 if (in_array($get_post->post_type, $tutor_post_types) && $get_post->post_author != $current_user){
206 global $wpdb;
207
208 $get_assigned_courses_ids = (int) $wpdb->get_var("SELECT user_id from {$wpdb->usermeta} WHERE user_id = {$current_user} AND meta_key = '_tutor_instructor_course_id' AND meta_value = {$get_post_id} ");
209
210 if ( ! $get_assigned_courses_ids){
211 wp_die(__('Permission Denied', 'tutor'));
212 }
213
214 }
215 }
216 }
217
218 /**
219 * Status
220 */
221
222 public static function scan_template_files( $template_path = null ) {
223 if ( ! $template_path){
224 $template_path = tutor()->path.'templates/';
225 }
226
227 $files = @scandir( $template_path ); // @codingStandardsIgnoreLine.
228 $result = array();
229
230 if ( ! empty( $files ) ) {
231 foreach ( $files as $key => $value ) {
232 if ( ! in_array( $value, array( '.', '..', '.DS_Store' ), true ) ) {
233 if ( is_dir( $template_path . DIRECTORY_SEPARATOR . $value ) ) {
234 $sub_files = self::scan_template_files( $template_path . DIRECTORY_SEPARATOR . $value );
235 foreach ( $sub_files as $sub_file ) {
236 $result[] = $value . DIRECTORY_SEPARATOR . $sub_file;
237 }
238 } else {
239 $result[] = $value;
240 }
241 }
242 }
243 }
244 return $result;
245 }
246
247 /**
248 * @return array
249 *
250 *
251 */
252 public static function template_overridden_files(){
253 $template_files = self::scan_template_files();
254
255 $override_files = array();
256 foreach ($template_files as $file){
257 $file_path = null;
258 if (file_exists(trailingslashit(get_stylesheet_directory()).tutor()->template_path.$file)){
259 $file_path = $file;
260 }elseif (file_exists(trailingslashit(get_template_directory()).tutor()->template_path.$file)){
261 $file_path = $file;
262 }
263
264 if ($file_path){
265 $override_files[] = str_replace( WP_CONTENT_DIR.'/themes/', '', $file_path );
266 }
267 }
268
269 return $override_files;
270 }
271
272 public static function get_environment_info(){
273
274 // Figure out cURL version, if installed.
275 $curl_version = '';
276 if ( function_exists( 'curl_version' ) ) {
277 $curl_version = curl_version();
278 $curl_version = $curl_version['version'] . ', ' . $curl_version['ssl_version'];
279 }
280
281
282 // WP memory limit.
283 $wp_memory_limit = tutor_utils()->let_to_num(WP_MEMORY_LIMIT);
284 if ( function_exists( 'memory_get_usage' ) ) {
285 $wp_memory_limit = max( $wp_memory_limit, tutor_utils()->let_to_num( @ini_get( 'memory_limit' ) ) );
286 }
287
288 $database_version = tutor_utils()->get_db_version();
289
290 return array(
291 'home_url' => get_option( 'home' ),
292 'site_url' => get_option( 'siteurl' ),
293 'version' => tutor()->version,
294 'wp_version' => get_bloginfo( 'version' ),
295 'wp_multisite' => is_multisite(),
296 'wp_memory_limit' => $wp_memory_limit,
297 'wp_debug_mode' => ( defined( 'WP_DEBUG' ) && WP_DEBUG ),
298 'wp_cron' => ! ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ),
299 'language' => get_locale(),
300 'external_object_cache' => wp_using_ext_object_cache(),
301 'server_info' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) : '',
302 'php_version' => phpversion(),
303 'php_post_max_size' => tutor_utils()->let_to_num( ini_get( 'post_max_size' ) ),
304 'php_max_execution_time' => ini_get( 'max_execution_time' ),
305 'php_max_input_vars' => ini_get( 'max_input_vars' ),
306 'curl_version' => $curl_version,
307 'suhosin_installed' => extension_loaded( 'suhosin' ),
308 'max_upload_size' => wp_max_upload_size(),
309 'mysql_version' => $database_version['number'],
310 'mysql_version_string' => $database_version['string'],
311 'default_timezone' => date_default_timezone_get(),
312 'fsockopen_or_curl_enabled' => ( function_exists( 'fsockopen' ) || function_exists( 'curl_init' ) ),
313 'soapclient_enabled' => class_exists( 'SoapClient' ),
314 'domdocument_enabled' => class_exists( 'DOMDocument' ),
315 'gzip_enabled' => is_callable( 'gzopen' ),
316 'mbstring_enabled' => extension_loaded( 'mbstring' ),
317 );
318
319 }
320
321
322 public function erase_tutor_data(){
323 global $wpdb;
324
325 $is_erase_data = tutor_utils()->get_option('delete_on_uninstall');
326 /**D*/ //=> Deleting Data
327
328 $plugin_file = tutor()->basename;
329 if ($is_erase_data && current_user_can( 'deactivate_plugin', $plugin_file )) {
330 /**
331 * Deleting Post Type, Meta Data, taxonomy
332 */
333 $course_post_type = tutor()->course_post_type;
334 $lesson_post_type = tutor()->lesson_post_type;
335
336 $post_types = array(
337 $course_post_type,
338 $lesson_post_type,
339 'tutor_quiz',
340 'tutor_question',
341 'tutor_enrolled',
342 'topics',
343 'tutor_enrolled',
344 'tutor_announcements',
345 );
346
347 $post_type_strings = "'".implode("','", $post_types)."'";
348 $tutor_posts = $wpdb->get_col("SELECT ID from {$wpdb->posts} WHERE post_type in({$post_type_strings}) ;");
349
350 if (is_array($tutor_posts) && count($tutor_posts)){
351 foreach ($tutor_posts as $post_id){
352 //Delete categories
353 $terms = wp_get_object_terms( $post_id, 'course-category' );
354 foreach( $terms as $term ){
355 /**D*/ wp_remove_object_terms( $post_id, array( $term->term_id ), 'course-category' );
356 }
357
358 //Delete tags if available
359 $terms = wp_get_object_terms( $post_id, 'course-tag' );
360 foreach( $terms as $term ){
361 /**D*/ wp_remove_object_terms( $post_id, array( $term->term_id ), 'course-tag' );
362 }
363
364 //Delete All Meta
365 /**D*/ $wpdb->delete($wpdb->postmeta, array('post_id' => $post_id) );
366 /**D*/ $wpdb->delete($wpdb->posts, array('ID' => $post_id) );
367 }
368 }
369
370 /**
371 * Deleting Comments (reviews, questions, quiz_answers, etc)
372 */
373 $tutor_comments = $wpdb->get_col("SELECT comment_ID from {$wpdb->comments} WHERE comment_agent = 'comment_agent' ;");
374 $comments_ids_strings = "'".implode("','", $tutor_comments)."'";
375 if (is_array($tutor_comments) && count($tutor_comments)){
376 /**D*/ $wpdb->query("DELETE from {$wpdb->commentmeta} WHERE comment_ID in({$comments_ids_strings}) ");
377 }
378 /**D*/ $wpdb->delete($wpdb->comments, array('comment_agent' => 'comment_agent'));
379
380 /**
381 * Delete Options
382 */
383
384 /**D*/ delete_option('tutor_option');
385 /**D*/ $wpdb->delete($wpdb->usermeta, array('meta_key' => '_is_tutor_student'));
386 /**D*/ $wpdb->delete($wpdb->usermeta, array('meta_key' => '_tutor_instructor_approved'));
387 /**D*/ $wpdb->delete($wpdb->usermeta, array('meta_key' => '_tutor_instructor_status'));
388 /**D*/ $wpdb->delete($wpdb->usermeta, array('meta_key' => '_is_tutor_instructor'));
389 /**D*/ $wpdb->query("DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE '%_tutor_completed_lesson_id_%' ");
390
391 //Deleting Table
392 $prefix = $wpdb->prefix;
393 /**D*/ $wpdb->query("DROP TABLE IF EXISTS {$prefix}tutor_quiz_attempts, {$prefix}tutor_quiz_attempt_answers, {$prefix}tutor_quiz_questions, {$prefix}tutor_quiz_question_answers, {$prefix}tutor_earnings, {$prefix}tutor_withdraws ");
394
395 deactivate_plugins($plugin_file);
396 }
397
398 wp_redirect('plugins.php');
399 die();
400 }
401
402 public function plugin_action_links($actions){
403 $hasPro = tutor()->has_pro;
404
405 if(!$hasPro){
406 $actions['tutor_pro_link'] = '<a href="https://www.themeum.com/product/tutor-lms/#pricing?utm_source=tutor_plugin_action_link&utm_medium=wordpress_dashboard&utm_campaign=go_premium" target="_blank"><span
407 style="color: #ff7742; font-weight: bold;">' . __('Upgrade to Pro', 'wp-megamenu') . '</span></a>';
408 }
409
410 $is_erase_data = tutor_utils()->get_option('delete_on_uninstall');
411
412 if ($is_erase_data) {
413 $plugin_file = tutor()->basename;
414 if ( current_user_can( 'deactivate_plugin', $plugin_file ) ) {
415 if ( isset( $actions['deactivate'] ) ) {
416 $actions['deactivate'] = '<a href="admin.php?page=tutor-uninstall">' . __('Uninstall', 'tutor') . '</a>';
417 }
418 }
419 }
420
421 $actions['settings'] = '<a href="admin.php?page=tutor_settings">' . __('Settings', 'tutor') . '</a>';
422 return $actions;
423 }
424
425 public function plugin_row_meta($plugin_meta, $plugin_file){
426
427 if ($plugin_file === tutor()->basename) {
428 $plugin_meta[] = sprintf( '<a href="%s">%s</a>',
429 esc_url( 'https://www.themeum.com/docs/tutor-introduction/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_docs_link' ),
430 __( '<strong style="color: #03bd24">Documentation</strong>', 'tutor' )
431 );
432 $plugin_meta[] = sprintf( '<a href="%s">%s</a>',
433 esc_url( 'https://www.themeum.com/support-forums/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_support_link' ),
434 __( '<strong style="color: #03bd24">Get Support</strong>', 'tutor' )
435 );
436 }
437
438 return $plugin_meta;
439 }
440
441 /**
442 * @param $footer_text
443 *
444 * @return string
445 *
446 * Add footer text only on tutor pages
447 */
448 public function admin_footer_text( $footer_text ) {
449 $current_screen = get_current_screen();
450
451 /**
452 * We are making sure that this message will be only on Tutor Admin page
453 */
454 if ( apply_filters( 'tutor_display_admin_footer_text', (tutor_utils()->array_get('parent_base', $current_screen) === 'tutor' ) ) ) {
455 $footer_text = sprintf(
456 __( 'If you like %1$s please leave us a %2$s rating. A huge thanks in advance!', 'tutor' ),
457 sprintf( '<strong>%s</strong>', esc_html__( 'Tutor LMS', 'tutor' ) ),
458 '<a href="https://wordpress.org/support/plugin/tutor/reviews?rate=5#new-post" target="_blank" class="tutor-rating-link">&#9733;&#9733;&#9733;&#9733;&#9733;</a>'
459 );
460 }
461
462 return $footer_text;
463 }
464
465
466 public function register_course_widget(){
467 register_widget( 'Tutor\Course_Widget' );
468 }
469
470
471 }