PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.7.4
Tutor LMS – eLearning and online course solution v3.7.4
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 11 months ago Admin.php 11 months ago Ajax.php 1 year ago Announcements.php 1 year ago Assets.php 10 months ago Backend_Page_Trait.php 1 year ago BaseController.php 1 year ago Config.php 11 months ago Container.php 11 months ago Course.php 10 months ago Course_Embed.php 3 years ago Course_Filter.php 1 year ago Course_List.php 10 months ago Course_Settings_Tabs.php 1 year ago Course_Widget.php 1 year ago Custom_Validation.php 3 years ago Dashboard.php 1 year ago Earnings.php 1 year ago FormHandler.php 2 years ago Frontend.php 1 year ago Gutenberg.php 1 year ago Icon.php 10 months ago Input.php 1 year ago Instructor.php 1 year ago Instructors_List.php 11 months ago Lesson.php 10 months ago Options_V2.php 11 months ago Permalink.php 2 years ago Post_types.php 1 year ago Private_Course_Access.php 1 year ago Q_And_A.php 10 months ago Question_Answers_List.php 11 months ago Quiz.php 10 months ago QuizBuilder.php 11 months ago Quiz_Attempts_List.php 11 months ago RestAPI.php 2 years ago Reviews.php 11 months ago Rewrite_Rules.php 2 years ago Shortcode.php 1 year ago Singleton.php 1 year ago Student.php 1 year ago Students_List.php 1 year ago Taxonomies.php 1 year ago Template.php 11 months ago Theme_Compatibility.php 3 years ago Tools.php 1 year ago Tools_V2.php 1 year ago Tutor.php 10 months ago TutorEDD.php 1 year ago Tutor_Base.php 2 years ago Tutor_Setup.php 1 year ago Upgrader.php 10 months ago User.php 1 year ago Utils.php 10 months ago Video_Stream.php 3 years ago WhatsNew.php 2 years ago Withdraw.php 1 year ago Withdraw_Requests_List.php 11 months ago WooCommerce.php 1 year ago
Admin.php
721 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\Ecommerce\OrderController;
14 use Tutor\Helpers\HttpHelper;
15 use TUTOR\Input;
16 use Tutor\Models\CourseModel;
17 use Tutor\Traits\JsonResponse;
18
19 if ( ! defined( 'ABSPATH' ) ) {
20 exit;
21 }
22
23 /**
24 * Admin Class
25 *
26 * @since 1.0.0
27 */
28 class Admin {
29 use JsonResponse;
30
31 /**
32 * Constructor
33 *
34 * @since 1.0.0
35 * @return void
36 */
37 public function __construct() {
38
39 add_action( 'admin_notices', array( $this, 'show_unstable_version_admin_notice' ) );
40
41 add_action( 'admin_menu', array( $this, 'register_menu' ) );
42 // Force activate menu for necessary.
43 add_filter( 'parent_file', array( $this, 'parent_menu_active' ) );
44 add_filter( 'submenu_file', array( $this, 'submenu_file_active' ), 10, 2 );
45
46 add_action( 'admin_init', array( $this, 'filter_posts_for_instructors' ) );
47 add_action( 'load-post.php', array( $this, 'check_if_current_users_post' ) );
48
49 add_filter( 'plugin_action_links_' . plugin_basename( TUTOR_FILE ), array( $this, 'plugin_action_links' ) );
50
51 // Plugin Row Meta.
52 add_filter( 'plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 2 );
53
54 // Admin Footer Text.
55 add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ), 1 );
56 // Register Course Widget.
57 add_action( 'widgets_init', array( $this, 'register_course_widget' ) );
58
59 // Handle flash toast message for redirect_to util helper.
60 add_action( 'admin_head', array( new Utils(), 'handle_flash_message' ), 999 );
61 add_action( 'tutor_after_settings_menu', '\TUTOR\WhatsNew::whats_new_menu', 11 );
62
63 add_action( 'admin_bar_menu', array( $this, 'add_toolbar_items' ), 100 );
64
65 add_action( 'wp_ajax_tutor_do_not_show_feature_page', array( $this, 'handle_do_not_show_feature_page' ) );
66 }
67
68 /**
69 * Show unstable version notice.
70 *
71 * @since 3.0.0
72 *
73 * @return void
74 */
75 public function show_unstable_version_admin_notice() {
76 $version = tutor_utils()->extract_version_details( TUTOR_VERSION );
77 if ( ! $version->is_stable ) {
78 /* translators: %s: version name */
79 $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>' );
80 ?>
81 <div class="notice notice-warning">
82 <p><strong><?php esc_html_e( 'Warning!', 'tutor' ); ?></strong></p>
83 <p><?php echo wp_kses_post( $message ); ?></p>
84 </div>
85 <?php
86 }
87 }
88
89 /**
90 * Register admin menus
91 *
92 * @since 1.0.0
93 * @return void
94 */
95 public function register_menu() {
96 $has_pro = tutor()->has_pro;
97
98 $unanswered_questions = tutor_utils()->unanswered_question_count();
99 $unanswered_bubble = '';
100 if ( $unanswered_questions ) {
101 $unanswered_bubble = '<span class="update-plugins count-' . $unanswered_questions . '"><span class="plugin-count">' . $unanswered_questions . '</span></span>';
102 }
103
104 $course_post_type = tutor()->course_post_type;
105
106 $pro_text = '';
107 if ( $has_pro ) {
108 $pro_text = ' ' . apply_filters( 'tutor_pro_flag', __( 'Pro', 'tutor' ) );
109 }
110
111 $enable_course_marketplace = (bool) tutor_utils()->get_option( 'enable_course_marketplace' );
112
113 $welcome = Tutor_Setup::is_welcome_page_visited();
114
115 $root_page = array( $this, 'tutor_course_list' );
116 if ( false === $welcome && Input::has( 'page' ) && 'tutor' === Input::get( 'page' ) && Input::has( 'welcome' ) ) {
117 $root_page = array( $this, 'welcome_page' );
118 }
119
120 $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>' );
121 $menu_position = 2;
122
123 add_menu_page(
124 __( 'Tutor LMS', 'tutor' ) . $pro_text,
125 __( 'Tutor LMS', 'tutor' ) . $pro_text,
126 'manage_tutor_instructor',
127 'tutor',
128 $root_page,
129 $icon_base64_uri,
130 $menu_position
131 );
132
133 // Added @since v2.0.0.
134 add_submenu_page( 'tutor', __( 'Courses', 'tutor' ), __( 'Courses', 'tutor' ), 'manage_tutor_instructor', 'tutor', array( $this, 'tutor_course_list' ) );
135
136 // Ecommerce menu @since 3.0.0.
137 do_action( 'tutor_after_courses_admin_menu' );
138
139 add_submenu_page( 'tutor', __( 'Course Builder', 'tutor' ), '<span class="tutor-create-course">Create Course</span>', 'manage_tutor_instructor', 'create-course', array( new Course( false ), 'load_course_builder' ) );
140
141 // Extendable action hook @since 2.2.0.
142 do_action( 'tutor_after_courses_menu' );
143
144 // Templates menu @since 3.6.0.
145 add_submenu_page( 'tutor', __( 'Themes', 'tutor' ), __( 'Themes', 'tutor' ), 'manage_tutor', 'tutor-themes', array( $this, 'tutor_themes' ) );
146
147 add_submenu_page( 'tutor', __( 'Categories', 'tutor' ), __( 'Categories', 'tutor' ), 'manage_tutor', 'edit-tags.php?taxonomy=course-category&post_type=' . $course_post_type, null );
148
149 add_submenu_page( 'tutor', __( 'Tags', 'tutor' ), __( 'Tags', 'tutor' ), 'manage_tutor', 'edit-tags.php?taxonomy=course-tag&post_type=' . $course_post_type, null );
150
151 add_submenu_page( 'tutor', __( 'Students', 'tutor' ), __( 'Students', 'tutor' ), 'manage_tutor', Students_List::STUDENTS_LIST_PAGE, array( $this, 'tutor_students' ) );
152
153 if ( $enable_course_marketplace ) {
154 add_submenu_page( 'tutor', __( 'Instructors', 'tutor' ), __( 'Instructors', 'tutor' ), 'manage_tutor', Instructors_List::INSTRUCTOR_LIST_PAGE, array( $this, 'tutor_instructors' ) );
155 add_submenu_page( 'tutor', __( 'Withdraw Requests', 'tutor' ), __( 'Withdraw Requests', 'tutor' ), 'manage_tutor', Withdraw_Requests_List::WITHDRAW_REQUEST_LIST_PAGE, array( $this, 'withdraw_requests' ) );
156 }
157
158 add_submenu_page( 'tutor', __( 'Announcements', 'tutor' ), __( 'Announcements', 'tutor' ), 'manage_tutor_instructor', 'tutor_announcements', array( $this, 'tutor_announcements' ) );
159
160 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' ) );
161
162 add_submenu_page( 'tutor', __( 'Quiz Attempts', 'tutor' ), __( 'Quiz Attempts', 'tutor' ), 'manage_tutor_instructor', Quiz_Attempts_List::QUIZ_ATTEMPT_PAGE, array( $this, 'quiz_attempts' ) );
163
164 add_submenu_page( 'tutor', __( 'Addons', 'tutor' ), __( 'Addons', 'tutor' ), 'manage_tutor', 'tutor-addons', array( $this, 'enable_disable_addons' ) );
165
166 do_action( 'tutor_admin_register' );
167
168 add_submenu_page( 'tutor', __( 'Tools', 'tutor' ), __( 'Tools', 'tutor' ), 'manage_tutor', 'tutor-tools', array( new \TUTOR\Tools_V2(), 'load_tools_page' ) );
169
170 add_submenu_page( 'tutor', __( 'Settings', 'tutor' ), __( 'Settings', 'tutor' ), 'manage_tutor', 'tutor_settings', array( new \TUTOR\Options_V2(), 'load_settings_page' ) );
171
172 do_action( 'tutor_after_settings_menu' );
173
174 if ( ! $has_pro ) {
175 add_submenu_page( 'tutor', __( 'Upgrade to Pro', 'tutor' ), sprintf( '<span class="tutor-get-pro-text">%s</span>', __( 'Upgrade to Pro', 'tutor' ) ), 'manage_options', 'tutor-get-pro', array( $this, 'tutor_get_pro' ) );
176 }
177 }
178
179 /**
180 * Tutor template view
181 *
182 * @since 3.6.0
183 */
184 public function tutor_themes() {
185 include tutor()->path . 'views/template-import/templates.php';
186 }
187
188 /**
189 * Welcome page opt-out
190 *
191 * @since 3.0.0
192 */
193 public function handle_do_not_show_feature_page() {
194 tutor_utils()->check_nonce();
195
196 if ( ! User::is_admin() ) {
197 $this->json_response(
198 tutor_utils()->error_message(),
199 null,
200 HttpHelper::STATUS_BAD_REQUEST
201 );
202 }
203
204 update_option( 'tutor-new-feature', '3.0.0' );
205 $this->json_response( __( 'Success', 'tutor' ) );
206 }
207
208 /**
209 * Show Feature Promotion Page for Free User.
210 *
211 * @since 2.2.0
212 *
213 * @return void
214 */
215 public function feature_promotion_page() {
216 include tutor()->path . 'views/pages/welcome.php';
217 // include tutor()->path . 'views/pages/feature-promotion.php';
218 }
219
220 /**
221 * Show students page
222 *
223 * @since 1.0.0
224 * @return void
225 */
226 public function tutor_students() {
227 include tutor()->path . 'views/pages/students.php';
228 }
229
230 /**
231 * Show instructor page
232 *
233 * @since 1.0.0
234 * @return void
235 */
236 public function tutor_instructors() {
237 include tutor()->path . 'views/pages/instructors.php';
238 }
239
240 /**
241 * Show announcements page
242 *
243 * @since 1.0.0
244 * @return void
245 */
246 public function tutor_announcements() {
247 include tutor()->path . 'views/pages/announcements.php';
248 }
249
250 /**
251 * Show Q&A page
252 *
253 * @since 1.0.0
254 * @return void
255 */
256 public function question_answer() {
257 include tutor()->path . 'views/pages/question_answer.php';
258 }
259
260 /**
261 * Show quiz attempts page
262 *
263 * @since 1.0.0
264 * @return void
265 */
266 public function quiz_attempts() {
267 include tutor()->path . 'views/pages/quiz_attempts.php';
268 }
269
270 /**
271 * Show the withdraw requests table
272 *
273 * @since 1.2.0
274 * @return void
275 */
276 public function withdraw_requests() {
277 include tutor()->path . 'views/pages/withdraw_requests.php';
278 }
279
280 /**
281 * Enable or disable addons
282 *
283 * @since 1.0.0
284 * @return void
285 */
286 public function enable_disable_addons() {
287 include tutor()->path . 'views/pages/enable_disable_addons.php';
288 }
289
290 /**
291 * Tutor tools page (OLD)
292 *
293 * @since 1.0.0
294 * @return void
295 */
296 public function tutor_tools_old() {
297 $tutor_admin_tools_page = Input::get( 'tutor_admin_tools_page' );
298 if ( $tutor_admin_tools_page ) {
299 include apply_filters( 'tutor_admin_tools_page', tutor()->path . "views/pages/{$tutor_admin_tools_page}.php", $tutor_admin_tools_page );
300 } else {
301 $pages = apply_filters(
302 'tutor_tool_pages',
303 array(
304 'tutor_pages' => array( 'title' => __( 'Tutor Pages', 'tutor' ) ),
305 'status' => __( 'Status', 'tutor' ),
306 )
307 );
308
309 $current_page = 'tutor_pages';
310 $requested_page = Input::get( 'sub_page' );
311 if ( $requested_page ) {
312 $current_page = $requested_page;
313 }
314
315 $current_page = str_replace( '/', '', $current_page );
316 $current_page = str_replace( '.', '', $current_page );
317 $current_page = str_replace( '\\', '', $current_page );
318 $current_page = trim( $current_page );
319
320 include tutor()->path . 'views/pages/tools.php';
321 }
322 }
323
324 /**
325 * Show pro upgrade page
326 *
327 * @since 1.0.0
328 * @return void
329 */
330 public function tutor_get_pro() {
331 include tutor()->path . 'views/pages/get-pro.php';
332 }
333
334 /**
335 * Parent menu active
336 *
337 * @since 1.0.0
338 *
339 * @param string $parent_file parent file.
340 * @return string
341 */
342 public function parent_menu_active( $parent_file ) {
343 $taxonomy = Input::get( 'taxonomy' );
344 if ( CourseModel::COURSE_CATEGORY === $taxonomy || CourseModel::COURSE_TAG === $taxonomy ) {
345 return 'tutor';
346 }
347
348 return $parent_file;
349 }
350
351 /**
352 * Sub-menu active
353 *
354 * @since 1.0.0
355 *
356 * @param string $submenu_file submenu file.
357 * @param string $parent_file parent file.
358 *
359 * @return string
360 */
361 public function submenu_file_active( $submenu_file, $parent_file ) {
362 $taxonomy = Input::get( 'taxonomy' );
363 $course_post_type = tutor()->course_post_type;
364
365 if ( CourseModel::COURSE_CATEGORY === $taxonomy ) {
366 return 'edit-tags.php?taxonomy=course-category&post_type=' . $course_post_type;
367 }
368 if ( CourseModel::COURSE_TAG === $taxonomy ) {
369 return 'edit-tags.php?taxonomy=course-tag&post_type=' . $course_post_type;
370 }
371
372 return $submenu_file;
373 }
374
375 /**
376 * Filter posts for instructor
377 *
378 * @since 1.0.0
379 * @return void
380 */
381 public function filter_posts_for_instructors() {
382 if ( ! current_user_can( 'administrator' ) && current_user_can( tutor()->instructor_role ) ) {
383 @remove_menu_page( 'edit-comments.php' ); // Comments.
384 add_filter( 'posts_clauses_request', array( $this, 'posts_clauses_request' ) );
385 }
386 }
387
388 /**
389 * Request for posts clauses
390 *
391 * @since 1.0.0
392 *
393 * @param mixed $clauses clauses.
394 * @return mixed
395 */
396 public function posts_clauses_request( $clauses ) {
397
398 if ( ! is_admin() || ( ! Input::has( 'post_type' ) || Input::get( 'post_type' ) != tutor()->course_post_type ) || tutor_utils()->has_user_role( array( 'administrator', 'editor' ) ) ) {
399 return $clauses;
400 }
401
402 // Need multi instructor check.
403 global $wpdb;
404
405 $user_id = get_current_user_id();
406
407 $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 ) );
408 $own_courses = is_array( $get_assigned_courses_ids ) ? $get_assigned_courses_ids : array();
409
410 $in_query_pre = count( $own_courses ) ? implode( ',', $own_courses ) : null;
411 $in_query_where = $in_query_pre ? " OR {$wpdb->posts}.ID IN({$in_query_pre})" : '';
412
413 $course_post_type = tutor()->course_post_type;
414 $custom_author_query = " AND ({$wpdb->posts}.post_type!='{$course_post_type}' OR {$wpdb->posts}.post_author = {$user_id}) {$in_query_where}";
415
416 $clauses['where'] .= $custom_author_query;
417
418 return $clauses;
419 }
420
421 /**
422 * Prevent unauthorised course/lesson edit page by direct URL
423 *
424 * @since 1.0.0
425 * @return void
426 */
427 public function check_if_current_users_post() {
428 if ( current_user_can( 'administrator' ) || ! current_user_can( tutor()->instructor_role ) ) {
429 return;
430 }
431
432 if ( ! empty( Input::get( 'post' ) ) ) {
433 $get_post_id = Input::get( 'post', Input::TYPE_INT );
434 $get_post = get_post( $get_post_id );
435 $tutor_post_types = array( tutor()->course_post_type, tutor()->lesson_post_type );
436
437 $current_user = get_current_user_id();
438
439 if ( in_array( $get_post->post_type, $tutor_post_types ) && $get_post->post_author != $current_user ) {
440 global $wpdb;
441
442 $get_assigned_courses_ids = (int) $wpdb->get_var(
443 $wpdb->prepare(
444 "SELECT user_id
445 from {$wpdb->usermeta}
446 WHERE user_id = %d AND meta_key = '_tutor_instructor_course_id' AND meta_value = %d ",
447 $current_user,
448 $get_post_id
449 )
450 );
451
452 if ( ! $get_assigned_courses_ids ) {
453 wp_die( esc_html__( 'Permission Denied', 'tutor' ) );
454 }
455 }
456 }
457 }
458
459 /**
460 * Scan template files
461 *
462 * @since 1.0.0
463 *
464 * @param string $template_path template file path.
465 * @return array
466 */
467 public static function scan_template_files( $template_path = null ) {
468 if ( ! $template_path ) {
469 $template_path = tutor()->path . 'templates/';
470 }
471
472 $files = @scandir($template_path); // @codingStandardsIgnoreLine.
473 $result = array();
474
475 if ( ! empty( $files ) ) {
476 foreach ( $files as $key => $value ) {
477 if ( ! in_array( $value, array( '.', '..', '.DS_Store' ), true ) ) {
478 if ( is_dir( $template_path . DIRECTORY_SEPARATOR . $value ) ) {
479 $sub_files = self::scan_template_files( $template_path . DIRECTORY_SEPARATOR . $value );
480 foreach ( $sub_files as $sub_file ) {
481 $result[] = $value . DIRECTORY_SEPARATOR . $sub_file;
482 }
483 } else {
484 $result[] = $value;
485 }
486 }
487 }
488 }
489 return $result;
490 }
491
492 /**
493 * Get Template overridden files
494 *
495 * @since 1.0.0
496 * @return array
497 */
498 public static function template_overridden_files() {
499 $template_files = self::scan_template_files();
500
501 $override_files = array();
502 foreach ( $template_files as $file ) {
503 $file_path = null;
504 if ( file_exists( trailingslashit( get_stylesheet_directory() ) . tutor()->template_path . $file ) ) {
505 $file_path = $file;
506 } elseif ( file_exists( trailingslashit( get_template_directory() ) . tutor()->template_path . $file ) ) {
507 $file_path = $file;
508 }
509
510 if ( $file_path ) {
511 $override_files[] = str_replace( WP_CONTENT_DIR . '/themes/', '', $file_path );
512 }
513 }
514
515 return $override_files;
516 }
517
518 /**
519 * Plugin activation link
520 *
521 * @since 1.0.0
522 *
523 * @param array $actions action list.
524 * @return array
525 */
526 public function plugin_action_links( $actions ) {
527 $has_pro = tutor()->has_pro;
528
529 if ( ! $has_pro ) {
530 $actions['tutor_pro_link'] =
531 '<a href="https://tutorlms.com/pricing?utm_source=tutor_plugin_action_link&utm_medium=wordpress_dashboard&utm_campaign=go_premium" target="_blank">
532 <span style="color: #ff7742; font-weight: bold;">' .
533 __( 'Upgrade to Pro', 'tutor' ) .
534 '</span>
535 </a>';
536 }
537
538 $actions['settings'] = '<a href="admin.php?page=tutor_settings">' . __( 'Settings', 'tutor' ) . '</a>';
539
540 return $actions;
541 }
542
543 /**
544 * Add plugin meta data in WP plugins list page
545 *
546 * @since 1.0.0
547 *
548 * @param array $plugin_meta plugin meta data.
549 * @param string $plugin_file plugin file.
550 *
551 * @return array
552 */
553 public function plugin_row_meta( $plugin_meta, $plugin_file ) {
554
555 if ( tutor()->basename === $plugin_file ) {
556 $plugin_meta[] = sprintf(
557 '<a href="%s"><strong style="color: #03bd24">%s</strong></a>',
558 esc_url( 'https://docs.themeum.com/tutor-lms/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_docs_link' ),
559 esc_html__( 'Documentation', 'tutor' )
560 );
561 $plugin_meta[] = sprintf(
562 '<a href="%s"><strong style="color: #03bd24">%s</strong></a>',
563 esc_url( 'https://www.themeum.com/contact-us/?utm_source=tutor&utm_medium=plugins_installation_list&utm_campaign=plugin_support_link' ),
564 esc_html__( 'Get Support', 'tutor' )
565 );
566 }
567
568 return $plugin_meta;
569 }
570
571 /**
572 * Add footer text only on tutor pages
573 *
574 * @since 1.0.0
575 *
576 * @param string $footer_text footer text.
577 * @return string
578 */
579 public function admin_footer_text( $footer_text ) {
580 $current_screen = get_current_screen();
581
582 /**
583 * We are making sure that this message will be only on Tutor Admin page
584 */
585 if ( apply_filters( 'tutor_display_admin_footer_text', ( tutor_utils()->array_get( 'parent_base', $current_screen ) === 'tutor' ) ) ) {
586 $footer_text = sprintf(
587 /* translators: %s: plugin name */
588 __( 'If you like %1$s please leave us a %2$s rating. A huge thanks in advance!', 'tutor' ),
589 sprintf( '<strong>%s</strong>', esc_html__( 'Tutor LMS', 'tutor' ) ),
590 '<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>'
591 );
592 }
593
594 return $footer_text;
595 }
596
597 /**
598 * Register course widget
599 *
600 * @since 1.0.0
601 * @return void
602 */
603 public function register_course_widget() {
604 register_widget( Course_Widget::class );
605 }
606
607 /**
608 * Tutor Course List
609 *
610 * @since 2.0.0
611 * @return void
612 */
613 public function tutor_course_list() {
614 include tutor()->path . 'views/pages/course-list.php';
615 }
616
617 /**
618 * Orders view page
619 *
620 * @since 3.0.0
621 *
622 * @return void
623 */
624 public function orders_view() {
625 $current_page = Input::get( 'page' );
626 $action = Input::get( 'action' );
627
628 if ( OrderController::PAGE_SLUG === $current_page && 'edit' === $action ) {
629 ?>
630 <div class="tutor-admin-wrap tutor-order-details-wrapper">
631 <div id="tutor-order-details-root">
632 </div>
633 </div>
634 <?php
635 return;
636 }
637
638 include tutor()->path . 'views/pages/ecommerce/order-list.php';
639 }
640
641 /**
642 * Coupons view page
643 *
644 * @since 3.0.0
645 *
646 * @return void
647 */
648 public function coupons_view() {
649 $action = Input::get( 'action' );
650 if ( in_array( $action, array( 'add_new', 'edit' ) ) ) {
651 ?>
652 <div class="tutor-admin-wrap">
653 <div id="tutor-coupon-root">
654 </div>
655 </div>
656 <?php
657 return;
658 }
659 include tutor()->path . 'views/pages/ecommerce/coupon-list.php';
660 }
661
662 /**
663 * Show welcome page
664 *
665 * @since 1.0.0
666 * @return void
667 */
668 public function welcome_page() {
669 Tutor_Setup::mark_as_visited();
670 include tutor()->path . 'views/pages/welcome.php';
671 exit;
672 }
673
674 /**
675 * Add toolbar items
676 *
677 * @since 1.4.6
678 *
679 * @param \WP_Admin_Bar $admin_bar admin bar object.
680 *
681 * @return mixed
682 */
683 public function add_toolbar_items( \WP_Admin_Bar $admin_bar ) {
684 global $post;
685
686 $course_id = Input::get( 'post', 0, Input::TYPE_INT );
687 $course_post_type = tutor()->course_post_type;
688
689 if ( $admin_bar->get_node( 'new-courses' ) ) {
690 $args = $admin_bar->get_node( 'new-courses' );
691 $args->href = '#';
692 $args->meta['class'] = 'tutor-create-new-course';
693 $admin_bar->add_node( $args );
694 }
695
696 if ( ! tutor_utils()->can_user_edit_course( get_current_user_id(), $course_id ) ) {
697 return $admin_bar;
698 }
699
700 if (
701 ( is_admin() && $post && $course_id && $post->post_type === $course_post_type ) ||
702 ( ! is_admin() && is_single() && $post && $course_post_type === $post->post_type )
703 ) {
704
705 $admin_bar->add_menu(
706 array(
707 'id' => 'edit',
708 'title' => __( 'Edit with Course Builder', 'tutor' ),
709 'href' => tutor_utils()->course_edit_link( $post->ID ),
710 'meta' => array(
711 'title' => __( 'Edit with Course Builder', 'tutor' ),
712 'target' => '_blank',
713 ),
714 )
715 );
716 }
717
718 return $admin_bar;
719 }
720 }
721