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