PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 1.2.13
Tutor LMS – eLearning and online course solution v1.2.13
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 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
461 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(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
221 $files = @scandir( $template_path ); // @codingStandardsIgnoreLine.
222 $result = array();
223
224 if ( ! empty( $files ) ) {
225 foreach ( $files as $key => $value ) {
226 if ( ! in_array( $value, array( '.', '..', '.DS_Store' ), true ) ) {
227 if ( is_dir( $template_path . DIRECTORY_SEPARATOR . $value ) ) {
228 $sub_files = self::scan_template_files( $template_path . DIRECTORY_SEPARATOR . $value );
229 foreach ( $sub_files as $sub_file ) {
230 $result[] = $value . DIRECTORY_SEPARATOR . $sub_file;
231 }
232 } else {
233 $result[] = $value;
234 }
235 }
236 }
237 }
238 return $result;
239 }
240
241 /**
242 * @return array
243 *
244 *
245 */
246 public static function template_overridden_files(){
247 $template_files = self::scan_template_files();
248
249 $override_files = array();
250 foreach ($template_files as $file){
251 $file_path = null;
252 if (file_exists(trailingslashit(get_stylesheet_directory()).tutor()->template_path.$file)){
253 $file_path = $file;
254 }elseif (file_exists(trailingslashit(get_template_directory()).tutor()->template_path.$file)){
255 $file_path = $file;
256 }
257
258 if ($file_path){
259 $override_files[] = str_replace( WP_CONTENT_DIR.'/themes/', '', $file_path );
260 }
261 }
262
263 return $override_files;
264 }
265
266 public static function get_environment_info(){
267
268 // Figure out cURL version, if installed.
269 $curl_version = '';
270 if ( function_exists( 'curl_version' ) ) {
271 $curl_version = curl_version();
272 $curl_version = $curl_version['version'] . ', ' . $curl_version['ssl_version'];
273 }
274
275
276 // WP memory limit.
277 $wp_memory_limit = tutor_utils()->let_to_num(WP_MEMORY_LIMIT);
278 if ( function_exists( 'memory_get_usage' ) ) {
279 $wp_memory_limit = max( $wp_memory_limit, tutor_utils()->let_to_num( @ini_get( 'memory_limit' ) ) );
280 }
281
282 $database_version = tutor_utils()->get_db_version();
283
284 return array(
285 'home_url' => get_option( 'home' ),
286 'site_url' => get_option( 'siteurl' ),
287 'version' => tutor()->version,
288 'wp_version' => get_bloginfo( 'version' ),
289 'wp_multisite' => is_multisite(),
290 'wp_memory_limit' => $wp_memory_limit,
291 'wp_debug_mode' => ( defined( 'WP_DEBUG' ) && WP_DEBUG ),
292 'wp_cron' => ! ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ),
293 'language' => get_locale(),
294 'external_object_cache' => wp_using_ext_object_cache(),
295 'server_info' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) : '',
296 'php_version' => phpversion(),
297 'php_post_max_size' => tutor_utils()->let_to_num( ini_get( 'post_max_size' ) ),
298 'php_max_execution_time' => ini_get( 'max_execution_time' ),
299 'php_max_input_vars' => ini_get( 'max_input_vars' ),
300 'curl_version' => $curl_version,
301 'suhosin_installed' => extension_loaded( 'suhosin' ),
302 'max_upload_size' => wp_max_upload_size(),
303 'mysql_version' => $database_version['number'],
304 'mysql_version_string' => $database_version['string'],
305 'default_timezone' => date_default_timezone_get(),
306 'fsockopen_or_curl_enabled' => ( function_exists( 'fsockopen' ) || function_exists( 'curl_init' ) ),
307 'soapclient_enabled' => class_exists( 'SoapClient' ),
308 'domdocument_enabled' => class_exists( 'DOMDocument' ),
309 'gzip_enabled' => is_callable( 'gzopen' ),
310 'mbstring_enabled' => extension_loaded( 'mbstring' ),
311 );
312
313 }
314
315
316 public function erase_tutor_data(){
317 global $wpdb;
318
319 $is_erase_data = tutor_utils()->get_option('delete_on_uninstall');
320 /**D*/ //=> Deleting Data
321
322 $plugin_file = tutor()->basename;
323 if ($is_erase_data && current_user_can( 'deactivate_plugin', $plugin_file )) {
324 /**
325 * Deleting Post Type, Meta Data, taxonomy
326 */
327 $course_post_type = tutor()->course_post_type;
328 $lesson_post_type = tutor()->lesson_post_type;
329
330 $post_types = array(
331 $course_post_type,
332 $lesson_post_type,
333 'tutor_quiz',
334 'tutor_question',
335 'tutor_enrolled',
336 'topics',
337 'tutor_enrolled',
338 'tutor_announcements',
339 );
340
341 $post_type_strings = "'".implode("','", $post_types)."'";
342 $tutor_posts = $wpdb->get_col("SELECT ID from {$wpdb->posts} WHERE post_type in({$post_type_strings}) ;");
343
344 if (is_array($tutor_posts) && count($tutor_posts)){
345 foreach ($tutor_posts as $post_id){
346 //Delete categories
347 $terms = wp_get_object_terms( $post_id, 'course-category' );
348 foreach( $terms as $term ){
349 /**D*/ wp_remove_object_terms( $post_id, array( $term->term_id ), 'course-category' );
350 }
351
352 //Delete tags if available
353 $terms = wp_get_object_terms( $post_id, 'course-tag' );
354 foreach( $terms as $term ){
355 /**D*/ wp_remove_object_terms( $post_id, array( $term->term_id ), 'course-tag' );
356 }
357
358 //Delete All Meta
359 /**D*/ $wpdb->delete($wpdb->postmeta, array('post_id' => $post_id) );
360 /**D*/ $wpdb->delete($wpdb->posts, array('ID' => $post_id) );
361 }
362 }
363
364 /**
365 * Deleting Comments (reviews, questions, quiz_answers, etc)
366 */
367 $tutor_comments = $wpdb->get_col("SELECT comment_ID from {$wpdb->comments} WHERE comment_agent = 'comment_agent' ;");
368 $comments_ids_strings = "'".implode("','", $tutor_comments)."'";
369 if (is_array($tutor_comments) && count($tutor_comments)){
370 /**D*/ $wpdb->query("DELETE from {$wpdb->commentmeta} WHERE comment_ID in({$comments_ids_strings}) ");
371 }
372 /**D*/ $wpdb->delete($wpdb->comments, array('comment_agent' => 'comment_agent'));
373
374 /**
375 * Delete Options
376 */
377
378 /**D*/ delete_option('tutor_option');
379 /**D*/ $wpdb->delete($wpdb->usermeta, array('meta_key' => '_is_tutor_student'));
380 /**D*/ $wpdb->delete($wpdb->usermeta, array('meta_key' => '_tutor_instructor_approved'));
381 /**D*/ $wpdb->delete($wpdb->usermeta, array('meta_key' => '_tutor_instructor_status'));
382 /**D*/ $wpdb->delete($wpdb->usermeta, array('meta_key' => '_is_tutor_instructor'));
383 /**D*/ $wpdb->query("DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE '%_tutor_completed_lesson_id_%' ");
384
385 //Deleting Table
386 $prefix = $wpdb->prefix;
387 /**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 ");
388
389 deactivate_plugins($plugin_file);
390 }
391
392 wp_redirect('plugins.php');
393 die();
394 }
395
396 public function plugin_action_links($actions){
397 /*$hasPro = tutor()->has_pro;
398
399 if(!$hasPro){
400 $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
401 style="color: #39a700eb; font-weight: bold;">'.__('Upgrade to Pro', 'wp-megamenu').'</span></a>';
402 }*/
403
404 $is_erase_data = tutor_utils()->get_option('delete_on_uninstall');
405
406 if ($is_erase_data) {
407 $plugin_file = tutor()->basename;
408 if ( current_user_can( 'deactivate_plugin', $plugin_file ) ) {
409 if ( isset( $actions['deactivate'] ) ) {
410 $actions['deactivate'] = '<a href="admin.php?page=tutor-uninstall">' . __('Uninstall', 'tutor') . '</a>';
411 }
412 }
413 }
414
415 $actions['settings'] = '<a href="admin.php?page=tutor_settings">' . __('Settings', 'tutor') . '</a>';
416 return $actions;
417 }
418
419 public function plugin_row_meta($plugin_meta, $plugin_file){
420
421 if ($plugin_file === tutor()->basename) {
422 $plugin_meta[] = sprintf( '<a href="%s">%s</a>',
423 esc_url( 'https://www.themeum.com/docs/tutor-introduction/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_docs_link' ),
424 __( '<strong style="color: #03bd24">Documentation</strong>', 'tutor' )
425 );
426 $plugin_meta[] = sprintf( '<a href="%s">%s</a>',
427 esc_url( 'https://www.themeum.com/support-forums/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_support_link' ),
428 __( '<strong style="color: #03bd24">Get Support</strong>', 'tutor' )
429 );
430 }
431
432 return $plugin_meta;
433 }
434
435 /**
436 * @param $footer_text
437 *
438 * @return string
439 *
440 * Add footer text only on tutor pages
441 */
442 public function admin_footer_text( $footer_text ) {
443 $current_screen = get_current_screen();
444 $tutor_pages = tutor_utils()->tutor_get_screen_ids();
445
446 /**
447 * We are making sure that this message will be only on Tutor Admin page
448 */
449 if ( isset( $current_screen->id ) && apply_filters( 'tutor_display_admin_footer_text', in_array( $current_screen->id, $tutor_pages ) ) ) {
450 $footer_text = sprintf(
451 __( 'If you like %1$s please leave us a %2$s rating. A huge thanks in advance!', 'tutor' ),
452 sprintf( '<strong>%s</strong>', esc_html__( 'Tutor LMS', 'tutor' ) ),
453 '<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>'
454 );
455 }
456
457 return $footer_text;
458 }
459
460
461 }