PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.2.0
Tutor LMS – eLearning and online course solution v3.2.0
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 3 years ago Taxonomies.php 3 years 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 1 year 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
488 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
127 $course_filter = 'newest_first';
128 if ( ! empty( Input::get( 'tutor_course_filter', '' ) ) ) {
129 $course_filter = Input::get( 'tutor_course_filter' );
130 }
131 switch ( $course_filter ) {
132 case 'newest_first':
133 $query->set( 'orderby', 'ID' );
134 $query->set( 'order', 'desc' );
135 break;
136 case 'oldest_first':
137 $query->set( 'orderby', 'ID' );
138 $query->set( 'order', 'asc' );
139 break;
140 case 'course_title_az':
141 $query->set( 'orderby', 'post_title' );
142 $query->set( 'order', 'asc' );
143 break;
144 case 'course_title_za':
145 $query->set( 'orderby', 'post_title' );
146 $query->set( 'order', 'desc' );
147 break;
148 }
149 }
150 }
151 }
152
153 /**
154 * Load Single Course Template
155 *
156 * @since v.1.0.0
157 *
158 * @param string $template template name to load.
159 *
160 * @return bool|string
161 */
162 public function load_single_course_template( $template ) {
163 global $wp_query;
164
165 if ( $wp_query->is_single && ! empty( $wp_query->query_vars['post_type'] ) && $wp_query->query_vars['post_type'] === $this->course_post_type ) {
166 do_action( 'single_course_template_before_load', get_the_ID() );
167 wp_reset_query();
168 return tutor_get_template( 'single-course' );
169 }
170
171 return $template;
172 }
173
174 /**
175 * Get root post parent id
176 *
177 * @param int $id post id.
178 *
179 * @return int root post id
180 */
181 private function get_root_post_parent_id( $id ) {
182 $ancestors = get_post_ancestors( $id );
183 $root = is_array( $ancestors ) ? end( $ancestors ) : null;
184
185 return is_numeric( $root ) ? $root : $id;
186 }
187
188 /**
189 * Load lesson template
190 *
191 * @since v.1.0.0
192 *
193 * @param string $template template name to load.
194 *
195 * @return bool|string
196 */
197 public function load_single_lesson_template( $template ) {
198 global $wp_query;
199
200 if ( $wp_query->is_single && ! empty( $wp_query->query_vars['post_type'] ) && $wp_query->query_vars['post_type'] === $this->lesson_post_type ) {
201 $page_id = get_the_ID();
202
203 do_action( 'tutor_lesson_load_before', $template );
204 setup_postdata( $page_id );
205
206 if ( is_user_logged_in() ) {
207 $has_content_access = tutor_utils()->has_enrolled_content_access( 'lesson' );
208 if ( $has_content_access ) {
209 $template = tutor_get_template( 'single-lesson' );
210 } else {
211 $template = tutor_get_template( 'single.lesson.required-enroll' ); // You need to enroll first
212 }
213 } else {
214 $template = tutor_get_template( 'login' );
215 }
216 wp_reset_postdata();
217
218 // Forcefully show lessons if it is public and not paid.
219 $course_id = $this->get_root_post_parent_id( $page_id );
220 if ( 'yes' === get_post_meta( $course_id, '_tutor_is_public_course', true ) && ! tutor_utils()->is_course_purchasable( $course_id ) ) {
221 $template = tutor_get_template( 'single-lesson' );
222 }
223
224 return apply_filters( 'tutor_lesson_template', $template );
225 }
226 return $template;
227 }
228
229 /**
230 * Play the video in this url.
231 *
232 * @param string $template template to load.
233 *
234 * @return mixed
235 */
236 public function play_private_video( $template ) {
237 global $wp_query;
238
239 if ( $wp_query->is_single && ! empty( $wp_query->query_vars['lesson_video'] ) && 'true' === $wp_query->query_vars['lesson_video'] ) {
240
241 $is_public_video = apply_filters( 'tutor_video_stream_is_public', false, get_the_ID() );
242 if ( $is_public_video ) {
243 $video_info = tutor_utils()->get_video_info();
244 if ( $video_info ) {
245 $stream = new Video_Stream( $video_info->path );
246 $stream->start();
247 }
248 exit();
249 }
250
251 if ( tutor_utils()->is_course_enrolled_by_lesson() ) {
252 $video_info = tutor_utils()->get_video_info();
253 if ( $video_info ) {
254 $stream = new Video_Stream( $video_info->path );
255 $stream->start();
256 }
257 } else {
258 esc_html_e( 'Permission denied', 'tutor' );
259 }
260 exit();
261 }
262
263 return $template;
264 }
265
266 /**
267 * Tutor Dashboard Page, Responsible to show dashboard stuffs
268 *
269 * @since v.1.0.0
270 *
271 * @param string $content page content.
272 *
273 * @return mixed
274 */
275 public function convert_static_page_to_template( $content ) {
276 // Dashboard Page.
277 $student_dashboard_page_id = (int) tutor_utils()->get_option( 'tutor_dashboard_page_id' );
278 if ( get_the_ID() === $student_dashboard_page_id ) {
279 $shortcode = new Shortcode();
280 return $shortcode->tutor_dashboard();
281 }
282
283 // Instructor Registration Page.
284 $instructor_register_page_page_id = (int) tutor_utils()->get_option( 'instructor_register_page' );
285 if ( get_the_ID() === $instructor_register_page_page_id ) {
286 $shortcode = new Shortcode();
287 return $shortcode->instructor_registration_form();
288 }
289
290 $student_register_page_id = (int) tutor_utils()->get_option( 'student_register_page' );
291 if ( get_the_ID() === $student_register_page_id ) {
292 $shortcode = new Shortcode();
293 return $shortcode->student_registration_form();
294 }
295
296 $tutor_cart_page_id = (int) tutor_utils()->get_option( 'tutor_cart_page_id' );
297 if ( get_the_ID() === $tutor_cart_page_id ) {
298 $shortcode = new Shortcode();
299 return $shortcode->tutor_cart_page();
300 }
301
302 $tutor_checkout_page_id = (int) tutor_utils()->get_option( 'tutor_checkout_page_id' );
303 if ( get_the_ID() === $tutor_checkout_page_id ) {
304 $shortcode = new Shortcode();
305 return $shortcode->tutor_checkout_page();
306 }
307
308 return $content;
309 }
310
311 /**
312 * Tutor dashboard
313 *
314 * @since 1.0.0
315 *
316 * @param string $template template name.
317 *
318 * @return string
319 */
320 public function tutor_dashboard( $template ) {
321 global $wp_query;
322 $is_page = apply_filters( 'tutor_determine_is_page', $wp_query->is_page, $template );
323 if ( $is_page ) {
324 $student_dashboard_page_id = (int) tutor_utils()->get_option( 'tutor_dashboard_page_id' );
325 $student_dashboard_page_id = apply_filters( 'tutor_dashboard_page_id_filter', $student_dashboard_page_id );
326 $is_dashboard_page = apply_filters( 'tutor_determine_is_dashboard_page', get_the_ID() == $student_dashboard_page_id );
327
328 if ( $is_dashboard_page ) {
329 /**
330 * Handle if logout URL
331 *
332 * @since v.1.1.2
333 */
334 if ( tutor_utils()->array_get( 'tutor_dashboard_page', $wp_query->query_vars ) === 'logout' ) {
335 $redirect = apply_filters( 'tutor_dashboard_logout_redirect_url', get_permalink( $student_dashboard_page_id ) );
336 wp_logout();
337 wp_safe_redirect( $redirect );
338 die();
339 }
340
341 $dashboard_page = tutor_utils()->array_get( 'tutor_dashboard_page', $wp_query->query_vars );
342
343 $get_dashboard_config = tutor_utils()->tutor_dashboard_permalinks();
344 $target_dashboard_page = tutor_utils()->array_get( $dashboard_page, $get_dashboard_config );
345
346 if ( isset( $target_dashboard_page['login_require'] ) && false === $target_dashboard_page['login_require'] ) {
347 $template = tutor_load_template_part( "template-part.{$dashboard_page}" );
348 } else {
349
350 /**
351 * Load view page based on dashboard Endpoint
352 */
353 if ( is_user_logged_in() ) {
354
355 global $wp;
356 $full_path = explode( '/', trim( str_replace( get_home_url(), '', home_url( $wp->request ) ), '/' ) );
357
358 $template = tutor_get_template( 'create-course' === end( $full_path ) ? 'dashboard.create-course' : 'dashboard' );
359
360 /**
361 * Check page page permission
362 *
363 * @since 1.3.4
364 */
365 $query_var = tutor_utils()->array_get( 'tutor_dashboard_page', $wp_query->query_vars );
366 $dashboard_pages = tutor_utils()->tutor_dashboard_pages();
367 $dashboard_page_item = tutor_utils()->array_get( $query_var, $dashboard_pages );
368 $auth_cap = tutor_utils()->array_get( 'auth_cap', $dashboard_page_item );
369 if ( $auth_cap && ! current_user_can( $auth_cap ) ) {
370 $template = tutor_get_template( 'permission-denied' );
371 }
372 } else {
373 $template = tutor_get_template( 'login' );
374 }
375 }
376 }
377 }
378 return $template;
379 }
380
381 /**
382 * Load quiz template
383 *
384 * @since 1.0.0
385 *
386 * If course public then enrollment not required
387 *
388 * @since 2.0.2
389 *
390 * @param string $template template to load.
391 *
392 * @return bool|string
393 */
394 public function load_quiz_template( $template ) {
395 global $wp_query, $post;
396
397 if ( $wp_query->is_single && ! empty( $wp_query->query_vars['post_type'] ) && 'tutor_quiz' === $wp_query->query_vars['post_type'] ) {
398 if ( is_user_logged_in() ) {
399 $has_content_access = tutor_utils()->has_enrolled_content_access( 'quiz' );
400 $course_id = tutor_utils()->get_course_id_by_content( $post );
401 $is_public = Course_List::is_public( $course_id );
402
403 // if public course don't need to be enrolled.
404 if ( $has_content_access || $is_public ) {
405 $template = tutor_get_template( 'single-quiz' );
406 } else {
407 $template = tutor_get_template( 'single.lesson.required-enroll' ); // You need to enroll first.
408 }
409 } else {
410 $template = tutor_get_template( 'login' );
411 }
412 return $template;
413 }
414 return $template;
415 }
416
417 /**
418 * Load assignment template
419 *
420 * @since 1.0.0
421 *
422 * @param string $template template file to load.
423 *
424 * @return string template path
425 */
426 public function load_assignment_template( $template ) {
427 global $wp_query;
428
429 if ( $wp_query->is_single && ! empty( $wp_query->query_vars['post_type'] ) && 'tutor_assignments' === $wp_query->query_vars['post_type'] ) {
430 if ( is_user_logged_in() ) {
431 $has_content_access = tutor_utils()->has_enrolled_content_access( 'assignment' );
432 if ( $has_content_access ) {
433 $template = tutor_get_template( 'single-assignment' );
434 } else {
435 $template = tutor_get_template( 'single.lesson.required-enroll' ); // You need to enroll first
436 }
437 } else {
438 $template = tutor_get_template( 'login' );
439 }
440 return $template;
441 }
442
443 return $template;
444 }
445
446 /**
447 * Student public profile
448 *
449 * @since 1.0.0
450 *
451 * @param string $template profile template.
452 *
453 * @return bool|string
454 */
455 public function student_public_profile( $template ) {
456 global $wp_query;
457 $query_var = $wp_query->query_vars;
458 if ( ! empty( $wp_query->query['tutor_profile_username'] ) ) {
459 $template = tutor_get_template( 'public-profile' );
460 }
461
462 return $template;
463 }
464
465 /**
466 * Show student Profile
467 *
468 * @since 1.0.0
469 *
470 * @return string
471 */
472 public function student_public_profile_title() {
473 global $wp_query;
474
475 if ( ! empty( $wp_query->query['tutor_profile_username'] ) ) {
476 global $wpdb;
477
478 $user_name = sanitize_text_field( $wp_query->query['tutor_profile_username'] );
479 $user = $wpdb->get_row( $wpdb->prepare( "SELECT display_name from {$wpdb->users} WHERE user_login = %s limit 1; ", $user_name ) );
480
481 if ( ! empty( $user->display_name ) ) {
482 return sprintf( "%s's %s", $user->display_name, __( 'Profile Page', 'tutor' ) );
483 }
484 }
485 return '';
486 }
487 }
488