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