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