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