PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 1.9.3
Tutor LMS – eLearning and online course solution v1.9.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 5 years ago Admin.php 5 years ago Ajax.php 5 years ago Assets.php 5 years ago Course.php 5 years ago Course_Filter.php 5 years ago Course_Settings_Tabs.php 5 years ago Course_Widget.php 5 years ago Custom_Validation.php 5 years ago Dashboard.php 5 years ago Email.php 5 years ago FormHandler.php 5 years ago Frontend.php 5 years ago Gutenberg.php 5 years ago Instructor.php 5 years ago Instructors_List.php 5 years ago Lesson.php 5 years ago Options.php 5 years ago Post_types.php 5 years ago Private_Course_Access.php 5 years ago Q_and_A.php 5 years ago Question_Answers_List.php 5 years ago Quiz.php 5 years ago Quiz_Attempts_List.php 5 years ago RestAPI.php 5 years ago Rewrite_Rules.php 5 years ago Shortcode.php 5 years ago Student.php 5 years ago Students_List.php 5 years ago Taxonomies.php 5 years ago Template.php 5 years ago Theme_Compatibility.php 5 years ago Tools.php 5 years ago Tutor.php 5 years ago TutorEDD.php 5 years ago Tutor_Base.php 5 years ago Tutor_List_Table.php 5 years ago Tutor_Setup.php 5 years ago Upgrader.php 5 years ago User.php 5 years ago Utils.php 5 years ago Video_Stream.php 5 years ago Withdraw.php 5 years ago Withdraw_Requests_List.php 5 years ago WooCommerce.php 5 years ago
Admin.php
503 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 $enable_course_marketplace = (bool) tutils()->get_option('enable_course_marketplace');
53
54 add_menu_page(__('Tutor LMS', 'tutor').$pro_text, __('Tutor LMS', 'tutor').$pro_text, 'manage_tutor_instructor', 'tutor', null,
55 'data:image/svg+xml;base64,' . base64_encode('<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1139"><defs/><path fill-rule="evenodd" clip-rule="evenodd" d="M341.652 622.4c-23.412 0-43.222-19.8-43.222-43.2v-99c0-23.4 19.81-43.2 43.222-43.2 23.412 0 43.222 19.8 43.222 43.2v99c0 23.4-18.009 43.2-43.222 43.2 1.801 0 1.801 0 0 0zM655.01 622.4c-23.412 0-43.222-18-43.222-43.2v-99c0-23.4 19.81-43.2 43.222-43.2 23.412 0 43.222 19.8 43.222 43.2v99c0 25.2-19.81 43.2-43.222 43.2z" fill="#9DA2A8"/><path fill-rule="evenodd" clip-rule="evenodd" d="M255.204 406.4c18.009-37.8 54.028-63 95.449-63 61.231 1.8 108.055 52.2 106.254 113.4v203.4c3.602 21.6 23.412 37.8 45.023 34.2 18.009-1.8 32.416-16.2 34.217-34.2V455c-1.801-61.2 46.824-111.6 106.254-113.4 39.621 0 75.639 21.6 93.648 59.4 68.435 133.2 14.407 295.2-117.06 363.6C487.523 833 325.44 779 258.806 647.6c-39.62-75.6-39.62-165.6-3.602-241.2zM426.291 140h151.277v59.4c-25.212-5.4-52.226-9-77.439-9-25.213 0-50.426 3.6-75.639 7.2l1.801-57.6zm414.211 388.8c0-122.4-66.634-235.8-172.888-295.2V140h64.833c25.213 0 45.023-19.8 45.023-45s-21.611-45-45.023-45H271.413C246.2 51.8 226.39 71.6 226.39 96.8c0 25.2 19.81 45 45.023 45h66.633v91.8c-163.883 90-230.517 298.8-135.068 459 3.602 5.4-3.602-5.4 0 0C338.046 930.2 687.424 948.2 802.683 950c10.805 0 19.81-3.6 27.014-10.8 7.203-7.2 10.805-18 10.805-27V528.8z" fill="#9DA2A8"/></svg>'), 2);
56 add_submenu_page('tutor', __('Categories', 'tutor'), __('Categories', 'tutor'), 'manage_tutor', 'edit-tags.php?taxonomy=course-category&post_type='.$course_post_type, null );
57
58 add_submenu_page('tutor', __('Tags', 'tutor'), __('Tags', 'tutor'), 'manage_tutor', 'edit-tags.php?taxonomy=course-tag&post_type='.$course_post_type, null );
59
60 add_submenu_page('tutor', __('Students', 'tutor'), __('Students', 'tutor'), 'manage_tutor', 'tutor-students', array($this, 'tutor_students') );
61
62 if ($enable_course_marketplace) {
63 add_submenu_page('tutor', __('Instructors', 'tutor'), __('Instructors', 'tutor'), 'manage_tutor', Instructors_List::INSTRUCTOR_LIST_PAGE, array($this, 'tutor_instructors'));
64 }
65
66 add_submenu_page('tutor', __('Announcements', 'tutor'), __('Announcements', 'tutor'), 'manage_tutor_instructor', 'tutor_announcements', array($this, 'tutor_announcements'));
67
68 add_submenu_page('tutor', __('Q & A', 'tutor'), __('Q & A ', 'tutor').$unanswered_bubble, 'manage_tutor_instructor', Question_Answers_List::Question_Answer_PAGE, array($this, 'question_answer') );
69
70 add_submenu_page('tutor', __('Quiz Attempts', 'tutor'), __('Quiz Attempts', 'tutor'), 'manage_tutor_instructor', Quiz_Attempts_List::QUIZ_ATTEMPT_PAGE, array($this, 'quiz_attempts') );
71
72 if ($enable_course_marketplace){
73 add_submenu_page('tutor', __('Withdraw Requests', 'tutor'), __('Withdraw Requests', 'tutor'), 'manage_tutor_instructor', Withdraw_Requests_List::WITHDRAW_REQUEST_LIST_PAGE, array($this, 'withdraw_requests') );
74 }
75
76 add_submenu_page( 'tutor', __( 'Add-ons', 'tutor' ), __( 'Add-ons', 'tutor' ), 'manage_tutor', 'tutor-addons', array( $this, 'enable_disable_addons' ) );
77
78 do_action('tutor_admin_register');
79
80 add_submenu_page('tutor', __('Settings', 'tutor'), __('Settings', 'tutor'), 'manage_tutor', 'tutor_settings', array($this, 'tutor_page') );
81
82 add_submenu_page('tutor', __('Tools', 'tutor'), __('Tools', 'tutor'), 'manage_tutor', 'tutor-tools', array($this, 'tutor_tools') );
83
84 if ( ! $hasPro){
85 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') );
86 }
87 }
88
89 public function tutor_page(){
90 $tutor_option = new Options();
91 echo apply_filters('tutor/options/generated-html', $tutor_option->generate());
92 }
93
94 public function tutor_students(){
95 include tutor()->path.'views/pages/students.php';
96 }
97
98 public function tutor_instructors(){
99 include tutor()->path.'views/pages/instructors.php';
100 }
101
102 public function tutor_announcements(){
103 include tutor()->path.'views/pages/announcements.php';
104 }
105
106 public function question_answer(){
107 include tutor()->path.'views/pages/question_answer.php';
108 }
109
110 public function quiz_attempts(){
111 include tutor()->path.'views/pages/quiz_attempts.php';
112 }
113
114 /**
115 * Show the withdraw requests table
116 *
117 * @since v.1.2.0
118 */
119 public function withdraw_requests(){
120 include tutor()->path.'views/pages/withdraw_requests.php';
121 }
122
123 public function enable_disable_addons(){
124
125 if (defined('TUTOR_PRO_VERSION')) {
126 include tutor()->path.'views/pages/enable_disable_addons.php';
127 }else{
128 include tutor()->path.'views/pages/tutor-pro-addons.php';
129 }
130 }
131
132 public function tutor_tools(){
133 $tutor_admin_tools_page = tutils()->array_get('tutor_admin_tools_page', $_GET);
134 if ($tutor_admin_tools_page){
135 include apply_filters('tutor_admin_tools_page', tutor()->path."views/pages/{$tutor_admin_tools_page}.php", $tutor_admin_tools_page);
136 }else{
137 $pages = apply_filters('tutor_tool_pages', array(
138 'tutor_pages' => array('title' => __('Tutor Pages', 'tutor') ),
139 'status' => __('Status', 'tutor'),
140 ));
141
142 $current_page = 'tutor_pages';
143 $requested_page = sanitize_text_field(tutils()->array_get('sub_page', $_GET));
144 if ($requested_page){
145 $current_page = $requested_page;
146 }
147
148 $current_page = str_replace('/', '', $current_page);
149 $current_page = str_replace('.', '', $current_page);
150 $current_page = str_replace('\\', '', $current_page);
151 $current_page = trim($current_page);
152
153 include tutor()->path.'views/pages/tools.php';
154 }
155 }
156
157 public function tutor_get_pro(){
158 include tutor()->path.'views/pages/get-pro.php';
159 }
160
161 public function parent_menu_active( $parent_file ){
162 $taxonomy = tutor_utils()->avalue_dot('taxonomy', $_GET);
163 if ($taxonomy === 'course-category' || $taxonomy === 'course-tag'){
164 return 'tutor';
165 }
166
167 return $parent_file;
168 }
169
170 public function submenu_file_active($submenu_file, $parent_file){
171 $taxonomy = tutor_utils()->avalue_dot('taxonomy', $_GET);
172 $course_post_type = tutor()->course_post_type;
173
174 if ($taxonomy === 'course-category'){
175 return 'edit-tags.php?taxonomy=course-category&post_type='.$course_post_type;
176 }
177 if ($taxonomy === 'course-tag'){
178 return 'edit-tags.php?taxonomy=course-tag&post_type='.$course_post_type;
179 }
180
181
182 return $submenu_file;
183 }
184
185 /**
186 * Filter posts for instructor
187 */
188 public function filter_posts_for_instructors(){
189 if ( ! current_user_can('administrator') && current_user_can(tutor()->instructor_role)){
190 @remove_menu_page( 'edit-comments.php' ); //Comments
191 add_filter( 'posts_clauses_request', array($this, 'posts_clauses_request') );
192 }
193 }
194
195 public function posts_clauses_request($clauses){
196
197 if(!is_admin() || (!isset($_GET['post_type']) || $_GET['post_type']!='courses') || tutor_utils()->has_user_role(array('administrator', 'editor'))) {
198 return $clauses;
199 }
200
201 // Need multi instructor check
202 global $wpdb;
203
204 $user_id = get_current_user_id();
205
206 $get_assigned_courses_ids = $wpdb->get_col($wpdb->prepare("SELECT meta_value from {$wpdb->usermeta} WHERE meta_key = '_tutor_instructor_course_id' AND user_id = %d", $user_id));
207 $own_courses = is_array($get_assigned_courses_ids) ? $get_assigned_courses_ids : array();
208
209 $in_query_pre = count($own_courses) ? implode(',', $own_courses) : null;
210 $in_query_where = $in_query_pre ? " OR {$wpdb->posts}.ID IN({$in_query_pre})" : '';
211
212 $custom_author_query = " AND ({$wpdb->posts}.post_type!='courses' OR {$wpdb->posts}.post_author = {$user_id}) {$in_query_where}";
213
214 $clauses['where'] .= $custom_author_query;
215
216 return $clauses;
217 }
218
219 /**
220 * Prevent unauthorised course/lesson edit page by direct URL
221 *
222 * @since v.1.0.0
223 */
224 public function check_if_current_users_post(){
225 if (current_user_can('administrator') || ! current_user_can(tutor()->instructor_role)) {
226 return;
227 }
228
229 if (! empty($_GET['post']) ) {
230 $get_post_id = (int) sanitize_text_field($_GET['post']);
231 $get_post = get_post($get_post_id);
232 $tutor_post_types = array(tutor()->course_post_type, tutor()->lesson_post_type);
233
234 $current_user = get_current_user_id();
235
236 if (in_array($get_post->post_type, $tutor_post_types) && $get_post->post_author != $current_user){
237 global $wpdb;
238
239 $get_assigned_courses_ids = (int) $wpdb->get_var($wpdb->prepare(
240 "SELECT user_id
241 from {$wpdb->usermeta}
242 WHERE user_id = %d AND meta_key = '_tutor_instructor_course_id' AND meta_value = %d ", $current_user, $get_post_id));
243
244 if ( ! $get_assigned_courses_ids){
245 wp_die(__('Permission Denied', 'tutor'));
246 }
247
248 }
249 }
250 }
251
252 /**
253 * Status
254 */
255
256 public static function scan_template_files( $template_path = null ) {
257 if ( ! $template_path){
258 $template_path = tutor()->path.'templates/';
259 }
260
261 $files = @scandir( $template_path ); // @codingStandardsIgnoreLine.
262 $result = array();
263
264 if ( ! empty( $files ) ) {
265 foreach ( $files as $key => $value ) {
266 if ( ! in_array( $value, array( '.', '..', '.DS_Store' ), true ) ) {
267 if ( is_dir( $template_path . DIRECTORY_SEPARATOR . $value ) ) {
268 $sub_files = self::scan_template_files( $template_path . DIRECTORY_SEPARATOR . $value );
269 foreach ( $sub_files as $sub_file ) {
270 $result[] = $value . DIRECTORY_SEPARATOR . $sub_file;
271 }
272 } else {
273 $result[] = $value;
274 }
275 }
276 }
277 }
278 return $result;
279 }
280
281 /**
282 * @return array
283 *
284 *
285 */
286 public static function template_overridden_files(){
287 $template_files = self::scan_template_files();
288
289 $override_files = array();
290 foreach ($template_files as $file){
291 $file_path = null;
292 if (file_exists(trailingslashit(get_stylesheet_directory()).tutor()->template_path.$file)){
293 $file_path = $file;
294 }elseif (file_exists(trailingslashit(get_template_directory()).tutor()->template_path.$file)){
295 $file_path = $file;
296 }
297
298 if ($file_path){
299 $override_files[] = str_replace( WP_CONTENT_DIR.'/themes/', '', $file_path );
300 }
301 }
302
303 return $override_files;
304 }
305
306 public static function get_environment_info(){
307
308 // Figure out cURL version, if installed.
309 $curl_version = '';
310 if ( function_exists( 'curl_version' ) ) {
311 $curl_version = curl_version();
312 $curl_version = $curl_version['version'] . ', ' . $curl_version['ssl_version'];
313 }
314
315
316 // WP memory limit.
317 $wp_memory_limit = tutor_utils()->let_to_num(WP_MEMORY_LIMIT);
318 if ( function_exists( 'memory_get_usage' ) ) {
319 $wp_memory_limit = max( $wp_memory_limit, tutor_utils()->let_to_num( @ini_get( 'memory_limit' ) ) );
320 }
321
322 $database_version = tutor_utils()->get_db_version();
323
324 return array(
325 'home_url' => get_option( 'home' ),
326 'site_url' => get_option( 'siteurl' ),
327 'version' => tutor()->version,
328 'wp_version' => get_bloginfo( 'version' ),
329 'wp_multisite' => is_multisite(),
330 'wp_memory_limit' => $wp_memory_limit,
331 'wp_debug_mode' => ( defined( 'WP_DEBUG' ) && WP_DEBUG ),
332 'wp_cron' => ! ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ),
333 'language' => get_locale(),
334 'external_object_cache' => wp_using_ext_object_cache(),
335 'server_info' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) : '',
336 'php_version' => phpversion(),
337 'php_post_max_size' => tutor_utils()->let_to_num( ini_get( 'post_max_size' ) ),
338 'php_max_execution_time' => ini_get( 'max_execution_time' ),
339 'php_max_input_vars' => ini_get( 'max_input_vars' ),
340 'curl_version' => $curl_version,
341 'suhosin_installed' => extension_loaded( 'suhosin' ),
342 'max_upload_size' => wp_max_upload_size(),
343 'mysql_version' => $database_version['number'],
344 'mysql_version_string' => $database_version['string'],
345 'default_timezone' => date_default_timezone_get(),
346 'fsockopen_or_curl_enabled' => ( function_exists( 'fsockopen' ) || function_exists( 'curl_init' ) ),
347 'soapclient_enabled' => class_exists( 'SoapClient' ),
348 'domdocument_enabled' => class_exists( 'DOMDocument' ),
349 'gzip_enabled' => is_callable( 'gzopen' ),
350 'mbstring_enabled' => extension_loaded( 'mbstring' ),
351 );
352 }
353
354
355 public function erase_tutor_data(){
356 global $wpdb;
357
358 $is_erase_data = tutor_utils()->get_option('delete_on_uninstall');
359 //=> Deleting Data
360
361 $plugin_file = tutor()->basename;
362 if ($is_erase_data && current_user_can( 'deactivate_plugin', $plugin_file )) {
363 /**
364 * Deleting Post Type, Meta Data, taxonomy
365 */
366 $course_post_type = tutor()->course_post_type;
367 $lesson_post_type = tutor()->lesson_post_type;
368
369 $post_types = array(
370 $course_post_type,
371 $lesson_post_type,
372 'tutor_quiz',
373 'tutor_enrolled',
374 'topics',
375 'tutor_enrolled',
376 'tutor_announcements',
377 );
378
379 $post_type_strings = "'".implode("','", $post_types)."'";
380 $tutor_posts = $wpdb->get_col("SELECT ID from {$wpdb->posts} WHERE post_type in({$post_type_strings}) ;");
381
382 if (is_array($tutor_posts) && count($tutor_posts)){
383 foreach ($tutor_posts as $post_id){
384 //Delete categories
385 $terms = wp_get_object_terms( $post_id, 'course-category' );
386 foreach( $terms as $term ){
387 wp_remove_object_terms( $post_id, array( $term->term_id ), 'course-category' );
388 }
389
390 //Delete tags if available
391 $terms = wp_get_object_terms( $post_id, 'course-tag' );
392 foreach( $terms as $term ){
393 wp_remove_object_terms( $post_id, array( $term->term_id ), 'course-tag' );
394 }
395
396 //Delete All Meta
397 $wpdb->delete($wpdb->postmeta, array('post_id' => $post_id) );
398 $wpdb->delete($wpdb->posts, array('ID' => $post_id) );
399 }
400 }
401
402 /**
403 * Deleting Comments (reviews, questions, quiz_answers, etc)
404 */
405 $tutor_comments = $wpdb->get_col("SELECT comment_ID from {$wpdb->comments} WHERE comment_agent = 'comment_agent' ;");
406 $comments_ids_strings = "'".implode("','", $tutor_comments)."'";
407 if (is_array($tutor_comments) && count($tutor_comments)){
408 $wpdb->query("DELETE from {$wpdb->commentmeta} WHERE comment_ID in({$comments_ids_strings}) ");
409 }
410 $wpdb->delete($wpdb->comments, array('comment_agent' => 'comment_agent'));
411
412 /**
413 * Delete Options
414 */
415
416 delete_option('tutor_option');
417 $wpdb->delete($wpdb->usermeta, array('meta_key' => '_is_tutor_student'));
418 $wpdb->delete($wpdb->usermeta, array('meta_key' => '_tutor_instructor_approved'));
419 $wpdb->delete($wpdb->usermeta, array('meta_key' => '_tutor_instructor_status'));
420 $wpdb->delete($wpdb->usermeta, array('meta_key' => '_is_tutor_instructor'));
421 $wpdb->query("DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE '%_tutor_completed_lesson_id_%' ");
422
423 //Deleting Table
424 $prefix = $wpdb->prefix;
425 $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 ");
426
427 deactivate_plugins($plugin_file);
428 }
429
430 wp_redirect('plugins.php');
431 die();
432 }
433
434 public function plugin_action_links($actions){
435 $hasPro = tutor()->has_pro;
436
437 if(!$hasPro){
438 $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
439 style="color: #ff7742; font-weight: bold;">' . __('Upgrade to Pro', 'wp-megamenu') . '</span></a>';
440 }
441
442 $is_erase_data = tutor_utils()->get_option('delete_on_uninstall');
443
444 if ($is_erase_data) {
445 $plugin_file = tutor()->basename;
446 if ( current_user_can( 'deactivate_plugin', $plugin_file ) ) {
447 if ( isset( $actions['deactivate'] ) ) {
448 $actions['deactivate'] = '<a href="admin.php?page=tutor-tools&tutor_admin_tools_page=uninstall">' . __('Uninstall', 'tutor') . '</a>';
449 }
450 }
451 }
452
453 $actions['settings'] = '<a href="admin.php?page=tutor_settings">' . __('Settings', 'tutor') . '</a>';
454 return $actions;
455 }
456
457 public function plugin_row_meta($plugin_meta, $plugin_file){
458
459 if ($plugin_file === tutor()->basename) {
460 $plugin_meta[] = sprintf( '<a href="%s">%s</a>',
461 esc_url( 'https://docs.themeum.com/tutor-lms/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_docs_link' ),
462 __( '<strong style="color: #03bd24">Documentation</strong>', 'tutor' )
463 );
464 $plugin_meta[] = sprintf( '<a href="%s">%s</a>',
465 esc_url( 'https://www.themeum.com/contact-us/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_support_link' ),
466 __( '<strong style="color: #03bd24">Get Support</strong>', 'tutor' )
467 );
468 }
469
470 return $plugin_meta;
471 }
472
473 /**
474 * @param $footer_text
475 *
476 * @return string
477 *
478 * Add footer text only on tutor pages
479 */
480 public function admin_footer_text( $footer_text ) {
481 $current_screen = get_current_screen();
482
483 /**
484 * We are making sure that this message will be only on Tutor Admin page
485 */
486 if ( apply_filters( 'tutor_display_admin_footer_text', (tutor_utils()->array_get('parent_base', $current_screen) === 'tutor' ) ) ) {
487 $footer_text = sprintf(
488 __( 'If you like %1$s please leave us a %2$s rating. A huge thanks in advance!', 'tutor' ),
489 sprintf( '<strong>%s</strong>', esc_html__( 'Tutor LMS', 'tutor' ) ),
490 '<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>'
491 );
492 }
493
494 return $footer_text;
495 }
496
497
498 public function register_course_widget(){
499 register_widget( 'Tutor\Course_Widget' );
500 }
501
502
503 }