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