PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.6.4
Tutor LMS – eLearning and online course solution v3.6.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 / Template.php
tutor / classes Last commit date
Addons.php 1 year ago Admin.php 1 year ago Ajax.php 1 year ago Announcements.php 1 year ago Assets.php 1 year ago Backend_Page_Trait.php 1 year ago BaseController.php 1 year ago Course.php 1 year ago Course_Embed.php 3 years ago Course_Filter.php 1 year ago Course_List.php 1 year 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 Input.php 1 year ago Instructor.php 1 year ago Instructors_List.php 1 year ago Lesson.php 1 year ago Options_V2.php 1 year ago Permalink.php 2 years ago Post_types.php 1 year ago Private_Course_Access.php 1 year ago Q_And_A.php 1 year ago Question_Answers_List.php 3 years ago Quiz.php 1 year ago QuizBuilder.php 1 year ago Quiz_Attempts_List.php 1 year ago RestAPI.php 2 years ago Reviews.php 3 years 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 1 year ago Theme_Compatibility.php 3 years ago Tools.php 1 year ago Tools_V2.php 1 year ago Tutor.php 1 year ago TutorEDD.php 1 year ago Tutor_Base.php 2 years ago Tutor_Setup.php 1 year ago Upgrader.php 1 year ago User.php 1 year ago Utils.php 11 months ago Video_Stream.php 3 years ago WhatsNew.php 2 years ago Withdraw.php 1 year ago Withdraw_Requests_List.php 1 year ago WooCommerce.php 1 year ago
Template.php
489 lines
1 <?php
2 /**
3 * Template Class
4 *
5 * @package Tutor\Template
6 * @author Themeum <support@themeum.com>
7 * @link https://themeum.com
8 * @since 1.0.0
9 */
10
11 namespace TUTOR;
12
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Handle template before include
19 *
20 * @since 1.0.0
21 */
22 class Template extends Tutor_Base {
23
24 /**
25 * Register Hooks
26 *
27 * @since 1.0.0
28 */
29 public function __construct() {
30 parent::__construct();
31
32 /**
33 * Should Load Template Override
34 * Integration for specially oxygen builder
35 * If we found false of below filter, then we will not use this file
36 */
37
38 $template_override = apply_filters( 'tutor_lms_should_template_override', true );
39 if ( ! $template_override ) {
40 return;
41 }
42
43 add_filter( 'template_include', array( $this, 'load_course_archive_template' ), 99 );
44 add_filter( 'template_include', array( $this, 'load_single_course_template' ), 99 );
45 add_filter( 'template_include', array( $this, 'load_single_lesson_template' ), 99 );
46 add_filter( 'template_include', array( $this, 'play_private_video' ), 99 );
47 add_filter( 'template_include', array( $this, 'load_quiz_template' ), 99 );
48 add_filter( 'template_include', array( $this, 'load_assignment_template' ), 99 );
49
50 add_filter( 'template_include', array( $this, 'student_public_profile' ), 99 );
51 add_filter( 'template_include', array( $this, 'tutor_dashboard' ), 99 );
52 add_filter( 'pre_get_document_title', array( $this, 'student_public_profile_title' ) );
53
54 add_filter( 'the_content', array( $this, 'convert_static_page_to_template' ) );
55 add_action( 'pre_get_posts', array( $this, 'limit_course_query_archive' ), 99 );
56 }
57
58 /**
59 * Load default template for course
60 *
61 * @since v.1.0.0
62 *
63 * @param sting $template template name.
64 *
65 * @return bool|string
66 */
67 public function load_course_archive_template( $template ) {
68 global $wp_query;
69
70 $post_type = get_query_var( 'post_type' );
71 if ( ! is_array( $post_type ) ) {
72 $post_type = array( $post_type );
73 }
74
75 $course_category = get_query_var( 'course-category' );
76
77 if ( ( in_array( $this->course_post_type, $post_type, true ) || ! empty( $course_category ) ) && $wp_query->is_archive ) {
78 $template = tutor_get_template( 'archive-course' );
79 return $template;
80 }
81
82 return $template;
83 }
84
85 /**
86 * Limit for course archive listing
87 *
88 * Make a page to archive listing for courses
89 *
90 * @since 1.0.0
91 *
92 * @param mixed $query query argument.
93 *
94 * @return void
95 */
96 public function limit_course_query_archive( $query ) {
97 $courses_per_page = (int) tutor_utils()->get_option( 'courses_per_page', 12 );
98
99 if ( $query->is_main_query() && ! $query->is_feed() && ! is_admin() && is_page() ) {
100 $queried_object = get_queried_object();
101 if ( $queried_object instanceof \WP_Post ) {
102 $page_id = $queried_object->ID;
103 $selected_archive_page = (int) apply_filters( 'tutor_filter_course_archive_page', tutor_utils()->get_option( 'course_archive_page' ) );
104
105 if ( $page_id === $selected_archive_page ) {
106 $paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
107 $search_query = get_search_query();
108 query_posts(
109 array(
110 'post_type' => $this->course_post_type,
111 'paged' => $paged,
112 's' => $search_query,
113 'posts_per_page' => $courses_per_page,
114 )
115 );
116 }
117 }
118 }
119
120 if ( $query->is_archive && $query->is_main_query() && ! $query->is_feed() && ! is_admin() ) {
121 $post_type = get_query_var( 'post_type' );
122 $course_category = get_query_var( 'course-category' );
123 if ( ( $post_type === $this->course_post_type || ! empty( $course_category ) ) ) {
124 $query->set( 'posts_per_page', $courses_per_page );
125 $query->set( 'post_type', apply_filters( 'tutor_course_archive_post_types', array( $this->course_post_type ) ) );
126 $query = apply_filters( 'tutor_limit_course_archive_list_filter', $query );
127
128 $course_filter = 'newest_first';
129 if ( ! empty( Input::get( 'tutor_course_filter', '' ) ) ) {
130 $course_filter = Input::get( 'tutor_course_filter' );
131 }
132 switch ( $course_filter ) {
133 case 'newest_first':
134 $query->set( 'orderby', 'post_date' );
135 $query->set( 'order', 'desc' );
136 break;
137 case 'oldest_first':
138 $query->set( 'orderby', 'post_date' );
139 $query->set( 'order', 'asc' );
140 break;
141 case 'course_title_az':
142 $query->set( 'orderby', 'post_title' );
143 $query->set( 'order', 'asc' );
144 break;
145 case 'course_title_za':
146 $query->set( 'orderby', 'post_title' );
147 $query->set( 'order', 'desc' );
148 break;
149 }
150 }
151 }
152 }
153
154 /**
155 * Load Single Course Template
156 *
157 * @since v.1.0.0
158 *
159 * @param string $template template name to load.
160 *
161 * @return bool|string
162 */
163 public function load_single_course_template( $template ) {
164 global $wp_query;
165
166 if ( $wp_query->is_single && ! empty( $wp_query->query_vars['post_type'] ) && $wp_query->query_vars['post_type'] === $this->course_post_type ) {
167 do_action( 'single_course_template_before_load', get_the_ID() );
168 wp_reset_query();
169 return tutor_get_template( 'single-course' );
170 }
171
172 return $template;
173 }
174
175 /**
176 * Get root post parent id
177 *
178 * @param int $id post id.
179 *
180 * @return int root post id
181 */
182 private function get_root_post_parent_id( $id ) {
183 $ancestors = get_post_ancestors( $id );
184 $root = is_array( $ancestors ) ? end( $ancestors ) : null;
185
186 return is_numeric( $root ) ? $root : $id;
187 }
188
189 /**
190 * Load lesson template
191 *
192 * @since v.1.0.0
193 *
194 * @param string $template template name to load.
195 *
196 * @return bool|string
197 */
198 public function load_single_lesson_template( $template ) {
199 global $wp_query;
200
201 if ( $wp_query->is_single && ! empty( $wp_query->query_vars['post_type'] ) && $wp_query->query_vars['post_type'] === $this->lesson_post_type ) {
202 $page_id = get_the_ID();
203
204 do_action( 'tutor_lesson_load_before', $template );
205 setup_postdata( $page_id );
206
207 if ( is_user_logged_in() ) {
208 $has_content_access = tutor_utils()->has_enrolled_content_access( 'lesson' );
209 if ( $has_content_access ) {
210 $template = tutor_get_template( 'single-lesson' );
211 } else {
212 $template = tutor_get_template( 'single.lesson.required-enroll' ); // You need to enroll first.
213 }
214 } else {
215 $template = tutor_get_template( 'login' );
216 }
217 wp_reset_postdata();
218
219 // Forcefully show lessons if it is public and not paid.
220 $course_id = $this->get_root_post_parent_id( $page_id );
221 if ( 'yes' === get_post_meta( $course_id, '_tutor_is_public_course', true ) && ! tutor_utils()->is_course_purchasable( $course_id ) ) {
222 $template = tutor_get_template( 'single-lesson' );
223 }
224
225 return apply_filters( 'tutor_lesson_template', $template );
226 }
227 return $template;
228 }
229
230 /**
231 * Play the video in this url.
232 *
233 * @param string $template template to load.
234 *
235 * @return mixed
236 */
237 public function play_private_video( $template ) {
238 global $wp_query;
239
240 if ( $wp_query->is_single && ! empty( $wp_query->query_vars['lesson_video'] ) && 'true' === $wp_query->query_vars['lesson_video'] ) {
241
242 $is_public_video = apply_filters( 'tutor_video_stream_is_public', false, get_the_ID() );
243 if ( $is_public_video ) {
244 $video_info = tutor_utils()->get_video_info();
245 if ( $video_info ) {
246 $stream = new Video_Stream( $video_info->path );
247 $stream->start();
248 }
249 exit();
250 }
251
252 if ( tutor_utils()->is_course_enrolled_by_lesson() ) {
253 $video_info = tutor_utils()->get_video_info();
254 if ( $video_info ) {
255 $stream = new Video_Stream( $video_info->path );
256 $stream->start();
257 }
258 } else {
259 esc_html_e( 'Permission denied', 'tutor' );
260 }
261 exit();
262 }
263
264 return $template;
265 }
266
267 /**
268 * Tutor Dashboard Page, Responsible to show dashboard stuffs
269 *
270 * @since v.1.0.0
271 *
272 * @param string $content page content.
273 *
274 * @return mixed
275 */
276 public function convert_static_page_to_template( $content ) {
277 // Dashboard Page.
278 $student_dashboard_page_id = (int) tutor_utils()->get_option( 'tutor_dashboard_page_id' );
279 if ( get_the_ID() === $student_dashboard_page_id ) {
280 $shortcode = new Shortcode();
281 return $shortcode->tutor_dashboard();
282 }
283
284 // Instructor Registration Page.
285 $instructor_register_page_page_id = (int) tutor_utils()->get_option( 'instructor_register_page' );
286 if ( get_the_ID() === $instructor_register_page_page_id ) {
287 $shortcode = new Shortcode();
288 return $shortcode->instructor_registration_form();
289 }
290
291 $student_register_page_id = (int) tutor_utils()->get_option( 'student_register_page' );
292 if ( get_the_ID() === $student_register_page_id ) {
293 $shortcode = new Shortcode();
294 return $shortcode->student_registration_form();
295 }
296
297 $tutor_cart_page_id = (int) tutor_utils()->get_option( 'tutor_cart_page_id' );
298 if ( get_the_ID() === $tutor_cart_page_id ) {
299 $shortcode = new Shortcode();
300 return $shortcode->tutor_cart_page();
301 }
302
303 $tutor_checkout_page_id = (int) tutor_utils()->get_option( 'tutor_checkout_page_id' );
304 if ( get_the_ID() === $tutor_checkout_page_id ) {
305 $shortcode = new Shortcode();
306 return $shortcode->tutor_checkout_page();
307 }
308
309 return $content;
310 }
311
312 /**
313 * Tutor dashboard
314 *
315 * @since 1.0.0
316 *
317 * @param string $template template name.
318 *
319 * @return string
320 */
321 public function tutor_dashboard( $template ) {
322 global $wp_query;
323 $is_page = apply_filters( 'tutor_determine_is_page', $wp_query->is_page, $template );
324 if ( $is_page ) {
325 $student_dashboard_page_id = (int) tutor_utils()->get_option( 'tutor_dashboard_page_id' );
326 $student_dashboard_page_id = apply_filters( 'tutor_dashboard_page_id_filter', $student_dashboard_page_id );
327 $is_dashboard_page = apply_filters( 'tutor_determine_is_dashboard_page', get_the_ID() == $student_dashboard_page_id );
328
329 if ( $is_dashboard_page ) {
330 /**
331 * Handle if logout URL
332 *
333 * @since v.1.1.2
334 */
335 if ( tutor_utils()->array_get( 'tutor_dashboard_page', $wp_query->query_vars ) === 'logout' ) {
336 $redirect = apply_filters( 'tutor_dashboard_logout_redirect_url', get_permalink( $student_dashboard_page_id ) );
337 wp_logout();
338 wp_safe_redirect( $redirect );
339 die();
340 }
341
342 $dashboard_page = tutor_utils()->array_get( 'tutor_dashboard_page', $wp_query->query_vars );
343
344 $get_dashboard_config = tutor_utils()->tutor_dashboard_permalinks();
345 $target_dashboard_page = tutor_utils()->array_get( $dashboard_page, $get_dashboard_config );
346
347 if ( isset( $target_dashboard_page['login_require'] ) && false === $target_dashboard_page['login_require'] ) {
348 $template = tutor_load_template_part( "template-part.{$dashboard_page}" );
349 } else {
350
351 /**
352 * Load view page based on dashboard Endpoint
353 */
354 if ( is_user_logged_in() ) {
355
356 global $wp;
357 $full_path = explode( '/', trim( str_replace( get_home_url(), '', home_url( $wp->request ) ), '/' ) );
358
359 $template = tutor_get_template( 'create-course' === end( $full_path ) ? 'dashboard.create-course' : 'dashboard' );
360
361 /**
362 * Check page page permission
363 *
364 * @since 1.3.4
365 */
366 $query_var = tutor_utils()->array_get( 'tutor_dashboard_page', $wp_query->query_vars );
367 $dashboard_pages = tutor_utils()->tutor_dashboard_pages();
368 $dashboard_page_item = tutor_utils()->array_get( $query_var, $dashboard_pages );
369 $auth_cap = tutor_utils()->array_get( 'auth_cap', $dashboard_page_item );
370 if ( $auth_cap && ! current_user_can( $auth_cap ) ) {
371 $template = tutor_get_template( 'permission-denied' );
372 }
373 } else {
374 $template = tutor_get_template( 'login' );
375 }
376 }
377 }
378 }
379 return $template;
380 }
381
382 /**
383 * Load quiz template
384 *
385 * @since 1.0.0
386 *
387 * If course public then enrollment not required
388 *
389 * @since 2.0.2
390 *
391 * @param string $template template to load.
392 *
393 * @return bool|string
394 */
395 public function load_quiz_template( $template ) {
396 global $wp_query, $post;
397
398 if ( $wp_query->is_single && ! empty( $wp_query->query_vars['post_type'] ) && 'tutor_quiz' === $wp_query->query_vars['post_type'] ) {
399 if ( is_user_logged_in() ) {
400 $has_content_access = tutor_utils()->has_enrolled_content_access( 'quiz' );
401 $course_id = tutor_utils()->get_course_id_by_content( $post );
402 $is_public = Course_List::is_public( $course_id );
403
404 // if public course don't need to be enrolled.
405 if ( $has_content_access || $is_public ) {
406 $template = tutor_get_template( 'single-quiz' );
407 } else {
408 $template = tutor_get_template( 'single.lesson.required-enroll' ); // You need to enroll first.
409 }
410 } else {
411 $template = tutor_get_template( 'login' );
412 }
413 return $template;
414 }
415 return $template;
416 }
417
418 /**
419 * Load assignment template
420 *
421 * @since 1.0.0
422 *
423 * @param string $template template file to load.
424 *
425 * @return string template path
426 */
427 public function load_assignment_template( $template ) {
428 global $wp_query;
429
430 if ( $wp_query->is_single && ! empty( $wp_query->query_vars['post_type'] ) && 'tutor_assignments' === $wp_query->query_vars['post_type'] ) {
431 if ( is_user_logged_in() ) {
432 $has_content_access = tutor_utils()->has_enrolled_content_access( 'assignment' );
433 if ( $has_content_access ) {
434 $template = tutor_get_template( 'single-assignment' );
435 } else {
436 $template = tutor_get_template( 'single.lesson.required-enroll' ); // You need to enroll first.
437 }
438 } else {
439 $template = tutor_get_template( 'login' );
440 }
441 return $template;
442 }
443
444 return $template;
445 }
446
447 /**
448 * Student public profile
449 *
450 * @since 1.0.0
451 *
452 * @param string $template profile template.
453 *
454 * @return bool|string
455 */
456 public function student_public_profile( $template ) {
457 global $wp_query;
458 $query_var = $wp_query->query_vars;
459 if ( ! empty( $wp_query->query['tutor_profile_username'] ) ) {
460 $template = tutor_get_template( 'public-profile' );
461 }
462
463 return $template;
464 }
465
466 /**
467 * Show student Profile
468 *
469 * @since 1.0.0
470 *
471 * @return string
472 */
473 public function student_public_profile_title() {
474 global $wp_query;
475
476 if ( ! empty( $wp_query->query['tutor_profile_username'] ) ) {
477 global $wpdb;
478
479 $user_name = sanitize_text_field( $wp_query->query['tutor_profile_username'] );
480 $user = $wpdb->get_row( $wpdb->prepare( "SELECT display_name from {$wpdb->users} WHERE user_login = %s limit 1; ", $user_name ) );
481
482 if ( ! empty( $user->display_name ) ) {
483 return sprintf( "%s's %s", $user->display_name, __( 'Profile Page', 'tutor' ) );
484 }
485 }
486 return '';
487 }
488 }
489