PluginProbe
Tutor LMS – eLearning and online course solution / 1.8.10
Tutor LMS – eLearning and online course solution v1.8.10
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 4.0.2 4.0.1 4.0.0 3.9.15 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 All 191 releases
← All changes | classes/Admin.php +299 -786 trunk1.8.10 View file →
@@ -1,585 +1,167 @@
1 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 2 namespace TUTOR;
12 3
13 -defined( 'ABSPATH' ) || exit;
14 -
15 -use Tutor\Ecommerce\OrderController;
16 -use Tutor\Helpers\HttpHelper;
17 -use TUTOR\Input;
18 -use Tutor\Models\CourseModel;
19 -use Tutor\Traits\JsonResponse;
20 -
21 4 /**
22 - * Admin Class
5 + * Class Admin
6 + * @package TUTOR
23 7 *
24 - * @since 1.0.0
8 + * @since v.1.0.0
25 9 */
26 -class Admin {
27 - use JsonResponse;
28 10
29 - /**
30 - * Constructor
31 - *
32 - * @since 1.0.0
33 - *
34 - * @return void
35 - */
11 +if ( ! defined( 'ABSPATH' ) )
12 + exit;
13 +
14 +class Admin{
36 15 public function __construct() {
37 - add_action( 'admin_notices', array( $this, 'show_unstable_version_admin_notice' ) );
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);
38 20
39 - add_action( 'admin_menu', array( $this, 'register_menu' ) );
40 - // Force activate menu for necessary.
41 - add_filter( 'parent_file', array( $this, 'parent_menu_active' ) );
42 - add_filter( 'submenu_file', array( $this, 'submenu_file_active' ), 10, 2 );
21 + add_action('admin_init', array($this, 'filter_posts_for_instructors'));
22 + add_action('load-post.php', array($this, 'check_if_current_users_post') );
43 23
44 - add_action( 'admin_init', array( $this, 'filter_posts_for_instructors' ) );
45 - add_action( 'admin_init', array( $this, 'redirect_to_welcome_page' ) );
46 - add_action( 'load-post.php', array( $this, 'check_if_current_users_post' ) );
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' ) );
47 26
48 - add_filter( 'plugin_action_links_' . plugin_basename( TUTOR_FILE ), array( $this, 'plugin_action_links' ) );
27 + //Plugin Row Meta
28 + add_filter('plugin_row_meta', array($this, 'plugin_row_meta'), 10, 2);
49 29
50 - // Plugin Row Meta.
51 - add_filter( 'plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 2 );
52 -
53 - // Admin Footer Text.
30 + //Admin Footer Text
54 31 add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ), 1 );
55 - // Register Course Widget.
56 - add_action( 'widgets_init', array( $this, 'register_course_widget' ) );
57 -
58 - // Handle flash toast message for redirect_to util helper.
59 - add_action( 'admin_head', array( new Utils(), 'handle_flash_message' ), 999 );
60 -
61 - add_action( 'admin_bar_menu', array( $this, 'add_toolbar_items' ), 100 );
62 -
63 - add_action( 'wp_ajax_tutor_do_not_show_feature_page', array( $this, 'handle_do_not_show_feature_page' ) );
64 -
65 - add_action( 'upgrader_process_complete', array( $this, 'set_permalink_flag_on_upgrade' ), 10, 2 );
66 -
67 - add_action( 'admin_notices', array( $this, 'show_offer_notice' ) );
68 - add_action( 'wp_ajax_tutor_dismiss_offer_notice', array( $this, 'ajax_dismiss_offer_notice' ) );
32 + //Register Course Widget
33 + add_action( 'widgets_init', array($this, 'register_course_widget') );
69 34 }
70 35
71 - /**
72 - * Flush Tutor permalink rewrite rules after updates.
73 - *
74 - * @since 4.0.0
75 - *
76 - * @param mixed $upgrader_object Upgrader instance.
77 - * @param array $options Extra arguments passed to the hook.
78 - *
79 - * @return void
80 - */
81 - public function set_permalink_flag_on_upgrade( $upgrader_object, $options ) {
82 - Permalink::set_permalink_reset_flag( $upgrader_object, $options );
83 - }
36 + public function register_menu(){
37 + $hasPro = tutor()->has_pro;
84 38
85 - /**
86 - * Check offer notice is dismissed.
87 - *
88 - * @since 4.0.0
89 - *
90 - * @return bool
91 - */
92 - private function is_offer_notice_dismissed() {
93 - return '4.0.0' === get_transient( 'tutor_offer_notice_dismissed' );
94 - }
95 -
96 - /**
97 - * Show offer notice
98 - *
99 - * @since 4.0.0
100 - *
101 - * @return void
102 - */
103 - public function show_offer_notice() {
104 - if ( ! User::is_admin() || Input::has( 'welcome', Input::GET_REQUEST ) ) {
105 - return;
106 - }
107 -
108 - $is_free_user = ! tutor()->has_pro;
109 - $cta_label = __( 'Claim 30% OFF', 'tutor' );
110 - $cta_link = 'https://tutorlms.com/pricing/?utm_source=tutor-plugin&utm_medium=notice&utm_campaign=tutor-lms-pro-offer';
111 -
112 - $now = new \DateTimeImmutable( 'now', wp_timezone() );
113 - $expiration_dt = '2026-07-15 23:59:59';
114 - $expiration = new \DateTimeImmutable( $expiration_dt, wp_timezone() );
115 -
116 - $remaining = max( 0, $expiration->getTimestamp() - $now->getTimestamp() );
117 -
118 - $days = floor( $remaining / DAY_IN_SECONDS );
119 - $hours = floor( ( $remaining % DAY_IN_SECONDS ) / HOUR_IN_SECONDS );
120 - $minutes = floor( ( $remaining % HOUR_IN_SECONDS ) / MINUTE_IN_SECONDS );
121 - $seconds = $remaining % MINUTE_IN_SECONDS;
122 -
123 - $expire_in = sprintf(
124 - '%dd:%02dh:%02d:%02d',
125 - $days,
126 - $hours,
127 - $minutes,
128 - $seconds
129 - );
130 -
131 - if ( $is_free_user && $remaining > 0 && ! self::is_offer_notice_dismissed() ) {
132 - ?>
133 - <div class="tutor-offer-notice">
134 - <div class="tutor-offer-notice-wrapper">
135 - <div class="tutor-offer-notice-left">
136 - <div data-subheader><?php esc_html_e( '4.0 launch offer', 'tutor' ); ?></div>
137 - <div data-header><?php esc_html_e( '30% OFF', 'tutor' ); ?></div>
138 - <div data-subtext><?php esc_html_e( 'on all annual plans', 'tutor' ); ?></div>
139 - </div>
140 - <div class="tutor-offer-notice-right">
141 - <div class="tutor-offer-notice-text"><?php esc_html_e( 'Offer ends by', 'tutor' ); ?> <span class="tutor-offer-notice-timer" data-expiry="<?php echo esc_attr( $expiration->getTimestamp() ); ?>"><?php echo esc_html( $expire_in ); ?></span></div>
142 - <a class="tutor-offer-notice-cta" href="<?php echo esc_url( $cta_link ); ?>" target="_blank">
143 - <?php echo esc_html( $cta_label ); ?>
144 - <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="#fff" d="M13.938 6.937a.55.55 0 0 0-.786 0 .555.555 0 0 0 0 .778l3.338 3.34H5.243a.55.55 0 0 0-.55.551c0 .305.242.558.55.558h11.246l-3.337 3.334a.563.563 0 0 0 0 .785.55.55 0 0 0 .786 0L18.217 12a.543.543 0 0 0 0-.78z"/></svg>
145 - </a>
146 - </div>
147 - </div>
148 - <button type="button" class="tutor-offer-notice-dismiss"><span class="tutor-icon-times"></span></button>
149 - </div>
150 - <?php
151 - }
152 - }
153 -
154 - /**
155 - * Dismiss offer notice.
156 - *
157 - * @since 4.0.0
158 - *
159 - * @return void JSON response.
160 - */
161 - public function ajax_dismiss_offer_notice() {
162 - if ( ! User::is_admin() ) {
163 - $this->response_bad_request( tutor_utils()->error_message() );
164 - }
165 -
166 - if ( self::is_offer_notice_dismissed() ) {
167 - $this->response_bad_request( __( 'You have already dismissed the offer notice.', 'tutor' ) );
168 - }
169 -
170 - // Set expiry until next day.
171 - $expiration = strtotime( 'tomorrow' ) - time();
172 - set_transient( 'tutor_offer_notice_dismissed', '4.0.0', $expiration );
173 - $this->json_response( __( 'Notice dismissed', 'tutor' ) );
174 - }
175 -
176 - /**
177 - * Show unstable version notice.
178 - *
179 - * @since 3.0.0
180 - *
181 - * @return void
182 - */
183 - public function show_unstable_version_admin_notice() {
184 - $version = tutor_utils()->extract_version_details( TUTOR_VERSION );
185 - if ( ! $version->is_stable ) {
186 - /* translators: %s: version name */
187 - $message = sprintf( __( 'You\'re currently using Tutor LMS %s. To ensure stability, please do not use it on a live site.', 'tutor' ), '<strong>' . $version->version . '</strong>' );
188 - ?>
189 - <div class="notice notice-warning">
190 - <p><strong><?php esc_html_e( 'Warning!', 'tutor' ); ?></strong></p>
191 - <p><?php echo wp_kses_post( $message ); ?></p>
192 - </div>
193 - <?php
194 - }
195 - }
196 -
197 - /**
198 - * Register admin menus
199 - *
200 - * @since 1.0.0
201 - * @since 3.8.0 re-organize admin menu.
202 - *
203 - * @return void
204 - */
205 - public function register_menu() {
206 - $has_pro = tutor()->has_pro;
207 -
208 39 $unanswered_questions = tutor_utils()->unanswered_question_count();
209 - $unanswered_bubble = '';
210 - if ( $unanswered_questions ) {
211 - $unanswered_bubble = '<span class="update-plugins count-' . $unanswered_questions . '"><span class="plugin-count">' . $unanswered_questions . '</span></span>';
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>';
212 43 }
213 44
214 45 $course_post_type = tutor()->course_post_type;
215 46
216 47 $pro_text = '';
217 - if ( $has_pro ) {
218 - $pro_text = ' ' . apply_filters( 'tutor_pro_flag', __( 'Pro', 'tutor' ) );
48 + if ($hasPro){
49 + $pro_text = ' '.__('Pro', 'tutor');
219 50 }
220 51
221 - $enable_course_marketplace = (bool) tutor_utils()->get_option( 'enable_course_marketplace' );
52 + $enable_course_marketplace = (bool) tutils()->get_option('enable_course_marketplace');
222 53
223 - $welcome = Tutor_Setup::is_welcome_page_visited();
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 );
224 57
225 - $root_page = array( $this, 'tutor_course_list' );
226 - if ( false === $welcome && Input::has( 'page' ) && 'tutor' === Input::get( 'page' ) && Input::has( 'welcome' ) ) {
227 - $root_page = array( $this, 'welcome_page' );
228 - }
58 + add_submenu_page('tutor', __('Tags', 'tutor'), __('Tags', 'tutor'), 'manage_tutor', 'edit-tags.php?taxonomy=course-tag&post_type='.$course_post_type, null );
229 59
230 - $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>' );
231 - $menu_position = 2;
60 + add_submenu_page('tutor', __('Students', 'tutor'), __('Students', 'tutor'), 'manage_tutor', 'tutor-students', array($this, 'tutor_students') );
232 61
233 - add_menu_page(
234 - __( 'Tutor LMS', 'tutor' ) . $pro_text,
235 - __( 'Tutor LMS', 'tutor' ) . $pro_text,
236 - 'manage_tutor_instructor',
237 - 'tutor',
238 - $root_page,
239 - $icon_base64_uri,
240 - $menu_position
241 - );
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'));
242 67
243 - new WhatsNew();
68 + add_submenu_page('tutor', __('Q & A', 'tutor'), __('Q & A '.$unanswered_bubble, 'tutor'), 'manage_tutor_instructor', Question_Answers_List::Question_Answer_PAGE, array($this, 'question_answer') );
244 69
245 - $admin_menu = apply_filters(
246 - 'tutor_admin_menu',
247 - array(
248 - 'group_one' => array(
249 - 'courses' => array(
250 - 'parent_slug' => 'tutor',
251 - 'page_title' => __( 'Courses', 'tutor' ),
252 - 'menu_title' => __( 'Courses', 'tutor' ),
253 - 'capability' => 'manage_tutor_instructor',
254 - 'menu_slug' => 'tutor',
255 - 'callback' => array( $this, 'tutor_course_list' ),
256 - ),
257 - 'content_bank' => null,
258 - 'course_builder' => array(
259 - 'parent_slug' => 'tutor',
260 - 'page_title' => __( 'Course Builder', 'tutor' ),
261 - 'menu_title' => '<span class="tutor-create-course">Create Course</span>',
262 - 'capability' => 'manage_tutor_instructor',
263 - 'menu_slug' => 'create-course',
264 - 'callback' => array( new Course( false ), 'load_course_builder' ),
265 - ),
266 - 'categories' => array(
267 - 'parent_slug' => 'tutor',
268 - 'page_title' => __( 'Categories', 'tutor' ),
269 - 'menu_title' => __( 'Categories', 'tutor' ),
270 - 'capability' => 'manage_tutor',
271 - 'menu_slug' => 'edit-tags.php?taxonomy=course-category&post_type=' . $course_post_type,
272 - ),
273 - 'tags' => array(
274 - 'parent_slug' => 'tutor',
275 - 'page_title' => __( 'Tags', 'tutor' ),
276 - 'menu_title' => __( 'Tags', 'tutor' ),
277 - 'capability' => 'manage_tutor',
278 - 'menu_slug' => 'edit-tags.php?taxonomy=course-tag&post_type=' . $course_post_type,
279 - ),
280 - ),
281 - 'group_two' => array(
282 - 'orders' => null,
283 - 'subscriptions' => null,
284 - 'coupons' => null,
285 - 'students' => array(
286 - 'parent_slug' => 'tutor',
287 - 'page_title' => __( 'Students', 'tutor' ),
288 - 'menu_title' => __( 'Students', 'tutor' ),
289 - 'capability' => 'manage_tutor',
290 - 'menu_slug' => Students_List::STUDENTS_LIST_PAGE,
291 - 'callback' => array( $this, 'tutor_students' ),
70 + add_submenu_page('tutor', __('Quiz Attempts', 'tutor'), __('Quiz Attempts', 'tutor'), 'manage_tutor_instructor', Quiz_Attempts_List::QUIZ_ATTEMPT_PAGE, array($this, 'quiz_attempts') );
292 71
293 - ),
294 - 'announcements' => array(
295 - 'parent_slug' => 'tutor',
296 - 'page_title' => __( 'Announcements', 'tutor' ),
297 - 'menu_title' => __( 'Announcements', 'tutor' ),
298 - 'capability' => 'manage_tutor_instructor',
299 - 'menu_slug' => 'tutor_announcements',
300 - 'callback' => array( $this, 'tutor_announcements' ),
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 + }
301 75
302 - ),
303 - 'assignments' => null,
304 - 'quiz_attempts' => array(
305 - 'parent_slug' => 'tutor',
306 - 'page_title' => __( 'Quiz Attempts', 'tutor' ),
307 - 'menu_title' => __( 'Quiz Attempts', 'tutor' ),
308 - 'capability' => 'manage_tutor_instructor',
309 - 'menu_slug' => Quiz_Attempts_List::QUIZ_ATTEMPT_PAGE,
310 - 'callback' => array( $this, 'quiz_attempts' ),
311 - ),
312 - 'q_and_a' => array(
313 - 'parent_slug' => 'tutor',
314 - 'page_title' => __( 'Q&A', 'tutor' ),
315 - 'menu_title' => __( 'Q&A ', 'tutor' ) . $unanswered_bubble,
316 - 'capability' => 'manage_tutor_instructor',
317 - 'menu_slug' => Question_Answers_List::QUESTION_ANSWER_PAGE,
318 - 'callback' => array( $this, 'question_answer' ),
319 - ),
320 - 'enrollments' => null,
321 - 'reports' => null,
322 - 'gradebook' => null,
323 - 'instructors' => $enable_course_marketplace ? array(
324 - 'parent_slug' => 'tutor',
325 - 'page_title' => __( 'Instructors', 'tutor' ),
326 - 'menu_title' => __( 'Instructors', 'tutor' ),
327 - 'capability' => 'manage_tutor',
328 - 'menu_slug' => Instructors_List::INSTRUCTOR_LIST_PAGE,
329 - 'callback' => array( $this, 'tutor_instructors' ),
330 - ) : null,
331 - 'withdraw_requests' => $enable_course_marketplace ? array(
332 - 'parent_slug' => 'tutor',
333 - 'page_title' => __( 'Withdraw Requests', 'tutor' ),
334 - 'menu_title' => __( 'Withdraw Requests', 'tutor' ),
335 - 'capability' => 'manage_tutor',
336 - 'menu_slug' => Withdraw_Requests_List::WITHDRAW_REQUEST_LIST_PAGE,
337 - 'callback' => array( $this, 'withdraw_requests' ),
338 - ) : null,
339 - ),
340 - 'group_three' => array(
341 - 'google_classroom' => null,
342 - 'zoom' => null,
343 - 'google_meet' => null,
344 - 'h5p' => null,
345 - 'addons' => array(
346 - 'parent_slug' => 'tutor',
347 - 'page_title' => __( 'Addons', 'tutor' ),
348 - 'menu_title' => __( 'Addons', 'tutor' ),
349 - 'capability' => 'manage_tutor',
350 - 'menu_slug' => 'tutor-addons',
351 - 'callback' => array( $this, 'enable_disable_addons' ),
352 - ),
353 - 'tools' => array(
354 - 'parent_slug' => 'tutor',
355 - 'page_title' => __( 'Tools', 'tutor' ),
356 - 'menu_title' => __( 'Tools', 'tutor' ),
357 - 'capability' => 'manage_tutor',
358 - 'menu_slug' => 'tutor-tools',
359 - 'callback' => array( new Tools_V2(), 'load_tools_page' ),
360 - ),
361 - 'settings' => array(
362 - 'parent_slug' => 'tutor',
363 - 'page_title' => __( 'Settings', 'tutor' ),
364 - 'menu_title' => __( 'Settings', 'tutor' ),
365 - 'capability' => 'manage_tutor',
366 - 'menu_slug' => 'tutor_settings',
367 - 'callback' => array( new Options_V2(), 'load_settings_page' ),
368 - ),
369 - 'license' => null,
370 - 'whats_new' => null,
371 - 'upgrade_to_pro' => $has_pro ? null : array(
372 - 'parent_slug' => 'tutor',
373 - 'page_title' => __( 'Upgrade to Pro', 'tutor' ),
374 - 'menu_title' => sprintf( '<span class="tutor-get-pro-text">%s</span>', __( 'Upgrade to Pro', 'tutor' ) ),
375 - 'capability' => 'manage_options',
376 - 'menu_slug' => 'tutor-get-pro',
377 - 'callback' => array( $this, 'tutor_get_pro' ),
378 - ),
379 - ),
380 - )
381 - );
76 + add_submenu_page( 'tutor', __( 'Add-ons', 'tutor' ), __( 'Add-ons', 'tutor' ), 'manage_tutor', 'tutor-addons', array( $this, 'enable_disable_addons' ) );
382 77
383 - foreach ( $admin_menu as $group => $menu ) {
384 - foreach ( $menu as $name => $args ) {
385 - if ( empty( $args ) ) {
386 - continue;
387 - }
78 + do_action('tutor_admin_register');
388 79
389 - // Backward compatibility hook.
390 - if ( 'addons' === $name ) {
391 - do_action( 'tutor_admin_register' );
392 - }
80 + add_submenu_page('tutor', __('Settings', 'tutor'), __('Settings', 'tutor'), 'manage_tutor', 'tutor_settings', array($this, 'tutor_page') );
393 81
394 - // Backward compatibility hook.
395 - do_action( "tutor_before_{$name}_admin_menu" );
82 + add_submenu_page('tutor', __('Tools', 'tutor'), __('Tools', 'tutor'), 'manage_tutor', 'tutor-tools', array($this, 'tutor_tools') );
396 83
397 - do_action( "tutor_before_{$name}_menu" );
398 - add_submenu_page( $args['parent_slug'], $args['page_title'], $args['menu_title'], $args['capability'], $args['menu_slug'], $args['callback'] ?? '', $args['position'] ?? null );
399 -
400 - // Backward compatibility hook.
401 - do_action( "tutor_after_{$name}_menu" );
402 -
403 - do_action( "tutor_after_{$name}_admin_menu" );
404 - }
405 -
406 - if ( 'group_three' !== $group ) {
407 - if ( 'group_two' === $group && ! current_user_can( 'manage_options' ) ) {
408 - continue;
409 - }
410 -
411 - add_submenu_page( 'tutor', '', '<span class="tutor-admin-menu-separator"></span>', 'manage_tutor_instructor', '#' );
412 - }
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') );
413 86 }
414 87 }
415 88
416 - /**
417 - * Welcome page opt-out
418 - *
419 - * @since 3.0.0
420 - */
421 - public function handle_do_not_show_feature_page() {
422 - tutor_utils()->check_nonce();
423 -
424 - if ( ! User::is_admin() ) {
425 - $this->json_response(
426 - tutor_utils()->error_message(),
427 - null,
428 - HttpHelper::STATUS_BAD_REQUEST
429 - );
430 - }
431 -
432 - update_option( 'tutor-new-feature', '3.0.0' );
433 - $this->json_response( __( 'Success', 'tutor' ) );
89 + public function tutor_page(){
90 + $tutor_option = new Options();
91 + echo apply_filters('tutor/options/generated-html', $tutor_option->generate());
434 92 }
435 93
436 - /**
437 - * Show Feature Promotion Page for Free User.
438 - *
439 - * @since 2.2.0
440 - *
441 - * @return void
442 - */
443 - public function feature_promotion_page() {
444 - include tutor()->path . 'views/pages/welcome.php';
94 + public function tutor_students(){
95 + include tutor()->path.'views/pages/students.php';
445 96 }
446 97
447 - /**
448 - * Show students page
449 - *
450 - * @since 1.0.0
451 - *
452 - * @return void
453 - */
454 - public function tutor_students() {
455 - include tutor()->path . 'views/pages/students.php';
98 + public function tutor_instructors(){
99 + include tutor()->path.'views/pages/instructors.php';
456 100 }
457 101
458 - /**
459 - * Show instructor page
460 - *
461 - * @since 1.0.0
462 - *
463 - * @return void
464 - */
465 - public function tutor_instructors() {
466 - include tutor()->path . 'views/pages/instructors.php';
102 + public function tutor_announcements(){
103 + include tutor()->path.'views/pages/announcements.php';
467 104 }
468 105
469 - /**
470 - * Show announcements page
471 - *
472 - * @since 1.0.0
473 - *
474 - * @return void
475 - */
476 - public function tutor_announcements() {
477 - include tutor()->path . 'views/pages/announcements.php';
106 + public function question_answer(){
107 + include tutor()->path.'views/pages/question_answer.php';
478 108 }
479 109
480 - /**
481 - * Show Q&A page
482 - *
483 - * @since 1.0.0
484 - *
485 - * @return void
486 - */
487 - public function question_answer() {
488 - include tutor()->path . 'views/pages/question_answer.php';
110 + public function quiz_attempts(){
111 + include tutor()->path.'views/pages/quiz_attempts.php';
489 112 }
490 113
491 114 /**
492 - * Show quiz attempts page
115 + * Show the withdraw requests table
493 116 *
494 - * @since 1.0.0
495 - *
496 - * @return void
117 + * @since v.1.2.0
497 118 */
498 - public function quiz_attempts() {
499 - include tutor()->path . 'views/pages/quiz_attempts.php';
119 + public function withdraw_requests(){
120 + include tutor()->path.'views/pages/withdraw_requests.php';
500 121 }
501 122
502 - /**
503 - * Show the withdraw requests table
504 - *
505 - * @since 1.2.0
506 - *
507 - * @return void
508 - */
509 - public function withdraw_requests() {
510 - include tutor()->path . 'views/pages/withdraw_requests.php';
511 - }
123 + public function enable_disable_addons(){
512 124
513 - /**
514 - * Enable or disable addons
515 - *
516 - * @since 1.0.0
517 - *
518 - * @return void
519 - */
520 - public function enable_disable_addons() {
521 - include tutor()->path . 'views/pages/enable_disable_addons.php';
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 + }
522 130 }
523 131
524 - /**
525 - * Tutor tools page (OLD)
526 - *
527 - * @since 1.0.0
528 - *
529 - * @return void
530 - */
531 - public function tutor_tools_old() {
532 - $tutor_admin_tools_page = Input::get( 'tutor_admin_tools_page' );
533 - if ( $tutor_admin_tools_page ) {
534 - include apply_filters( 'tutor_admin_tools_page', tutor()->path . "views/pages/{$tutor_admin_tools_page}.php", $tutor_admin_tools_page );
535 - } else {
536 - $pages = apply_filters(
537 - 'tutor_tool_pages',
538 - array(
539 - 'tutor_pages' => array( 'title' => __( 'Tutor Pages', 'tutor' ) ),
540 - 'status' => __( 'Status', 'tutor' ),
541 - )
542 - );
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 + ));
543 141
544 - $current_page = 'tutor_pages';
545 - $requested_page = Input::get( 'sub_page' );
546 - if ( $requested_page ) {
142 + $current_page = 'tutor_pages';
143 + $requested_page = sanitize_text_field(tutils()->array_get('sub_page', $_GET));
144 + if ($requested_page){
547 145 $current_page = $requested_page;
548 146 }
549 147
550 - $current_page = str_replace( '/', '', $current_page );
551 - $current_page = str_replace( '.', '', $current_page );
552 - $current_page = str_replace( '\\', '', $current_page );
553 - $current_page = trim( $current_page );
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);
554 152
555 - include tutor()->path . 'views/pages/tools.php';
153 + include tutor()->path.'views/pages/tools.php';
556 154 }
557 155 }
558 156
559 - /**
560 - * Show pro upgrade page
561 - *
562 - * @since 1.0.0
563 - *
564 - * @return void
565 - */
566 - public function tutor_get_pro() {
567 - include tutor()->path . 'views/pages/get-pro.php';
157 + public function tutor_get_pro(){
158 + include tutor()->path.'views/pages/get-pro.php';
568 159 }
569 160
570 - /**
571 - * Parent menu active
572 - *
573 - * @since 1.0.0
574 - *
575 - * @param string $parent_file parent file.
576 - *
577 - * @return string
578 - */
579 - public function parent_menu_active( $parent_file ) {
580 - $taxonomy = Input::get( 'taxonomy' );
581 - if ( CourseModel::COURSE_CATEGORY === $taxonomy || CourseModel::COURSE_TAG === $taxonomy ) {
161 + public function parent_menu_active( $parent_file ){
162 + $taxonomy = tutor_utils()->avalue_dot('taxonomy', $_GET);
163 + if ($taxonomy === 'course-category' || $taxonomy === 'course-tag'){
582 164 return 'tutor';
583 165 }
584 166
585 167 return $parent_file;
@@ -584,77 +166,52 @@
584 166
585 167 return $parent_file;
586 168 }
587 169
588 - /**
589 - * Sub-menu active
590 - *
591 - * @since 1.0.0
592 - *
593 - * @param string $submenu_file submenu file.
594 - * @param string $parent_file parent file.
595 - *
596 - * @return string
597 - */
598 - public function submenu_file_active( $submenu_file, $parent_file ) {
599 - $taxonomy = Input::get( 'taxonomy' );
170 + public function submenu_file_active($submenu_file, $parent_file){
171 + $taxonomy = tutor_utils()->avalue_dot('taxonomy', $_GET);
600 172 $course_post_type = tutor()->course_post_type;
601 173
602 - if ( CourseModel::COURSE_CATEGORY === $taxonomy ) {
603 - return 'edit-tags.php?taxonomy=course-category&post_type=' . $course_post_type;
174 + if ($taxonomy === 'course-category'){
175 + return 'edit-tags.php?taxonomy=course-category&post_type='.$course_post_type;
604 176 }
605 - if ( CourseModel::COURSE_TAG === $taxonomy ) {
606 - return 'edit-tags.php?taxonomy=course-tag&post_type=' . $course_post_type;
177 + if ($taxonomy === 'course-tag'){
178 + return 'edit-tags.php?taxonomy=course-tag&post_type='.$course_post_type;
607 179 }
608 180
181 +
609 182 return $submenu_file;
610 183 }
611 184
612 185 /**
613 186 * Filter posts for instructor
614 - *
615 - * @since 1.0.0
616 - *
617 - * @return void
618 187 */
619 - public function filter_posts_for_instructors() {
620 - if ( ! current_user_can( 'administrator' ) && current_user_can( tutor()->instructor_role ) ) {
621 - @remove_menu_page( 'edit-comments.php' ); // Comments.
622 - add_filter( 'posts_clauses_request', array( $this, 'posts_clauses_request' ) );
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') );
623 192 }
624 193 }
625 194
626 - /**
627 - * Request for posts clauses
628 - *
629 - * @since 1.0.0
630 - *
631 - * @param mixed $clauses clauses.
632 - *
633 - * @return mixed
634 - */
635 - public function posts_clauses_request( $clauses ) {
636 -
637 - if ( ! is_admin() || ( ! Input::has( 'post_type' ) || Input::get( 'post_type' ) != tutor()->course_post_type ) || tutor_utils()->has_user_role( array( 'administrator', 'editor' ) ) ) {
195 + public function posts_clauses_request($clauses){
196 +
197 + if(tutor_utils()->has_user_role(array('administrator', 'editor'))) {
638 198 return $clauses;
639 199 }
640 200
641 - // Need multi instructor check.
201 + // Need multi instructor check
642 202 global $wpdb;
643 203
644 204 $user_id = get_current_user_id();
645 205
646 - $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 ) );
647 - $own_courses = is_array( $get_assigned_courses_ids ) ? $get_assigned_courses_ids : array();
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 + $in_query_pre = implode(',', $own_courses);
648 209
649 - $in_query_pre = count( $own_courses ) ? implode( ',', $own_courses ) : null;
650 - $in_query_where = $in_query_pre ? " OR {$wpdb->posts}.ID IN({$in_query_pre})" : '';
651 -
652 - $course_post_type = tutor()->course_post_type;
653 - $custom_author_query = " AND ({$wpdb->posts}.post_type!='{$course_post_type}' OR {$wpdb->posts}.post_author = {$user_id}) {$in_query_where}";
654 -
210 + $custom_author_query = " AND ({$wpdb->posts}.post_type!='courses' OR {$wpdb->posts}.post_author = {$user_id} OR {$wpdb->posts}.ID IN({$in_query_pre})) ";
211 +
655 212 $clauses['where'] .= $custom_author_query;
656 -
213 +
657 214 return $clauses;
658 215 }
659 216
660 217 /**
@@ -659,59 +216,48 @@
659 216
660 217 /**
661 218 * Prevent unauthorised course/lesson edit page by direct URL
662 219 *
663 - * @since 1.0.0
664 - *
665 - * @return void
220 + * @since v.1.0.0
666 221 */
667 - public function check_if_current_users_post() {
668 - if ( current_user_can( 'administrator' ) || ! current_user_can( tutor()->instructor_role ) ) {
222 + public function check_if_current_users_post(){
223 + if (current_user_can('administrator') || ! current_user_can(tutor()->instructor_role)) {
669 224 return;
670 225 }
671 226
672 - if ( ! empty( Input::get( 'post' ) ) ) {
673 - $get_post_id = Input::get( 'post', Input::TYPE_INT );
674 - $get_post = get_post( $get_post_id );
675 - $tutor_post_types = array( tutor()->course_post_type, tutor()->lesson_post_type );
227 + if (! empty($_GET['post']) ) {
228 + $get_post_id = (int) sanitize_text_field($_GET['post']);
229 + $get_post = get_post($get_post_id);
230 + $tutor_post_types = array(tutor()->course_post_type, tutor()->lesson_post_type);
676 231
677 232 $current_user = get_current_user_id();
678 233
679 - if ( in_array( $get_post->post_type, $tutor_post_types ) && $get_post->post_author != $current_user ) {
234 + if (in_array($get_post->post_type, $tutor_post_types) && $get_post->post_author != $current_user){
680 235 global $wpdb;
681 236
682 - $get_assigned_courses_ids = (int) $wpdb->get_var(
683 - $wpdb->prepare(
684 - "SELECT user_id
685 - from {$wpdb->usermeta}
686 - WHERE user_id = %d AND meta_key = '_tutor_instructor_course_id' AND meta_value = %d ",
687 - $current_user,
688 - $get_post_id
689 - )
690 - );
237 + $get_assigned_courses_ids = (int) $wpdb->get_var($wpdb->prepare(
238 + "SELECT user_id
239 + from {$wpdb->usermeta}
240 + WHERE user_id = %d AND meta_key = '_tutor_instructor_course_id' AND meta_value = %d ", $current_user, $get_post_id));
691 241
692 - if ( ! $get_assigned_courses_ids ) {
693 - wp_die( esc_html__( 'Permission Denied', 'tutor' ) );
242 + if ( ! $get_assigned_courses_ids){
243 + wp_die(__('Permission Denied', 'tutor'));
694 244 }
245 +
695 246 }
696 247 }
697 248 }
698 249
699 250 /**
700 - * Scan template files
701 - *
702 - * @since 1.0.0
703 - *
704 - * @param string $template_path template file path.
705 - *
706 - * @return array
251 + * Status
707 252 */
253 +
708 254 public static function scan_template_files( $template_path = null ) {
709 - if ( ! $template_path ) {
710 - $template_path = tutor()->path . 'templates/';
255 + if ( ! $template_path){
256 + $template_path = tutor()->path.'templates/';
711 257 }
712 258
713 - $files = @scandir($template_path); // @codingStandardsIgnoreLine.
259 + $files = @scandir( $template_path ); // @codingStandardsIgnoreLine.
714 260 $result = array();
715 261
716 262 if ( ! empty( $files ) ) {
717 263 foreach ( $files as $key => $value ) {
@@ -730,28 +276,26 @@
730 276 return $result;
731 277 }
732 278
733 279 /**
734 - * Get Template overridden files
280 + * @return array
735 281 *
736 - * @since 1.0.0
737 282 *
738 - * @return array
739 283 */
740 - public static function template_overridden_files() {
284 + public static function template_overridden_files(){
741 285 $template_files = self::scan_template_files();
742 286
743 287 $override_files = array();
744 - foreach ( $template_files as $file ) {
288 + foreach ($template_files as $file){
745 289 $file_path = null;
746 - if ( file_exists( trailingslashit( get_stylesheet_directory() ) . tutor()->template_path . $file ) ) {
290 + if (file_exists(trailingslashit(get_stylesheet_directory()).tutor()->template_path.$file)){
747 291 $file_path = $file;
748 - } elseif ( file_exists( trailingslashit( get_template_directory() ) . tutor()->template_path . $file ) ) {
292 + }elseif (file_exists(trailingslashit(get_template_directory()).tutor()->template_path.$file)){
749 293 $file_path = $file;
750 294 }
751 295
752 - if ( $file_path ) {
753 - $override_files[] = str_replace( WP_CONTENT_DIR . '/themes/', '', $file_path );
296 + if ($file_path){
297 + $override_files[] = str_replace( WP_CONTENT_DIR.'/themes/', '', $file_path );
754 298 }
755 299 }
756 300
757 301 return $override_files;
@@ -756,233 +300,202 @@
756 300
757 301 return $override_files;
758 302 }
759 303
760 - /**
761 - * Plugin activation link
762 - *
763 - * @since 1.0.0
764 - *
765 - * @param array $actions action list.
766 - *
767 - * @return array
768 - */
769 - public function plugin_action_links( $actions ) {
770 - $has_pro = tutor()->has_pro;
304 + public static function get_environment_info(){
771 305
772 - if ( ! $has_pro ) {
773 - $actions['tutor_pro_link'] =
774 - '<a href="https://tutorlms.com/pricing?utm_source=tutor_plugin_action_link&utm_medium=wordpress_dashboard&utm_campaign=go_premium" target="_blank">
775 - <span style="color: #ff7742; font-weight: bold;">' .
776 - __( 'Upgrade to Pro', 'tutor' ) .
777 - '</span>
778 - </a>';
306 + // Figure out cURL version, if installed.
307 + $curl_version = '';
308 + if ( function_exists( 'curl_version' ) ) {
309 + $curl_version = curl_version();
310 + $curl_version = $curl_version['version'] . ', ' . $curl_version['ssl_version'];
779 311 }
780 312
781 - $actions['settings'] = '<a href="admin.php?page=tutor_settings">' . __( 'Settings', 'tutor' ) . '</a>';
782 313
783 - return $actions;
314 + // WP memory limit.
315 + $wp_memory_limit = tutor_utils()->let_to_num(WP_MEMORY_LIMIT);
316 + if ( function_exists( 'memory_get_usage' ) ) {
317 + $wp_memory_limit = max( $wp_memory_limit, tutor_utils()->let_to_num( @ini_get( 'memory_limit' ) ) );
318 + }
319 +
320 + $database_version = tutor_utils()->get_db_version();
321 +
322 + return array(
323 + 'home_url' => get_option( 'home' ),
324 + 'site_url' => get_option( 'siteurl' ),
325 + 'version' => tutor()->version,
326 + 'wp_version' => get_bloginfo( 'version' ),
327 + 'wp_multisite' => is_multisite(),
328 + 'wp_memory_limit' => $wp_memory_limit,
329 + 'wp_debug_mode' => ( defined( 'WP_DEBUG' ) && WP_DEBUG ),
330 + 'wp_cron' => ! ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ),
331 + 'language' => get_locale(),
332 + 'external_object_cache' => wp_using_ext_object_cache(),
333 + 'server_info' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) : '',
334 + 'php_version' => phpversion(),
335 + 'php_post_max_size' => tutor_utils()->let_to_num( ini_get( 'post_max_size' ) ),
336 + 'php_max_execution_time' => ini_get( 'max_execution_time' ),
337 + 'php_max_input_vars' => ini_get( 'max_input_vars' ),
338 + 'curl_version' => $curl_version,
339 + 'suhosin_installed' => extension_loaded( 'suhosin' ),
340 + 'max_upload_size' => wp_max_upload_size(),
341 + 'mysql_version' => $database_version['number'],
342 + 'mysql_version_string' => $database_version['string'],
343 + 'default_timezone' => date_default_timezone_get(),
344 + 'fsockopen_or_curl_enabled' => ( function_exists( 'fsockopen' ) || function_exists( 'curl_init' ) ),
345 + 'soapclient_enabled' => class_exists( 'SoapClient' ),
346 + 'domdocument_enabled' => class_exists( 'DOMDocument' ),
347 + 'gzip_enabled' => is_callable( 'gzopen' ),
348 + 'mbstring_enabled' => extension_loaded( 'mbstring' ),
349 + );
784 350 }
785 351
786 - /**
787 - * Add plugin meta data in WP plugins list page
788 - *
789 - * @since 1.0.0
790 - *
791 - * @param array $plugin_meta plugin meta data.
792 - * @param string $plugin_file plugin file.
793 - *
794 - * @return array
795 - */
796 - public function plugin_row_meta( $plugin_meta, $plugin_file ) {
797 352
798 - if ( tutor()->basename === $plugin_file ) {
799 - $plugin_meta[] = sprintf(
800 - '<a href="%s"><strong style="color: #03bd24">%s</strong></a>',
801 - esc_url( 'https://tutorlms.com/docs/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_docs_link' ),
802 - esc_html__( 'Documentation', 'tutor' )
803 - );
804 - $plugin_meta[] = sprintf(
805 - '<a href="%s"><strong style="color: #03bd24">%s</strong></a>',
806 - esc_url( 'https://tutorlms.com/support/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_support_link' ),
807 - esc_html__( 'Get Support', 'tutor' )
808 - );
809 - }
353 + public function erase_tutor_data(){
354 + global $wpdb;
810 355
811 - return $plugin_meta;
812 - }
356 + $is_erase_data = tutor_utils()->get_option('delete_on_uninstall');
357 + //=> Deleting Data
813 358
814 - /**
815 - * Add footer text only on tutor pages
816 - *
817 - * @since 1.0.0
818 - *
819 - * @param string $footer_text footer text.
820 - *
821 - * @return string
822 - */
823 - public function admin_footer_text( $footer_text ) {
824 - $current_screen = get_current_screen();
359 + $plugin_file = tutor()->basename;
360 + if ($is_erase_data && current_user_can( 'deactivate_plugin', $plugin_file )) {
361 + /**
362 + * Deleting Post Type, Meta Data, taxonomy
363 + */
364 + $course_post_type = tutor()->course_post_type;
365 + $lesson_post_type = tutor()->lesson_post_type;
825 366
826 - /**
827 - * We are making sure that this message will be only on Tutor Admin page
828 - */
829 - if ( apply_filters( 'tutor_display_admin_footer_text', ( tutor_utils()->array_get( 'parent_base', $current_screen ) === 'tutor' ) ) ) {
830 - $footer_text = sprintf(
831 - /* translators: %s: plugin name */
832 - __( 'If you like %1$s please leave us a %2$s rating. A huge thanks in advance!', 'tutor' ),
833 - sprintf( '<strong>%s</strong>', esc_html__( 'Tutor LMS', 'tutor' ) ),
834 - '<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>'
367 + $post_types = array(
368 + $course_post_type,
369 + $lesson_post_type,
370 + 'tutor_quiz',
371 + 'tutor_enrolled',
372 + 'topics',
373 + 'tutor_enrolled',
374 + 'tutor_announcements',
835 375 );
836 - }
837 376
838 - return $footer_text;
839 - }
377 + $post_type_strings = "'".implode("','", $post_types)."'";
378 + $tutor_posts = $wpdb->get_col("SELECT ID from {$wpdb->posts} WHERE post_type in({$post_type_strings}) ;");
840 379
841 - /**
842 - * Register course widget
843 - *
844 - * @since 1.0.0
845 - * @return void
846 - */
847 - public function register_course_widget() {
848 - register_widget( Course_Widget::class );
849 - }
380 + if (is_array($tutor_posts) && count($tutor_posts)){
381 + foreach ($tutor_posts as $post_id){
382 + //Delete categories
383 + $terms = wp_get_object_terms( $post_id, 'course-category' );
384 + foreach( $terms as $term ){
385 + wp_remove_object_terms( $post_id, array( $term->term_id ), 'course-category' );
386 + }
850 387
851 - /**
852 - * Tutor Course List
853 - *
854 - * @since 2.0.0
855 - *
856 - * @return void
857 - */
858 - public function tutor_course_list() {
859 - include tutor()->path . 'views/pages/course-list.php';
860 - }
388 + //Delete tags if available
389 + $terms = wp_get_object_terms( $post_id, 'course-tag' );
390 + foreach( $terms as $term ){
391 + wp_remove_object_terms( $post_id, array( $term->term_id ), 'course-tag' );
392 + }
861 393
862 - /**
863 - * Orders view page
864 - *
865 - * @since 3.0.0
866 - *
867 - * @return void
868 - */
869 - public function orders_view() {
870 - $current_page = Input::get( 'page' );
871 - $action = Input::get( 'action' );
394 + //Delete All Meta
395 + $wpdb->delete($wpdb->postmeta, array('post_id' => $post_id) );
396 + $wpdb->delete($wpdb->posts, array('ID' => $post_id) );
397 + }
398 + }
872 399
873 - if ( OrderController::PAGE_SLUG === $current_page && 'edit' === $action ) {
874 - ?>
875 - <div class="tutor-admin-wrap tutor-order-details-wrapper">
876 - <div id="tutor-order-details-root">
877 - </div>
878 - </div>
879 - <?php
880 - return;
881 - }
400 + /**
401 + * Deleting Comments (reviews, questions, quiz_answers, etc)
402 + */
403 + $tutor_comments = $wpdb->get_col("SELECT comment_ID from {$wpdb->comments} WHERE comment_agent = 'comment_agent' ;");
404 + $comments_ids_strings = "'".implode("','", $tutor_comments)."'";
405 + if (is_array($tutor_comments) && count($tutor_comments)){
406 + $wpdb->query("DELETE from {$wpdb->commentmeta} WHERE comment_ID in({$comments_ids_strings}) ");
407 + }
408 + $wpdb->delete($wpdb->comments, array('comment_agent' => 'comment_agent'));
882 409
883 - include tutor()->path . 'views/pages/ecommerce/order-list.php';
884 - }
410 + /**
411 + * Delete Options
412 + */
885 413
886 - /**
887 - * Coupons view page
888 - *
889 - * @since 3.0.0
890 - *
891 - * @return void
892 - */
893 - public function coupons_view() {
894 - $action = Input::get( 'action' );
895 - if ( in_array( $action, array( 'add_new', 'edit' ) ) ) {
896 - ?>
897 - <div class="tutor-admin-wrap">
898 - <div id="tutor-coupon-root">
899 - </div>
900 - </div>
901 - <?php
902 - return;
414 + delete_option('tutor_option');
415 + $wpdb->delete($wpdb->usermeta, array('meta_key' => '_is_tutor_student'));
416 + $wpdb->delete($wpdb->usermeta, array('meta_key' => '_tutor_instructor_approved'));
417 + $wpdb->delete($wpdb->usermeta, array('meta_key' => '_tutor_instructor_status'));
418 + $wpdb->delete($wpdb->usermeta, array('meta_key' => '_is_tutor_instructor'));
419 + $wpdb->query("DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE '%_tutor_completed_lesson_id_%' ");
420 +
421 + //Deleting Table
422 + $prefix = $wpdb->prefix;
423 + $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 ");
424 +
425 + deactivate_plugins($plugin_file);
903 426 }
904 - include tutor()->path . 'views/pages/ecommerce/coupon-list.php';
427 +
428 + wp_redirect('plugins.php');
429 + die();
905 430 }
906 431
907 - /**
908 - * Show welcome page
909 - *
910 - * @since 1.0.0
911 - *
912 - * @return void
913 - */
914 - public function welcome_page() {
915 - Tutor_Setup::mark_as_visited();
916 - include tutor()->path . 'views/pages/welcome.php';
917 - exit;
918 - }
432 + public function plugin_action_links($actions){
433 + $hasPro = tutor()->has_pro;
919 434
920 - /**
921 - * Add toolbar items
922 - *
923 - * @since 1.4.6
924 - *
925 - * @param \WP_Admin_Bar $admin_bar admin bar object.
926 - *
927 - * @return mixed
928 - */
929 - public function add_toolbar_items( \WP_Admin_Bar $admin_bar ) {
930 - global $post;
435 + if(!$hasPro){
436 + $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
437 + style="color: #ff7742; font-weight: bold;">' . __('Upgrade to Pro', 'wp-megamenu') . '</span></a>';
438 + }
931 439
932 - $course_id = Input::get( 'post', 0, Input::TYPE_INT );
933 - $course_post_type = tutor()->course_post_type;
440 + $is_erase_data = tutor_utils()->get_option('delete_on_uninstall');
934 441
935 - if ( $admin_bar->get_node( 'new-courses' ) ) {
936 - $args = $admin_bar->get_node( 'new-courses' );
937 - $args->href = '#';
938 - $args->meta['class'] = 'tutor-create-new-course';
939 - $admin_bar->add_node( $args );
442 + if ($is_erase_data) {
443 + $plugin_file = tutor()->basename;
444 + if ( current_user_can( 'deactivate_plugin', $plugin_file ) ) {
445 + if ( isset( $actions['deactivate'] ) ) {
446 + $actions['deactivate'] = '<a href="admin.php?page=tutor-tools&tutor_admin_tools_page=uninstall">' . __('Uninstall', 'tutor') . '</a>';
447 + }
448 + }
940 449 }
941 450
942 - if ( ! tutor_utils()->can_user_edit_course( get_current_user_id(), $course_id ) ) {
943 - return $admin_bar;
944 - }
451 + $actions['settings'] = '<a href="admin.php?page=tutor_settings">' . __('Settings', 'tutor') . '</a>';
452 + return $actions;
453 + }
945 454
946 - if (
947 - ( is_admin() && $post && $course_id && $post->post_type === $course_post_type ) ||
948 - ( ! is_admin() && is_single() && $post && $course_post_type === $post->post_type )
949 - ) {
455 + public function plugin_row_meta($plugin_meta, $plugin_file){
950 456
951 - $admin_bar->add_menu(
952 - array(
953 - 'id' => 'edit',
954 - 'title' => __( 'Edit with Course Builder', 'tutor' ),
955 - 'href' => tutor_utils()->course_edit_link( $post->ID ),
956 - 'meta' => array(
957 - 'title' => __( 'Edit with Course Builder', 'tutor' ),
958 - 'target' => '_blank',
959 - ),
960 - )
457 + if ($plugin_file === tutor()->basename) {
458 + $plugin_meta[] = sprintf( '<a href="%s">%s</a>',
459 + esc_url( 'https://docs.themeum.com/tutor-lms/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_docs_link' ),
460 + __( '<strong style="color: #03bd24">Documentation</strong>', 'tutor' )
961 461 );
462 + $plugin_meta[] = sprintf( '<a href="%s">%s</a>',
463 + esc_url( 'https://www.themeum.com/contact-us/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_support_link' ),
464 + __( '<strong style="color: #03bd24">Get Support</strong>', 'tutor' )
465 + );
962 466 }
963 467
964 - return $admin_bar;
468 + return $plugin_meta;
965 469 }
966 470
967 471 /**
968 - * Redirect to welcome page if user is not logged in.
472 + * @param $footer_text
969 473 *
970 - * @since 4.0.0
474 + * @return string
971 475 *
972 - * @return void
476 + * Add footer text only on tutor pages
973 477 */
974 - public function redirect_to_welcome_page() {
975 - // Skip for fresh installs, during the setup wizard, or during AJAX.
976 - if ( ! get_option( 'tutor_wizard' ) || 'tutor-setup' === Input::get( 'page' ) || wp_doing_ajax() ) {
977 - return;
478 + public function admin_footer_text( $footer_text ) {
479 + $current_screen = get_current_screen();
480 +
481 + /**
482 + * We are making sure that this message will be only on Tutor Admin page
483 + */
484 + if ( apply_filters( 'tutor_display_admin_footer_text', (tutor_utils()->array_get('parent_base', $current_screen) === 'tutor' ) ) ) {
485 + $footer_text = sprintf(
486 + __( 'If you like %1$s please leave us a %2$s rating. A huge thanks in advance!', 'tutor' ),
487 + sprintf( '<strong>%s</strong>', esc_html__( 'Tutor LMS', 'tutor' ) ),
488 + '<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>'
489 + );
978 490 }
979 491
980 - $tutor_new_feature = get_option( 'tutor-new-feature' );
981 - if ( version_compare( $tutor_new_feature, '4.0.0-rc.2', '>=' ) ) {
982 - return;
983 - }
492 + return $footer_text;
493 + }
984 494
985 - wp_safe_redirect( admin_url( 'admin.php?page=tutor&welcome=1' ) );
986 - update_option( 'tutor-new-feature', TUTOR_VERSION );
495 +
496 + public function register_course_widget(){
497 + register_widget( 'Tutor\Course_Widget' );
987 498 }
988 -}
499 +
500 +
501 +}