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