PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.1.1
Tutor LMS – eLearning and online course solution v2.1.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 3 years ago Admin.php 3 years ago Ajax.php 3 years ago Announcements.php 3 years ago Assets.php 3 years ago Backend_Page_Trait.php 3 years ago Course.php 3 years ago Course_Embed.php 3 years ago Course_Filter.php 3 years ago Course_List.php 3 years ago Course_Settings_Tabs.php 3 years ago Course_Widget.php 4 years ago Custom_Validation.php 4 years ago Dashboard.php 3 years ago FormHandler.php 4 years ago Frontend.php 3 years ago Gutenberg.php 3 years ago Input.php 3 years ago Instructor.php 4 years ago Instructors_List.php 3 years ago Lesson.php 3 years ago Options_V2.php 3 years ago Post_types.php 3 years ago Private_Course_Access.php 4 years ago Q_and_A.php 3 years ago Question_Answers_List.php 4 years ago Quiz.php 3 years ago Quiz_Attempts_List.php 3 years ago RestAPI.php 4 years ago Reviews.php 3 years ago Rewrite_Rules.php 4 years ago Shortcode.php 4 years ago Student.php 4 years ago Students_List.php 4 years ago Taxonomies.php 4 years ago Template.php 3 years ago Theme_Compatibility.php 5 years ago Tools.php 3 years ago Tools_V2.php 4 years ago Tutor.php 3 years ago TutorEDD.php 4 years ago Tutor_Base.php 5 years ago Tutor_List_Table.php 3 years ago Tutor_Setup.php 3 years ago Upgrader.php 4 years ago User.php 4 years ago Utils.php 3 years ago Video_Stream.php 4 years ago Withdraw.php 3 years ago Withdraw_Requests_List.php 3 years ago WooCommerce.php 3 years ago
Admin.php
541 lines
1 <?php
2
3 namespace TUTOR;
4
5 use TUTOR\Input;
6
7 /**
8 * Class Admin
9 *
10 * @package TUTOR
11 *
12 * @since v.1.0.0
13 */
14
15 if ( ! defined( 'ABSPATH' ) ) {
16 exit;
17 }
18
19 class Admin {
20 public function __construct() {
21 add_action( 'admin_menu', array( $this, 'register_menu' ) );
22 // Force activate menu for necessary
23 add_filter( 'parent_file', array( $this, 'parent_menu_active' ) );
24 add_filter( 'submenu_file', array( $this, 'submenu_file_active' ), 10, 2 );
25
26 add_action( 'admin_init', array( $this, 'filter_posts_for_instructors' ) );
27 add_action( 'load-post.php', array( $this, 'check_if_current_users_post' ) );
28
29 add_action( 'admin_action_uninstall_tutor_and_erase', array( $this, 'erase_tutor_data' ) );
30 add_filter( 'plugin_action_links_' . plugin_basename( TUTOR_FILE ), array( $this, 'plugin_action_links' ) );
31
32 // Plugin Row Meta
33 add_filter( 'plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 2 );
34
35 // Admin Footer Text
36 add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ), 1 );
37 // Register Course Widget
38 add_action( 'widgets_init', array( $this, 'register_course_widget' ) );
39
40 // Handle flash toast message for redirect_to util helper
41 add_action( 'admin_head', array( new Utils, 'handle_flash_message' ), 999 );
42 }
43
44 /**
45 * Register admin menus
46 *
47 * @return void
48 */
49 public function register_menu() {
50 $hasPro = tutor()->has_pro;
51
52 $unanswered_questions = tutor_utils()->unanswered_question_count();
53 $unanswered_bubble = '';
54 if ( $unanswered_questions ) {
55 $unanswered_bubble = '<span class="update-plugins count-' . $unanswered_questions . '"><span class="plugin-count">' . $unanswered_questions . '</span></span>';
56 }
57
58 $course_post_type = tutor()->course_post_type;
59
60 $pro_text = '';
61 if ( $hasPro ) {
62 $pro_text = ' ' . __( 'Pro', 'tutor' );
63 }
64
65 $enable_course_marketplace = (bool) tutor_utils()->get_option( 'enable_course_marketplace' );
66
67 $welcome = Tutor_Setup::is_welcome_page_visited();
68
69 $root_page = array( $this, 'tutor_course_list' );
70 if ( false === $welcome && Input::has( 'page' ) && 'tutor' === Input::get( 'page' ) && Input::has( 'welcome' ) ) {
71 $root_page = array( $this, 'welcome_page' );
72 }
73
74 $icon_base64_uri = '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>' );
75 $menu_position = 2;
76
77 add_menu_page(
78 __( 'Tutor LMS', 'tutor' ) . $pro_text,
79 __( 'Tutor LMS', 'tutor' ) . $pro_text,
80 'manage_tutor_instructor',
81 'tutor',
82 $root_page,
83 $icon_base64_uri,
84 $menu_position
85 );
86
87 // @since v2.0.0
88 add_submenu_page( 'tutor', __( 'Courses', 'tutor' ), __( 'Courses', 'tutor' ), 'manage_tutor_instructor', 'tutor', array( $this, 'tutor_course_list' ) );
89
90 add_submenu_page( 'tutor', __( 'Categories', 'tutor' ), __( 'Categories', 'tutor' ), 'manage_tutor', 'edit-tags.php?taxonomy=course-category&post_type=' . $course_post_type, null );
91
92 add_submenu_page( 'tutor', __( 'Tags', 'tutor' ), __( 'Tags', 'tutor' ), 'manage_tutor', 'edit-tags.php?taxonomy=course-tag&post_type=' . $course_post_type, null );
93
94 add_submenu_page( 'tutor', __( 'Students', 'tutor' ), __( 'Students', 'tutor' ), 'manage_tutor', Students_List::STUDENTS_LIST_PAGE, array( $this, 'tutor_students' ) );
95
96 if ( $enable_course_marketplace ) {
97 add_submenu_page( 'tutor', __( 'Instructors', 'tutor' ), __( 'Instructors', 'tutor' ), 'manage_tutor', Instructors_List::INSTRUCTOR_LIST_PAGE, array( $this, 'tutor_instructors' ) );
98 }
99
100 add_submenu_page( 'tutor', __( 'Announcements', 'tutor' ), __( 'Announcements', 'tutor' ), 'manage_tutor_instructor', 'tutor_announcements', array( $this, 'tutor_announcements' ) );
101
102 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' ) );
103
104 add_submenu_page( 'tutor', __( 'Quiz Attempts', 'tutor' ), __( 'Quiz Attempts', 'tutor' ), 'manage_tutor_instructor', Quiz_Attempts_List::QUIZ_ATTEMPT_PAGE, array( $this, 'quiz_attempts' ) );
105
106 if ( $enable_course_marketplace ) {
107 add_submenu_page( 'tutor', __( 'Withdraw Requests', 'tutor' ), __( 'Withdraw Requests', 'tutor' ), 'manage_tutor', Withdraw_Requests_List::WITHDRAW_REQUEST_LIST_PAGE, array( $this, 'withdraw_requests' ) );
108 }
109
110 add_submenu_page( 'tutor', __( 'Add-ons', 'tutor' ), __( 'Add-ons', 'tutor' ), 'manage_tutor', 'tutor-addons', array( $this, 'enable_disable_addons' ) );
111
112 do_action( 'tutor_admin_register' );
113
114 add_submenu_page( 'tutor', __( 'Tools', 'tutor' ), __( 'Tools', 'tutor' ), 'manage_tutor', 'tutor-tools', array( new \TUTOR\Tools_V2(), 'load_tools_page' ) );
115
116 add_submenu_page( 'tutor', __( 'Settings', 'tutor' ), __( 'Settings', 'tutor' ), 'manage_tutor', 'tutor_settings', array( new \TUTOR\Options_V2(), 'load_settings_page' ) );
117
118 if ( ! $hasPro ) {
119 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' ) );
120 }
121 }
122
123 public function tutor_students() {
124 include tutor()->path . 'views/pages/students.php';
125 }
126
127 public function tutor_instructors() {
128 include tutor()->path . 'views/pages/instructors.php';
129 }
130
131 public function tutor_announcements() {
132 include tutor()->path . 'views/pages/announcements.php';
133 }
134
135 public function question_answer() {
136 include tutor()->path . 'views/pages/question_answer.php';
137 }
138
139 public function quiz_attempts() {
140 include tutor()->path . 'views/pages/quiz_attempts.php';
141 }
142
143 /**
144 * Show the withdraw requests table
145 *
146 * @since v.1.2.0
147 */
148 public function withdraw_requests() {
149 include tutor()->path . 'views/pages/withdraw_requests.php';
150 }
151
152 public function enable_disable_addons() {
153
154 if ( defined( 'TUTOR_PRO_VERSION' ) ) {
155 include tutor()->path . 'views/pages/enable_disable_addons.php';
156 } else {
157 include tutor()->path . 'views/pages/tutor-pro-addons.php';
158 }
159 }
160
161 public function tutor_tools_old() {
162 $tutor_admin_tools_page = Input::get( 'tutor_admin_tools_page' );
163 if ( $tutor_admin_tools_page ) {
164 include apply_filters( 'tutor_admin_tools_page', tutor()->path . "views/pages/{$tutor_admin_tools_page}.php", $tutor_admin_tools_page );
165 } else {
166 $pages = apply_filters(
167 'tutor_tool_pages',
168 array(
169 'tutor_pages' => array( 'title' => __( 'Tutor Pages', 'tutor' ) ),
170 'status' => __( 'Status', 'tutor' ),
171 )
172 );
173
174 $current_page = 'tutor_pages';
175 $requested_page = Input::get( 'sub_page' );
176 if ( $requested_page ) {
177 $current_page = $requested_page;
178 }
179
180 $current_page = str_replace( '/', '', $current_page );
181 $current_page = str_replace( '.', '', $current_page );
182 $current_page = str_replace( '\\', '', $current_page );
183 $current_page = trim( $current_page );
184
185 include tutor()->path . 'views/pages/tools.php';
186 }
187 }
188
189 public function tutor_get_pro() {
190 include tutor()->path . 'views/pages/get-pro.php';
191 }
192
193 /**
194 * Parent menu active
195 *
196 * @param string $parent_file
197 * @return string
198 */
199 public function parent_menu_active( $parent_file ) {
200 $taxonomy = Input::get( 'taxonomy' );
201 if ( $taxonomy === 'course-category' || $taxonomy === 'course-tag' ) {
202 return 'tutor';
203 }
204
205 return $parent_file;
206 }
207
208 /**
209 * Sub-menu active
210 *
211 * @param string $submenu_file
212 * @param string $parent_file
213 * @return string
214 */
215 public function submenu_file_active( $submenu_file, $parent_file ) {
216 $taxonomy = Input::get( 'taxonomy' );
217 $course_post_type = tutor()->course_post_type;
218
219 if ( $taxonomy === 'course-category' ) {
220 return 'edit-tags.php?taxonomy=course-category&post_type=' . $course_post_type;
221 }
222 if ( $taxonomy === 'course-tag' ) {
223 return 'edit-tags.php?taxonomy=course-tag&post_type=' . $course_post_type;
224 }
225
226 return $submenu_file;
227 }
228
229 /**
230 * Filter posts for instructor
231 */
232 public function filter_posts_for_instructors() {
233 if ( ! current_user_can( 'administrator' ) && current_user_can( tutor()->instructor_role ) ) {
234 @remove_menu_page( 'edit-comments.php' ); // Comments
235 add_filter( 'posts_clauses_request', array( $this, 'posts_clauses_request' ) );
236 }
237 }
238
239 public function posts_clauses_request( $clauses ) {
240
241 if ( ! is_admin() || ( ! Input::has( 'post_type' ) || Input::get( 'post_type' ) != tutor()->course_post_type ) || tutor_utils()->has_user_role( array( 'administrator', 'editor' ) ) ) {
242 return $clauses;
243 }
244
245 // Need multi instructor check
246 global $wpdb;
247
248 $user_id = get_current_user_id();
249
250 $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 ) );
251 $own_courses = is_array( $get_assigned_courses_ids ) ? $get_assigned_courses_ids : array();
252
253 $in_query_pre = count( $own_courses ) ? implode( ',', $own_courses ) : null;
254 $in_query_where = $in_query_pre ? " OR {$wpdb->posts}.ID IN({$in_query_pre})" : '';
255
256 $course_post_type = tutor()->course_post_type;
257 $custom_author_query = " AND ({$wpdb->posts}.post_type!='{$course_post_type}' OR {$wpdb->posts}.post_author = {$user_id}) {$in_query_where}";
258
259 $clauses['where'] .= $custom_author_query;
260
261 return $clauses;
262 }
263
264 /**
265 * Prevent unauthorised course/lesson edit page by direct URL
266 *
267 * @since v.1.0.0
268 */
269 public function check_if_current_users_post() {
270 if ( current_user_can( 'administrator' ) || ! current_user_can( tutor()->instructor_role ) ) {
271 return;
272 }
273
274 if ( ! empty( Input::get( 'post' ) ) ) {
275 $get_post_id = Input::get( 'post', Input::TYPE_INT );
276 $get_post = get_post( $get_post_id );
277 $tutor_post_types = array( tutor()->course_post_type, tutor()->lesson_post_type );
278
279 $current_user = get_current_user_id();
280
281 if ( in_array( $get_post->post_type, $tutor_post_types ) && $get_post->post_author != $current_user ) {
282 global $wpdb;
283
284 $get_assigned_courses_ids = (int) $wpdb->get_var(
285 $wpdb->prepare(
286 "SELECT user_id
287 from {$wpdb->usermeta}
288 WHERE user_id = %d AND meta_key = '_tutor_instructor_course_id' AND meta_value = %d ",
289 $current_user,
290 $get_post_id
291 )
292 );
293
294 if ( ! $get_assigned_courses_ids ) {
295 wp_die( __( 'Permission Denied', 'tutor' ) );
296 }
297 }
298 }
299 }
300
301 /**
302 * Status
303 */
304
305 public static function scan_template_files( $template_path = null ) {
306 if ( ! $template_path ) {
307 $template_path = tutor()->path . 'templates/';
308 }
309
310 $files = @scandir($template_path); // @codingStandardsIgnoreLine.
311 $result = array();
312
313 if ( ! empty( $files ) ) {
314 foreach ( $files as $key => $value ) {
315 if ( ! in_array( $value, array( '.', '..', '.DS_Store' ), true ) ) {
316 if ( is_dir( $template_path . DIRECTORY_SEPARATOR . $value ) ) {
317 $sub_files = self::scan_template_files( $template_path . DIRECTORY_SEPARATOR . $value );
318 foreach ( $sub_files as $sub_file ) {
319 $result[] = $value . DIRECTORY_SEPARATOR . $sub_file;
320 }
321 } else {
322 $result[] = $value;
323 }
324 }
325 }
326 }
327 return $result;
328 }
329
330 /**
331 * Get Template overridden files
332 *
333 * @return array
334 */
335 public static function template_overridden_files() {
336 $template_files = self::scan_template_files();
337
338 $override_files = array();
339 foreach ( $template_files as $file ) {
340 $file_path = null;
341 if ( file_exists( trailingslashit( get_stylesheet_directory() ) . tutor()->template_path . $file ) ) {
342 $file_path = $file;
343 } elseif ( file_exists( trailingslashit( get_template_directory() ) . tutor()->template_path . $file ) ) {
344 $file_path = $file;
345 }
346
347 if ( $file_path ) {
348 $override_files[] = str_replace( WP_CONTENT_DIR . '/themes/', '', $file_path );
349 }
350 }
351
352 return $override_files;
353 }
354
355 /**
356 * Erase tutor data
357 *
358 * @return void
359 */
360 public function erase_tutor_data() {
361 global $wpdb;
362
363 $is_erase_data = tutor_utils()->get_option( 'delete_on_uninstall' );
364 // => Deleting Data
365
366 $plugin_file = tutor()->basename;
367 if ( $is_erase_data && current_user_can( 'deactivate_plugin', $plugin_file ) ) {
368 /**
369 * Deleting Post Type, Meta Data, taxonomy
370 */
371 $course_post_type = tutor()->course_post_type;
372 $lesson_post_type = tutor()->lesson_post_type;
373
374 $post_types = array(
375 $course_post_type,
376 $lesson_post_type,
377 'tutor_quiz',
378 'tutor_enrolled',
379 'topics',
380 'tutor_enrolled',
381 'tutor_announcements',
382 );
383
384 $post_type_strings = "'" . implode( "','", $post_types ) . "'";
385 $tutor_posts = $wpdb->get_col( "SELECT ID from {$wpdb->posts} WHERE post_type in({$post_type_strings}) ;" );
386
387 if ( is_array( $tutor_posts ) && count( $tutor_posts ) ) {
388 foreach ( $tutor_posts as $post_id ) {
389 // Delete categories
390 $terms = wp_get_object_terms( $post_id, 'course-category' );
391 foreach ( $terms as $term ) {
392 wp_remove_object_terms( $post_id, array( $term->term_id ), 'course-category' );
393 }
394
395 // Delete tags if available
396 $terms = wp_get_object_terms( $post_id, 'course-tag' );
397 foreach ( $terms as $term ) {
398 wp_remove_object_terms( $post_id, array( $term->term_id ), 'course-tag' );
399 }
400
401 // Delete All Meta
402 $wpdb->delete( $wpdb->postmeta, array( 'post_id' => $post_id ) );
403 $wpdb->delete( $wpdb->posts, array( 'ID' => $post_id ) );
404 }
405 }
406
407 /**
408 * Deleting Comments (reviews, questions, quiz_answers, etc)
409 */
410 $tutor_comments = $wpdb->get_col( "SELECT comment_ID from {$wpdb->comments} WHERE comment_agent = 'comment_agent' ;" );
411 $comments_ids_strings = "'" . implode( "','", $tutor_comments ) . "'";
412 if ( is_array( $tutor_comments ) && count( $tutor_comments ) ) {
413 $wpdb->query( "DELETE from {$wpdb->commentmeta} WHERE comment_ID in({$comments_ids_strings}) " );
414 }
415 $wpdb->delete( $wpdb->comments, array( 'comment_agent' => 'comment_agent' ) );
416
417 /**
418 * Delete Options
419 */
420
421 delete_option( 'tutor_option' );
422 $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => '_is_tutor_student' ) );
423 $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => '_tutor_instructor_approved' ) );
424 $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => '_tutor_instructor_status' ) );
425 $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => '_is_tutor_instructor' ) );
426 $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE '%_tutor_completed_lesson_id_%' " );
427
428 // Deleting Table
429 $prefix = $wpdb->prefix;
430 $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 " );
431
432 deactivate_plugins( $plugin_file );
433 }
434
435 wp_redirect( 'plugins.php' );
436 die();
437 }
438
439 /**
440 * Plugin activation link
441 *
442 * @param array $actions
443 * @return array
444 */
445 public function plugin_action_links( $actions ) {
446 $hasPro = tutor()->has_pro;
447
448 if ( ! $hasPro ) {
449 $actions['tutor_pro_link'] =
450 '<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">
451 <span style="color: #ff7742; font-weight: bold;">' .
452 __( 'Upgrade to Pro', 'wp-megamenu' ) .
453 '</span>
454 </a>';
455 }
456
457 $actions['settings'] = '<a href="admin.php?page=tutor_settings">' . __( 'Settings', 'tutor' ) . '</a>';
458
459 return $actions;
460 }
461
462 /**
463 * Add plugin meta data in WP plugins list page
464 *
465 * @param array $plugin_meta
466 * @param string $plugin_file
467 * @return array
468 */
469 public function plugin_row_meta( $plugin_meta, $plugin_file ) {
470
471 if ( $plugin_file === tutor()->basename ) {
472 $plugin_meta[] = sprintf(
473 '<a href="%s">%s</a>',
474 esc_url( 'https://docs.themeum.com/tutor-lms/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_docs_link' ),
475 __( '<strong style="color: #03bd24">Documentation</strong>', 'tutor' )
476 );
477 $plugin_meta[] = sprintf(
478 '<a href="%s">%s</a>',
479 esc_url( 'https://www.themeum.com/contact-us/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_support_link' ),
480 __( '<strong style="color: #03bd24">Get Support</strong>', 'tutor' )
481 );
482 }
483
484 return $plugin_meta;
485 }
486
487 /**
488 * @param $footer_text
489 *
490 * @return string
491 *
492 * Add footer text only on tutor pages
493 */
494 public function admin_footer_text( $footer_text ) {
495 $current_screen = get_current_screen();
496
497 /**
498 * We are making sure that this message will be only on Tutor Admin page
499 */
500 if ( apply_filters( 'tutor_display_admin_footer_text', ( tutor_utils()->array_get( 'parent_base', $current_screen ) === 'tutor' ) ) ) {
501 $footer_text = sprintf(
502 __( 'If you like %1$s please leave us a %2$s rating. A huge thanks in advance!', 'tutor' ),
503 sprintf( '<strong>%s</strong>', esc_html__( 'Tutor LMS', 'tutor' ) ),
504 '<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>'
505 );
506 }
507
508 return $footer_text;
509 }
510
511 /**
512 * Register course widget
513 *
514 * @return void
515 */
516 public function register_course_widget() {
517 register_widget( 'Tutor\Course_Widget' );
518 }
519
520 /**
521 * Tutor Course List
522 *
523 * @package Course List
524 * @since v2.0.0
525 */
526 public function tutor_course_list() {
527 include tutor()->path . 'views/pages/course-list.php';
528 }
529
530 /**
531 * Show welcome page
532 *
533 * @return void
534 */
535 public function welcome_page() {
536 Tutor_Setup::mark_as_visited();
537 include tutor()->path . 'views/pages/welcome.php';
538 exit;
539 }
540 }
541