PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.0.3
Tutor LMS – eLearning and online course solution v2.0.3
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 / Lesson.php
tutor / classes Last commit date
Addons.php 4 years ago Admin.php 4 years ago Ajax.php 4 years ago Announcements.php 4 years ago Assets.php 4 years ago Backend_Page_Trait.php 4 years ago Course.php 4 years ago Course_Filter.php 4 years ago Course_List.php 4 years ago Course_Settings_Tabs.php 4 years ago Course_Widget.php 4 years ago Custom_Validation.php 5 years ago Dashboard.php 4 years ago FormHandler.php 4 years ago Frontend.php 4 years ago Gutenberg.php 4 years ago Input.php 4 years ago Instructor.php 4 years ago Instructors_List.php 4 years ago Lesson.php 4 years ago Options_V2.php 4 years ago Post_types.php 4 years ago Private_Course_Access.php 4 years ago Q_and_A.php 4 years ago Question_Answers_List.php 4 years ago Quiz.php 4 years ago Quiz_Attempts_List.php 4 years ago RestAPI.php 4 years ago Reviews.php 4 years ago Rewrite_Rules.php 4 years ago Shortcode.php 4 years ago Student.php 4 years ago Students_List.php 4 years ago Taxonomies.php 4 years ago Template.php 4 years ago Theme_Compatibility.php 5 years ago Tools.php 4 years ago Tools_V2.php 4 years ago Tutor.php 4 years ago TutorEDD.php 4 years ago Tutor_Base.php 5 years ago Tutor_List_Table.php 4 years ago Tutor_Setup.php 4 years ago Upgrader.php 4 years ago User.php 4 years ago Utils.php 4 years ago Video_Stream.php 4 years ago Withdraw.php 4 years ago Withdraw_Requests_List.php 4 years ago WooCommerce.php 4 years ago
Lesson.php
416 lines
1 <?php
2 namespace TUTOR;
3
4 if ( ! defined( 'ABSPATH' ) ) {
5 exit;
6 }
7
8 class Lesson extends Tutor_Base {
9 public function __construct() {
10 parent::__construct();
11
12 add_action( 'add_meta_boxes', array( $this, 'register_meta_box' ) );
13 add_action( 'save_post_' . $this->lesson_post_type, array( $this, 'save_lesson_meta' ) );
14
15 add_action( 'wp_ajax_tutor_load_edit_lesson_modal', array( $this, 'tutor_load_edit_lesson_modal' ) );
16 add_action( 'wp_ajax_tutor_modal_create_or_update_lesson', array( $this, 'tutor_modal_create_or_update_lesson' ) );
17 add_action( 'wp_ajax_tutor_delete_lesson_by_id', array( $this, 'tutor_delete_lesson_by_id' ) );
18
19 add_filter( 'get_sample_permalink', array( $this, 'change_lesson_permalink' ), 10, 2 );
20 add_action( 'admin_init', array( $this, 'flush_rewrite_rules' ) );
21
22 /**
23 * Add Column
24 */
25
26 add_filter( "manage_{$this->lesson_post_type}_posts_columns", array( $this, 'add_column' ), 10, 1 );
27 add_action( "manage_{$this->lesson_post_type}_posts_custom_column", array( $this, 'custom_lesson_column' ), 10, 2 );
28
29 // Frontend Action
30 add_action( 'template_redirect', array( $this, 'mark_lesson_complete' ) );
31
32 add_action( 'wp_ajax_tutor_render_lesson_content', array( $this, 'tutor_render_lesson_content' ) );
33 add_action( 'wp_ajax_nopriv_tutor_render_lesson_content', array( $this, 'tutor_render_lesson_content' ) ); // For public course access
34
35 /**
36 * Autoplay next video
37 *
38 * @since v.1.4.9
39 */
40 add_action( 'wp_ajax_autoload_next_course_content', array( $this, 'autoload_next_course_content' ) );
41
42 /**
43 * Load next course item after click complete button
44 *
45 * @since v.1.5.3
46 */
47 add_action( 'tutor_lesson_completed_after', array( $this, 'tutor_lesson_completed_after' ), 999 );
48
49 add_action( 'wp_ajax_tutor_single_course_lesson_load_more', array($this, 'tutor_single_course_lesson_load_more') );
50 }
51
52 public function tutor_single_course_lesson_load_more() {
53 tutor_utils()->checking_nonce();
54
55 ob_start();
56 tutor_load_template('single.lesson.comment');
57 $html = ob_get_clean();
58
59 wp_send_json_success( array('html' => $html) );
60 }
61
62 /**
63 * Registering metabox
64 */
65 public function register_meta_box() {
66 $lesson_post_type = $this->lesson_post_type;
67
68 tutor_meta_box_wrapper( 'tutor-course-select', __( 'Select Course', 'tutor' ), array( $this, 'lesson_metabox' ), $lesson_post_type, 'advanced', 'default', 'tutor-admin-post-meta' );
69
70 tutor_meta_box_wrapper( 'tutor-lesson-videos', __( 'Lesson Video', 'tutor' ), array( $this, 'lesson_video_metabox' ), $lesson_post_type, 'advanced', 'default', 'tutor-admin-post-meta' );
71
72 tutor_meta_box_wrapper( 'tutor-lesson-attachments', __( 'Attachments', 'tutor' ), array( $this, 'lesson_attachments_metabox' ), $lesson_post_type, 'advanced', 'default', 'tutor-admin-post-meta' );
73 }
74
75 public function lesson_metabox() {
76 include tutor()->path . 'views/metabox/lesson-metabox.php';
77 }
78
79 public function lesson_video_metabox() {
80 include tutor()->path . 'views/metabox/video-metabox.php';
81 }
82
83 public function lesson_attachments_metabox() {
84 include tutor()->path . 'views/metabox/lesson-attachments-metabox.php';
85 }
86
87 /**
88 * @param $post_ID
89 *
90 * Saving lesson meta and assets
91 */
92 public function save_lesson_meta( $post_ID ) {
93 //Video
94 $video_source = sanitize_text_field( tutor_utils()->array_get('video.source', $_POST) );
95 if ( $video_source === '-1'){
96 delete_post_meta($post_ID, '_video');
97 }elseif($video_source) {
98 $video = (array)tutor_utils()->array_get('video', $_POST, array());
99 update_post_meta($post_ID, '_video', $video);
100 }
101
102 // Attachments
103 $attachments = array();
104 if ( ! empty($_POST['tutor_attachments'])){
105 $attachments = tutor_utils()->sanitize_array($_POST['tutor_attachments']);
106 $attachments = array_unique($attachments);
107 }
108
109 /**
110 * it !empty attachment then update meta else
111 * delete meta key to prevetn empty data in db
112 *
113 * @since 1.8.9
114 */
115 if ( ! empty( $attachments ) ) {
116 update_post_meta( $post_ID, '_tutor_attachments', $attachments );
117 } else {
118 delete_post_meta( $post_ID, '_tutor_attachments' );
119 }
120
121 }
122
123 public function tutor_load_edit_lesson_modal(){
124 tutor_utils()->checking_nonce();
125
126 $lesson_id = (int) tutor_utils()->avalue_dot( 'lesson_id', tutor_sanitize_data($_POST) );
127 $topic_id = (int) $_POST['topic_id'];
128
129 if(!tutor_utils()->can_user_manage('topic', $topic_id)) {
130 wp_send_json_error( array('message'=>__('Access Denied', 'tutor')) );
131 }
132
133 /**
134 * If Lesson Not Exists, provide dummy
135 */
136 $post_arr = array(
137 'ID' => 0,
138 'post_content' => '',
139 'post_type' => $this->lesson_post_type,
140 'post_title' => __( 'Draft Lesson', 'tutor' ),
141 'post_status' => 'publish',
142 'post_author' => get_current_user_id(),
143 'post_parent' => $topic_id,
144 );
145
146 $post = $lesson_id ? get_post($lesson_id) : (object)$post_arr;
147
148 ob_start();
149 include tutor()->path . 'views/modal/edit-lesson.php';
150 $output = ob_get_clean();
151
152 wp_send_json_success( array( 'output' => $output ) );
153 }
154
155 /**
156 * @since v.1.0.0
157 * @updated v.1.5.1
158 */
159 public function tutor_modal_create_or_update_lesson(){
160 tutor_utils()->checking_nonce();
161
162 global $wpdb;
163
164 $lesson_id = (int) sanitize_text_field(tutor_utils()->avalue_dot('lesson_id', $_POST));
165 $topic_id = (int) sanitize_text_field(tutor_utils()->avalue_dot('current_topic_id', $_POST));
166 $current_topic_id = $topic_id;
167 $course_id = tutor_utils()->get_course_id_by('topic', $topic_id);
168 $_lesson_thumbnail_id = (int) sanitize_text_field(tutor_utils()->avalue_dot('_lesson_thumbnail_id', $_POST));
169
170 if(!tutor_utils()->can_user_manage('topic', $topic_id)) {
171 wp_send_json_error( array('message'=>__('Access Denied', 'tutor')) );
172 }
173
174 $lesson_id = (int) sanitize_text_field( tutor_utils()->avalue_dot( 'lesson_id', $_POST ) );
175 $topic_id = (int) sanitize_text_field( tutor_utils()->avalue_dot( 'current_topic_id', $_POST ) );
176 $course_id = tutor_utils()->get_course_id_by( 'topic', $topic_id );
177 $_lesson_thumbnail_id = (int) tutor_utils()->avalue_dot( '_lesson_thumbnail_id', $_POST );
178
179 if ( ! tutils()->can_user_manage( 'topic', $topic_id ) ) {
180 wp_send_json_error( array( 'message' => __( 'Access Denied', 'tutor' ) ) );
181 }
182
183 $title = sanitize_text_field( $_POST['lesson_title'] );
184 $lesson_content = wp_kses_post( $_POST['lesson_content'] );
185
186 $lesson_data = array(
187 'post_type' => $this->lesson_post_type,
188 'post_title' => $title,
189 'post_name' => sanitize_title($title),
190 'post_content' => $lesson_content,
191 'post_status' => 'publish',
192 'comment_status' => 'open',
193 'post_author' => get_current_user_id(),
194 'post_parent' => $topic_id
195 );
196
197 if ( $lesson_id == 0 ) {
198
199 $lesson_data['menu_order'] = tutor_utils()->get_next_course_content_order_id( $topic_id );
200 $lesson_id = wp_insert_post( $lesson_data );
201
202 if ( $lesson_id ) {
203 do_action( 'tutor/lesson/created', $lesson_id );
204 } else {
205 wp_send_json_error( array( 'message' => __( 'Couldn\'t create lesson.', 'tutor' ) ) );
206 }
207 } else {
208 $lesson_data['ID'] = $lesson_id;
209
210 do_action( 'tutor/lesson_update/before', $lesson_id );
211 wp_update_post( $lesson_data );
212 if ( $_lesson_thumbnail_id ) {
213 update_post_meta( $lesson_id, '_thumbnail_id', $_lesson_thumbnail_id );
214 } else {
215 delete_post_meta( $lesson_id, '_thumbnail_id' );
216 }
217
218 do_action( 'tutor/lesson_update/after', $lesson_id );
219 }
220
221 ob_start();
222 include tutor()->path . 'views/metabox/course-contents.php';
223 $course_contents = ob_get_clean();
224
225 wp_send_json_success( array( 'course_contents' => $course_contents ) );
226 }
227
228 /**
229 * Delete Lesson from course builder
230 */
231 public function tutor_delete_lesson_by_id(){
232 tutor_utils()->checking_nonce();
233
234 $lesson_id = (int) tutor_utils()->avalue_dot( 'lesson_id', $_POST );
235
236 if(!tutor_utils()->can_user_manage('lesson', $lesson_id)) {
237 wp_send_json_error( array('message'=>__('Access Denied', 'tutor')) );
238 }
239
240 wp_delete_post( $lesson_id, true );
241 wp_send_json_success();
242 }
243
244
245 /**
246 * @param $uri
247 * @param $lesson_id
248 *
249 * @return mixed
250 *
251 * Changed the URI based
252 */
253
254 public function change_lesson_permalink( $uri, $lesson_id ) {
255 $post = get_post( $lesson_id );
256
257 if ( $post && $post->post_type === $this->lesson_post_type ) {
258 $uri_base = trailingslashit( site_url() );
259
260 $sample_course = 'sample-course';
261 $is_course = tutor_utils()->get_course_id_by( 'lesson', get_the_ID() );
262 if ( $is_course ) {
263 $course = get_post( $is_course );
264 if ( $course ) {
265 $sample_course = $course->post_name;
266 }
267 }
268
269 $new_course_base = $uri_base . "course/{$sample_course}/lesson/%pagename%/";
270 $uri[0] = $new_course_base;
271 }
272
273 return $uri;
274 }
275
276
277 public function flush_rewrite_rules() {
278 $is_required_flush = get_option( 'required_rewrite_flush' );
279 if ( $is_required_flush ) {
280 flush_rewrite_rules();
281 delete_option( 'required_rewrite_flush' );
282 }
283 }
284
285
286 public function add_column( $columns ) {
287 $date_col = $columns['date'];
288 unset( $columns['date'] );
289 $columns['course'] = __( 'Course', 'tutor' );
290 $columns['date'] = $date_col;
291
292 return $columns;
293 }
294
295 /**
296 * @param $column
297 * @param $post_id
298 */
299 public function custom_lesson_column( $column, $post_id ) {
300 if ( $column === 'course' ) {
301
302 $course_id = tutor_utils()->get_course_id_by( 'lesson', $post_id );
303 if ( $course_id ) {
304 echo '<a href="' . admin_url( 'post.php?post=' . $course_id . '&action=edit' ) . '">' . get_the_title( $course_id ) . '</a>';
305 }
306 }
307 }
308
309 /**
310 *
311 * Mark lesson completed
312 *
313 * @since v.1.0.0
314 */
315 public function mark_lesson_complete() {
316 if ( ! isset( $_POST['tutor_action'] ) || $_POST['tutor_action'] !== 'tutor_complete_lesson' ) {
317 return;
318 }
319 // Checking nonce
320 tutor_utils()->checking_nonce();
321
322 $user_id = get_current_user_id();
323
324 // TODO: need to show view if not signed_in
325 if ( ! $user_id ) {
326 die( __( 'Please Sign-In', 'tutor' ) );
327 }
328
329 $lesson_id = (int) $_POST['lesson_id'];
330
331 do_action( 'tutor_lesson_completed_before', $lesson_id );
332 /**
333 * Marking lesson at user meta, meta format, _tutor_completed_lesson_id_{id} and value = tutor_time();
334 */
335 tutor_utils()->mark_lesson_complete( $lesson_id );
336
337 do_action( 'tutor_lesson_completed_email_after', $lesson_id, $user_id );
338 do_action( 'tutor_lesson_completed_after', $lesson_id, $user_id );
339 }
340
341 /**
342 * Render the lesson content
343 */
344 public function tutor_render_lesson_content(){
345 tutor_utils()->checking_nonce();
346
347 $lesson_id = (int) tutor_utils()->avalue_dot( 'lesson_id', $_POST );
348
349 $ancestors = get_post_ancestors($lesson_id);
350 $course_id = !empty($ancestors) ? array_pop($ancestors): $lesson_id;
351
352 // Course must be public or current user must be enrolled to access this lesson
353 if(get_post_meta($course_id, '_tutor_is_public_course', true)!=='yes' && !tutor_utils()->is_enrolled($course_id)){
354
355 $is_admin = tutor_utils()->has_user_role('administrator');
356 $allowed = $is_admin ? true : tutor_utils()->is_instructor_of_this_course(get_current_user_id(), $course_id);
357
358 if ( ! $allowed ) {
359 http_response_code( 400 );
360 exit;
361 }
362 }
363
364 ob_start();
365 global $post;
366
367 $post = get_post( $lesson_id );
368 setup_postdata( $post );
369 tutor_lesson_content();
370 wp_reset_postdata();
371
372 $html = ob_get_clean();
373
374 wp_send_json_success(array('html' => $html));
375 }
376
377 /**
378 * Load next course item automatically
379 *
380 * @since v.1.4.9
381 */
382 public function autoload_next_course_content() {
383 tutor_utils()->checking_nonce();
384
385 $post_id = sanitize_text_field($_POST['post_id']);
386 $content_id = tutor_utils()->get_post_id($post_id);
387 $contents = tutor_utils()->get_course_prev_next_contents_by_id($content_id);
388
389 $autoload_course_content = (bool) get_tutor_option( 'autoload_next_course_content' );
390 $next_url = false;
391 if ( $autoload_course_content ) {
392 $next_url = get_the_permalink( $contents->next_id );
393 }
394 wp_send_json_success( array( 'next_url' => $next_url ) );
395 }
396
397 /**
398 * Load next course item after click complete button
399 *
400 * @since v.1.5.3
401 */
402 public function tutor_lesson_completed_after( $content_id ) {
403 $contents = tutor_utils()->get_course_prev_next_contents_by_id( $content_id );
404 $autoload_course_content = (bool) get_tutor_option( 'autoload_next_course_content' );
405 if ( $autoload_course_content ) {
406 wp_redirect( get_the_permalink( $contents->next_id ) );
407 } else {
408 wp_redirect( get_the_permalink( $content_id ) );
409 }
410 die();
411 }
412
413 }
414
415
416