PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 1.9.5
Tutor LMS – eLearning and online course solution v1.9.5
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 Assets.php 4 years ago Course.php 4 years ago Course_Filter.php 4 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 4 years ago Instructor.php 4 years ago Instructors_List.php 4 years ago Lesson.php 4 years ago Options.php 4 years ago Post_types.php 4 years ago Private_Course_Access.php 5 years ago Q_and_A.php 5 years ago Question_Answers_List.php 4 years ago Quiz.php 5 years ago Quiz_Attempts_List.php 4 years ago RestAPI.php 5 years ago Rewrite_Rules.php 5 years ago Shortcode.php 4 years ago Student.php 5 years ago Students_List.php 5 years ago Taxonomies.php 5 years ago Template.php 4 years ago Theme_Compatibility.php 5 years ago Tools.php 5 years ago Tutor.php 4 years ago TutorEDD.php 5 years ago Tutor_Base.php 5 years ago Tutor_List_Table.php 4 years ago Tutor_Setup.php 5 years ago Upgrader.php 5 years ago User.php 4 years ago Utils.php 4 years ago Video_Stream.php 5 years ago Withdraw.php 5 years ago Withdraw_Requests_List.php 4 years ago WooCommerce.php 4 years ago
Lesson.php
398 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 $course_id = tutor_utils()->get_course_id_by('topic', $topic_id);
158 $_lesson_thumbnail_id = (int) sanitize_text_field(tutor_utils()->avalue_dot('_lesson_thumbnail_id', $_POST));
159
160 if(!tutils()->can_user_manage('topic', $topic_id)) {
161 wp_send_json_error( array('message'=>__('Access Denied', 'tutor')) );
162 }
163
164
165 $title = sanitize_text_field($_POST['lesson_title']);
166 $lesson_content = wp_kses_post($_POST['lesson_content']);
167
168 $lesson_data = array(
169 'post_type' => $this->lesson_post_type,
170 'post_title' => $title,
171 'post_name' => sanitize_title($title),
172 'post_content' => $lesson_content,
173 'post_status' => 'publish',
174 'post_author' => get_current_user_id(),
175 'post_parent' => $topic_id
176 );
177
178 if($lesson_id==0) {
179
180 $lesson_data['menu_order'] = tutor_utils()->get_next_course_content_order_id( $topic_id );
181 $lesson_id = wp_insert_post( $lesson_data );
182
183 if ($lesson_id ) {
184 do_action('tutor/lesson/created', $lesson_id);
185 update_post_meta( $lesson_id, '_tutor_course_id_for_lesson', $course_id );
186 } else {
187 wp_send_json_error( array('message' => __('Couldn\'t create lesson.', 'tutor')) );
188 }
189 } else {
190 $lesson_data['ID']=$lesson_id;
191
192 do_action('tutor/lesson_update/before', $lesson_id);
193 wp_update_post($lesson_data);
194 if ($_lesson_thumbnail_id){
195 update_post_meta($lesson_id, '_thumbnail_id', $_lesson_thumbnail_id);
196 } else {
197 delete_post_meta($lesson_id, '_thumbnail_id');
198 }
199 do_action('tutor/lesson_update/after', $lesson_id);
200 }
201
202 ob_start();
203 include tutor()->path.'views/metabox/course-contents.php';
204 $course_contents = ob_get_clean();
205
206 wp_send_json_success(array('course_contents' => $course_contents));
207 }
208
209 /**
210 * Delete Lesson from course builder
211 */
212 public function tutor_delete_lesson_by_id(){
213 tutils()->checking_nonce();
214
215 $lesson_id = (int) sanitize_text_field(tutor_utils()->avalue_dot('lesson_id', $_POST));
216
217 if(!tutils()->can_user_manage('lesson', $lesson_id)) {
218 wp_send_json_error( array('message'=>__('Access Denied', 'tutor')) );
219 }
220
221 wp_delete_post($lesson_id, true);
222 delete_post_meta($lesson_id, '_tutor_course_id_for_lesson');
223 wp_send_json_success();
224 }
225
226
227 /**
228 * @param $uri
229 * @param $lesson_id
230 *
231 * @return mixed
232 *
233 * Changed the URI based
234 */
235
236 public function change_lesson_permalink($uri, $lesson_id){
237 $post = get_post($lesson_id);
238
239 if ($post && $post->post_type === $this->lesson_post_type){
240 $uri_base = trailingslashit(site_url());
241
242 $sample_course = "sample-course";
243 $is_course = get_post_meta(get_the_ID(), '_tutor_course_id_for_lesson', true);
244 if ($is_course){
245 $course = get_post($is_course);
246 if ($course){
247 $sample_course = $course->post_name;
248 }
249 }
250
251 $new_course_base = $uri_base."course/{$sample_course}/lesson/%pagename%/";
252 $uri[0] = $new_course_base;
253 }
254
255 return $uri;
256 }
257
258
259 public function flush_rewrite_rules(){
260 $is_required_flush = get_option('required_rewrite_flush');
261 if ($is_required_flush){
262 flush_rewrite_rules();
263 delete_option( 'required_rewrite_flush' );
264 }
265 }
266
267
268 public function add_column($columns){
269 $date_col = $columns['date'];
270 unset($columns['date']);
271 $columns['course'] = __('Course', 'tutor');
272 $columns['date'] = $date_col;
273
274 return $columns;
275 }
276
277 /**
278 * @param $column
279 * @param $post_id
280 *
281 */
282 public function custom_lesson_column($column, $post_id ){
283 if ($column === 'course'){
284
285 $course_id = get_post_meta($post_id, '_tutor_course_id_for_lesson', true);
286 if ($course_id){
287 echo '<a href="'.admin_url('post.php?post='.$course_id.'&action=edit').'">'.get_the_title($course_id).'</a>';
288 }
289
290 }
291 }
292
293 /**
294 *
295 * Mark lesson completed
296 *
297 * @since v.1.0.0
298 */
299 public function mark_lesson_complete(){
300 if ( ! isset($_POST['tutor_action']) || $_POST['tutor_action'] !== 'tutor_complete_lesson' ){
301 return;
302 }
303 //Checking nonce
304 tutor_utils()->checking_nonce();
305
306 $user_id = get_current_user_id();
307
308 //TODO: need to show view if not signed_in
309 if ( ! $user_id){
310 die(__('Please Sign-In', 'tutor'));
311 }
312
313 $lesson_id = (int) sanitize_text_field($_POST['lesson_id']);
314
315 do_action('tutor_lesson_completed_before', $lesson_id);
316 /**
317 * Marking lesson at user meta, meta format, _tutor_completed_lesson_id_{id} and value = tutor_time();
318 */
319 tutor_utils()->mark_lesson_complete($lesson_id);
320
321 do_action('tutor_lesson_completed_after', $lesson_id, $user_id);
322 }
323
324 /**
325 * Render the lesson content
326 */
327 public function tutor_render_lesson_content(){
328 tutils()->checking_nonce();
329
330 $lesson_id = (int) sanitize_text_field(tutor_utils()->avalue_dot('lesson_id', $_POST));
331
332 $ancestors = get_post_ancestors($lesson_id);
333 $course_id = !empty($ancestors) ? array_pop($ancestors): $lesson_id;
334
335 // Course must be public or current user must be enrolled to access this lesson
336 if(get_post_meta($course_id, '_tutor_is_public_course', true)!=='yes' && !tutils()->is_enrolled($course_id)){
337
338 $is_admin = tutor_utils()->has_user_role('administrator');
339 $allowed = $is_admin ? true : tutor_utils()->is_instructor_of_this_course(get_current_user_id(), $course_id);
340
341 if( !$allowed ) {
342 http_response_code(400);
343 exit;
344 }
345 }
346
347 ob_start();
348 global $post;
349
350 $post = get_post($lesson_id);
351 setup_postdata($post);
352 tutor_lesson_content();
353 wp_reset_postdata();
354
355 $html = ob_get_clean();
356 wp_send_json_success(array('html' => $html));
357 }
358
359 /**
360 * Load next course item automatically
361 *
362 * @since v.1.4.9
363 */
364 public function autoload_next_course_content(){
365 tutor_utils()->checking_nonce();
366
367 $post_id = sanitize_text_field($_POST['post_id']);
368 $content_id = tutils()->get_post_id($post_id);
369 $contents = tutor_utils()->get_course_prev_next_contents_by_id($content_id);
370
371 $autoload_course_content = (bool) get_tutor_option('autoload_next_course_content');
372 $next_url = false;
373 if($autoload_course_content) {
374 $next_url = get_the_permalink($contents->next_id);
375 }
376 wp_send_json_success(array('next_url' => $next_url));
377 }
378
379 /**
380 * Load next course item after click complete button
381 *
382 * @since v.1.5.3
383 */
384 public function tutor_lesson_completed_after($content_id){
385 $contents = tutor_utils()->get_course_prev_next_contents_by_id($content_id);
386 $autoload_course_content = (bool) get_tutor_option('autoload_next_course_content');
387 if($autoload_course_content) {
388 wp_redirect(get_the_permalink($contents->next_id));
389 } else {
390 wp_redirect(get_the_permalink($content_id));
391 }
392 die();
393 }
394
395 }
396
397
398