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