PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.0.2
Tutor LMS – eLearning and online course solution v2.0.2
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
415 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 do_action( 'tutor/lesson_update/after', $lesson_id );
218 }
219
220 ob_start();
221 include tutor()->path . 'views/metabox/course-contents.php';
222 $course_contents = ob_get_clean();
223
224 wp_send_json_success( array( 'course_contents' => $course_contents ) );
225 }
226
227 /**
228 * Delete Lesson from course builder
229 */
230 public function tutor_delete_lesson_by_id(){
231 tutor_utils()->checking_nonce();
232
233 $lesson_id = (int) tutor_utils()->avalue_dot( 'lesson_id', $_POST );
234
235 if(!tutor_utils()->can_user_manage('lesson', $lesson_id)) {
236 wp_send_json_error( array('message'=>__('Access Denied', 'tutor')) );
237 }
238
239 wp_delete_post( $lesson_id, true );
240 wp_send_json_success();
241 }
242
243
244 /**
245 * @param $uri
246 * @param $lesson_id
247 *
248 * @return mixed
249 *
250 * Changed the URI based
251 */
252
253 public function change_lesson_permalink( $uri, $lesson_id ) {
254 $post = get_post( $lesson_id );
255
256 if ( $post && $post->post_type === $this->lesson_post_type ) {
257 $uri_base = trailingslashit( site_url() );
258
259 $sample_course = 'sample-course';
260 $is_course = tutor_utils()->get_course_id_by( 'lesson', get_the_ID() );
261 if ( $is_course ) {
262 $course = get_post( $is_course );
263 if ( $course ) {
264 $sample_course = $course->post_name;
265 }
266 }
267
268 $new_course_base = $uri_base . "course/{$sample_course}/lesson/%pagename%/";
269 $uri[0] = $new_course_base;
270 }
271
272 return $uri;
273 }
274
275
276 public function flush_rewrite_rules() {
277 $is_required_flush = get_option( 'required_rewrite_flush' );
278 if ( $is_required_flush ) {
279 flush_rewrite_rules();
280 delete_option( 'required_rewrite_flush' );
281 }
282 }
283
284
285 public function add_column( $columns ) {
286 $date_col = $columns['date'];
287 unset( $columns['date'] );
288 $columns['course'] = __( 'Course', 'tutor' );
289 $columns['date'] = $date_col;
290
291 return $columns;
292 }
293
294 /**
295 * @param $column
296 * @param $post_id
297 */
298 public function custom_lesson_column( $column, $post_id ) {
299 if ( $column === 'course' ) {
300
301 $course_id = tutor_utils()->get_course_id_by( 'lesson', $post_id );
302 if ( $course_id ) {
303 echo '<a href="' . admin_url( 'post.php?post=' . $course_id . '&action=edit' ) . '">' . get_the_title( $course_id ) . '</a>';
304 }
305 }
306 }
307
308 /**
309 *
310 * Mark lesson completed
311 *
312 * @since v.1.0.0
313 */
314 public function mark_lesson_complete() {
315 if ( ! isset( $_POST['tutor_action'] ) || $_POST['tutor_action'] !== 'tutor_complete_lesson' ) {
316 return;
317 }
318 // Checking nonce
319 tutor_utils()->checking_nonce();
320
321 $user_id = get_current_user_id();
322
323 // TODO: need to show view if not signed_in
324 if ( ! $user_id ) {
325 die( __( 'Please Sign-In', 'tutor' ) );
326 }
327
328 $lesson_id = (int) $_POST['lesson_id'];
329
330 do_action( 'tutor_lesson_completed_before', $lesson_id );
331 /**
332 * Marking lesson at user meta, meta format, _tutor_completed_lesson_id_{id} and value = tutor_time();
333 */
334 tutor_utils()->mark_lesson_complete( $lesson_id );
335
336 do_action( 'tutor_lesson_completed_email_after', $lesson_id, $user_id );
337 do_action( 'tutor_lesson_completed_after', $lesson_id, $user_id );
338 }
339
340 /**
341 * Render the lesson content
342 */
343 public function tutor_render_lesson_content(){
344 tutor_utils()->checking_nonce();
345
346 $lesson_id = (int) tutor_utils()->avalue_dot( 'lesson_id', $_POST );
347
348 $ancestors = get_post_ancestors($lesson_id);
349 $course_id = !empty($ancestors) ? array_pop($ancestors): $lesson_id;
350
351 // Course must be public or current user must be enrolled to access this lesson
352 if(get_post_meta($course_id, '_tutor_is_public_course', true)!=='yes' && !tutor_utils()->is_enrolled($course_id)){
353
354 $is_admin = tutor_utils()->has_user_role('administrator');
355 $allowed = $is_admin ? true : tutor_utils()->is_instructor_of_this_course(get_current_user_id(), $course_id);
356
357 if ( ! $allowed ) {
358 http_response_code( 400 );
359 exit;
360 }
361 }
362
363 ob_start();
364 global $post;
365
366 $post = get_post( $lesson_id );
367 setup_postdata( $post );
368 tutor_lesson_content();
369 wp_reset_postdata();
370
371 $html = ob_get_clean();
372
373 wp_send_json_success(array('html' => $html));
374 }
375
376 /**
377 * Load next course item automatically
378 *
379 * @since v.1.4.9
380 */
381 public function autoload_next_course_content() {
382 tutor_utils()->checking_nonce();
383
384 $post_id = sanitize_text_field($_POST['post_id']);
385 $content_id = tutor_utils()->get_post_id($post_id);
386 $contents = tutor_utils()->get_course_prev_next_contents_by_id($content_id);
387
388 $autoload_course_content = (bool) get_tutor_option( 'autoload_next_course_content' );
389 $next_url = false;
390 if ( $autoload_course_content ) {
391 $next_url = get_the_permalink( $contents->next_id );
392 }
393 wp_send_json_success( array( 'next_url' => $next_url ) );
394 }
395
396 /**
397 * Load next course item after click complete button
398 *
399 * @since v.1.5.3
400 */
401 public function tutor_lesson_completed_after( $content_id ) {
402 $contents = tutor_utils()->get_course_prev_next_contents_by_id( $content_id );
403 $autoload_course_content = (bool) get_tutor_option( 'autoload_next_course_content' );
404 if ( $autoload_course_content ) {
405 wp_redirect( get_the_permalink( $contents->next_id ) );
406 } else {
407 wp_redirect( get_the_permalink( $content_id ) );
408 }
409 die();
410 }
411
412 }
413
414
415