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