PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.2.4
Tutor LMS – eLearning and online course solution v2.2.4
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 2 years ago Admin.php 2 years ago Ajax.php 3 years ago Announcements.php 3 years ago Assets.php 3 years ago Backend_Page_Trait.php 3 years ago Course.php 3 years ago Course_Embed.php 3 years ago Course_Filter.php 3 years ago Course_List.php 2 years ago Course_Settings_Tabs.php 3 years ago Course_Widget.php 3 years ago Custom_Validation.php 3 years ago Dashboard.php 3 years ago FormHandler.php 2 years ago Frontend.php 3 years ago Gutenberg.php 3 years ago Input.php 3 years ago Instructor.php 2 years ago Instructors_List.php 3 years ago Lesson.php 2 years ago Options_V2.php 2 years ago Post_types.php 3 years ago Private_Course_Access.php 3 years ago Q_and_A.php 3 years ago Question_Answers_List.php 3 years ago Quiz.php 2 years ago Quiz_Attempts_List.php 2 years ago RestAPI.php 3 years ago Reviews.php 3 years ago Rewrite_Rules.php 3 years ago Shortcode.php 2 years ago Student.php 2 years ago Students_List.php 3 years ago Taxonomies.php 3 years ago Template.php 2 years ago Theme_Compatibility.php 3 years ago Tools.php 3 years ago Tools_V2.php 3 years ago Tutor.php 3 years ago TutorEDD.php 2 years ago Tutor_Base.php 3 years ago Tutor_Setup.php 3 years ago Upgrader.php 3 years ago User.php 3 years ago Utils.php 2 years ago Video_Stream.php 3 years ago Withdraw.php 2 years ago Withdraw_Requests_List.php 3 years ago WooCommerce.php 2 years ago
Lesson.php
645 lines
1 <?php
2 /**
3 * Manage Lesson
4 *
5 * @package Tutor
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 use Tutor\Models\LessonModel;
18
19 /**
20 * Lesson class
21 *
22 * @since 1.0.0
23 */
24 class Lesson extends Tutor_Base {
25
26 /**
27 * Register hooks
28 *
29 * @since 1.0.0
30 *
31 * @return void
32 */
33 public function __construct() {
34 parent::__construct();
35
36 add_action( 'add_meta_boxes', array( $this, 'register_meta_box' ) );
37 add_action( 'save_post_' . $this->lesson_post_type, array( $this, 'save_lesson_meta' ) );
38
39 add_action( 'wp_ajax_tutor_load_edit_lesson_modal', array( $this, 'tutor_load_edit_lesson_modal' ) );
40 add_action( 'wp_ajax_tutor_modal_create_or_update_lesson', array( $this, 'tutor_modal_create_or_update_lesson' ) );
41 add_action( 'wp_ajax_tutor_delete_lesson_by_id', array( $this, 'tutor_delete_lesson_by_id' ) );
42
43 add_filter( 'get_sample_permalink', array( $this, 'change_lesson_permalink' ), 10, 2 );
44 add_action( 'admin_init', array( $this, 'flush_rewrite_rules' ) );
45
46 /**
47 * Add Column
48 */
49 add_filter( "manage_{$this->lesson_post_type}_posts_columns", array( $this, 'add_column' ), 10, 1 );
50 add_action( "manage_{$this->lesson_post_type}_posts_custom_column", array( $this, 'custom_lesson_column' ), 10, 2 );
51
52 /**
53 * Frontend Action
54 */
55 add_action( 'template_redirect', array( $this, 'mark_lesson_complete' ) );
56
57 add_action( 'wp_ajax_tutor_render_lesson_content', array( $this, 'tutor_render_lesson_content' ) );
58
59 /**
60 * For public course access
61 */
62 add_action( 'wp_ajax_nopriv_tutor_render_lesson_content', array( $this, 'tutor_render_lesson_content' ) );
63
64 /**
65 * Autoplay next video
66 *
67 * @since 1.4.9
68 */
69 add_action( 'wp_ajax_autoload_next_course_content', array( $this, 'autoload_next_course_content' ) );
70
71 /**
72 * Load next course item after click complete button
73 *
74 * @since 1.5.3
75 */
76 add_action( 'tutor_lesson_completed_after', array( $this, 'tutor_lesson_completed_after' ), 999 );
77
78 /**
79 * Lesson comment & reply ajax handler
80 *
81 * @since 2.0.0
82 */
83 add_action( 'wp_ajax_tutor_single_course_lesson_load_more', array( $this, 'tutor_single_course_lesson_load_more' ) );
84 add_action( 'wp_ajax_tutor_create_lesson_comment', array( $this, 'tutor_single_course_lesson_load_more' ) );
85 add_action( 'wp_ajax_tutor_reply_lesson_comment', array( $this, 'reply_lesson_comment' ) );
86 }
87
88 /**
89 * Manage load more & comment create
90 *
91 * @since 2.0.6
92 * @return void send wp json data
93 */
94 public function tutor_single_course_lesson_load_more() {
95 tutor_utils()->checking_nonce();
96 if ( 'tutor_create_lesson_comment' === Input::post( 'action' ) ) {
97 $comment_data = array(
98 'comment_content' => Input::post( 'comment', '', Input::TYPE_KSES_POST ),
99 'comment_post_ID' => Input::post( 'comment_post_ID', 0, Input::TYPE_INT ),
100 'comment_parent' => Input::post( 'comment_parent', 0, Input::TYPE_INT ),
101 );
102 self::create_comment( $comment_data );
103 }
104 ob_start();
105 tutor_load_template( 'single.lesson.comment' );
106 $html = ob_get_clean();
107
108 wp_send_json_success( array( 'html' => $html ) );
109 }
110
111 /**
112 * Registering metabox
113 *
114 * @since 1.0.0
115 * @return void
116 */
117 public function register_meta_box() {
118 $lesson_post_type = $this->lesson_post_type;
119
120 tutor_meta_box_wrapper( 'tutor-course-select', __( 'Select Course', 'tutor' ), array( $this, 'lesson_metabox' ), $lesson_post_type, 'advanced', 'default', 'tutor-admin-post-meta' );
121
122 tutor_meta_box_wrapper( 'tutor-lesson-videos', __( 'Lesson Video', 'tutor' ), array( $this, 'lesson_video_metabox' ), $lesson_post_type, 'advanced', 'default', 'tutor-admin-post-meta' );
123
124 tutor_meta_box_wrapper( 'tutor-lesson-attachments', __( 'Attachments', 'tutor' ), array( $this, 'lesson_attachments_metabox' ), $lesson_post_type, 'advanced', 'default', 'tutor-admin-post-meta' );
125 }
126
127 /**
128 * Lesson metabox
129 *
130 * @since 1.0.0
131 *
132 * @return void
133 */
134 public function lesson_metabox() {
135 include tutor()->path . 'views/metabox/lesson-metabox.php';
136 }
137
138 /**
139 * Video metabox
140 *
141 * @since 1.0.0
142 *
143 * @return void
144 */
145 public function lesson_video_metabox() {
146 include tutor()->path . 'views/metabox/video-metabox.php';
147 }
148
149 /**
150 * Attachment metabox
151 *
152 * @since 1.0.0
153 *
154 * @return void
155 */
156 public function lesson_attachments_metabox() {
157 include tutor()->path . 'views/metabox/lesson-attachments-metabox.php';
158 }
159
160 /**
161 * Saving lesson meta and assets
162 *
163 * @since 1.0.0
164 *
165 * @param integer $post_ID post ID.
166 * @return void
167 */
168 public function save_lesson_meta( $post_ID ) {
169 $video_source = sanitize_text_field( tutor_utils()->array_get( 'video.source', $_POST ) ); //phpcs:ignore
170 if ( '-1' === $video_source ) {
171 delete_post_meta( $post_ID, '_video' );
172 } elseif ( $video_source ) {
173
174 // Sanitize data through helper method.
175 $video = Input::sanitize_array(
176 $_POST['video'] ?? array(), //phpcs:ignore
177 array(
178 'source_external_url' => 'esc_url',
179 'source_embedded' => 'wp_kses_post',
180 ),
181 true
182 );
183 update_post_meta( $post_ID, '_video', $video );
184 }
185
186 // Attachments.
187 $attachments = array();
188 // phpcs:disable WordPress.Security.NonceVerification.Missing
189 if ( ! empty( $_POST['tutor_attachments'] ) ) {
190 //phpcs:ignore -- data sanitized through helper method.
191 $attachments = tutor_utils()->sanitize_array( wp_unslash( $_POST['tutor_attachments'] ) );
192 $attachments = array_unique( $attachments );
193 }
194
195 /**
196 * If !empty attachment then update meta else
197 * delete meta key to prevent empty data in db
198 *
199 * @since 1.8.9
200 */
201 if ( ! empty( $attachments ) ) {
202 update_post_meta( $post_ID, '_tutor_attachments', $attachments );
203 } else {
204 delete_post_meta( $post_ID, '_tutor_attachments' );
205 }
206
207 }
208
209 /**
210 * Load edit lesson modal
211 *
212 * @since 1.0.0
213 *
214 * @return void
215 */
216 public function tutor_load_edit_lesson_modal() {
217 tutor_utils()->checking_nonce();
218
219 $lesson_id = Input::post( 'lesson_id', 0, Input::TYPE_INT );
220 $topic_id = Input::post( 'topic_id', 0, Input::TYPE_INT );
221
222 if ( ! tutor_utils()->can_user_manage( 'topic', $topic_id ) ) {
223 wp_send_json_error( array( 'message' => __( 'Access Denied', 'tutor' ) ) );
224 }
225
226 /**
227 * If Lesson Not Exists, provide dummy
228 */
229 $post_arr = array(
230 'ID' => 0,
231 'post_content' => '',
232 'post_type' => $this->lesson_post_type,
233 'post_title' => __( 'Draft Lesson', 'tutor' ),
234 'post_status' => 'publish',
235 'post_author' => get_current_user_id(),
236 'post_parent' => $topic_id,
237 );
238
239 $post = $lesson_id ? get_post( $lesson_id ) : (object) $post_arr;
240
241 ob_start();
242 include tutor()->path . 'views/modal/edit-lesson.php';
243 $output = ob_get_clean();
244
245 wp_send_json_success( array( 'output' => $output ) );
246 }
247
248 /**
249 * Load lesson modal for create or update lesson
250 *
251 * @since 1.0.0
252 * @since 1.5.1 updated
253 *
254 * @return void
255 */
256 public function tutor_modal_create_or_update_lesson() {
257 tutor_utils()->checking_nonce();
258
259 global $wpdb;
260
261 /**
262 * Allow iframe inside lesson content to support
263 * embed video & other stuff
264 *
265 * @since 2.1.6
266 */
267 add_filter( 'wp_kses_allowed_html', Input::class . '::allow_iframe', 10, 2 );
268
269 $lesson_id = Input::post( 'lesson_id', 0, Input::TYPE_INT );
270 $topic_id = Input::post( 'current_topic_id', 0, Input::TYPE_INT );
271 $current_topic_id = $topic_id;
272 $course_id = tutor_utils()->get_course_id_by( 'topic', $topic_id );
273
274 if ( ! tutor_utils()->can_user_manage( 'topic', $topic_id ) ) {
275 wp_send_json_error( array( 'message' => __( 'Access Denied', 'tutor' ) ) );
276 }
277
278 $title = Input::post( 'lesson_title' );
279 $_lesson_thumbnail_id = Input::post( '_lesson_thumbnail_id', 0, Input::TYPE_INT );
280 $lesson_content = Input::post( 'lesson_content', '', Input::TYPE_KSES_POST );
281 $is_html_active = Input::post( 'is_html_active' ) === 'true' ? true : false;
282 $raw_html_content = Input::post( 'tutor_lesson_modal_editor', '', Input::TYPE_KSES_POST );
283 $post_content = $is_html_active ? $raw_html_content : $lesson_content;
284
285 $lesson_data = array(
286 'post_type' => $this->lesson_post_type,
287 'post_title' => $title,
288 'post_name' => sanitize_title( $title ),
289 'post_content' => $post_content,
290 'post_status' => 'publish',
291 'comment_status' => 'open',
292 'post_author' => get_current_user_id(),
293 'post_parent' => $topic_id,
294 );
295
296 if ( 0 === $lesson_id ) {
297 $lesson_data['menu_order'] = tutor_utils()->get_next_course_content_order_id( $topic_id );
298 $lesson_id = wp_insert_post( $lesson_data );
299
300 if ( $lesson_id ) {
301 do_action( 'tutor/lesson/created', $lesson_id );
302 } else {
303 wp_send_json_error( array( 'message' => __( 'Couldn\'t create lesson.', 'tutor' ) ) );
304 }
305 } else {
306 $lesson_data['ID'] = $lesson_id;
307
308 do_action( 'tutor/lesson_update/before', $lesson_id );
309 wp_update_post( $lesson_data );
310 if ( $_lesson_thumbnail_id ) {
311 update_post_meta( $lesson_id, '_thumbnail_id', $_lesson_thumbnail_id );
312 } else {
313 delete_post_meta( $lesson_id, '_thumbnail_id' );
314 }
315
316 do_action( 'tutor/lesson_update/after', $lesson_id );
317 }
318
319 ob_start();
320 include tutor()->path . 'views/metabox/course-contents.php';
321 $course_contents = ob_get_clean();
322
323 wp_send_json_success( array( 'course_contents' => $course_contents ) );
324 }
325
326 /**
327 * Delete Lesson from course builder by ID
328 *
329 * @since 1.0.0
330 *
331 * @return void
332 */
333 public function tutor_delete_lesson_by_id() {
334 tutor_utils()->checking_nonce();
335
336 $lesson_id = Input::post( 'lesson_id', 0, Input::TYPE_INT );
337
338 if ( ! tutor_utils()->can_user_manage( 'lesson', $lesson_id ) ) {
339 wp_send_json_error( array( 'message' => __( 'Access Denied', 'tutor' ) ) );
340 }
341
342 wp_delete_post( $lesson_id, true );
343 wp_send_json_success();
344 }
345
346
347 /**
348 * Changed the URI based
349 *
350 * @since 1.0.0
351 *
352 * @param string $uri URI.
353 * @param integer $lesson_id lesson ID.
354 *
355 * @return string
356 */
357 public function change_lesson_permalink( $uri, $lesson_id ) {
358 $post = get_post( $lesson_id );
359
360 if ( $post && $post->post_type === $this->lesson_post_type ) {
361 $uri_base = trailingslashit( site_url() );
362
363 $sample_course = 'sample-course';
364 $is_course = tutor_utils()->get_course_id_by( 'lesson', get_the_ID() );
365 if ( $is_course ) {
366 $course = get_post( $is_course );
367 if ( $course ) {
368 $sample_course = $course->post_name;
369 }
370 }
371
372 $new_course_base = $uri_base . "course/{$sample_course}/lesson/%pagename%/";
373 $uri[0] = $new_course_base;
374 }
375
376 return $uri;
377 }
378
379
380 /**
381 * Flash rewrite rules
382 *
383 * @since 1.0.0
384 * @return void
385 */
386 public function flush_rewrite_rules() {
387 $is_required_flush = get_option( 'required_rewrite_flush' );
388 if ( $is_required_flush ) {
389 flush_rewrite_rules();
390 delete_option( 'required_rewrite_flush' );
391 }
392 }
393
394 /**
395 * Add column to lesson HTML table
396 *
397 * @since 1.0.0
398 *
399 * @param array $columns columns.
400 * @return array
401 */
402 public function add_column( $columns ) {
403 $date_col = $columns['date'];
404 unset( $columns['date'] );
405 $columns['course'] = __( 'Course', 'tutor' );
406 $columns['date'] = $date_col;
407
408 return $columns;
409 }
410
411 /**
412 * Add custom lesson column.
413 *
414 * @since 1.0.0
415 *
416 * @param string $column column name.
417 * @param integer $post_id post ID.
418 *
419 * @return mixed
420 */
421 public function custom_lesson_column( $column, $post_id ) {
422 if ( 'course' === $column ) {
423
424 $course_id = tutor_utils()->get_course_id_by( 'lesson', $post_id );
425 if ( $course_id ) {
426 echo wp_kses(
427 '<a href="' . admin_url( 'post.php?post=' . $course_id . '&action=edit' ) . '">' . get_the_title( $course_id ) . '</a>',
428 array( 'a' => array( 'href' => true ) )
429 );
430 }
431 }
432 }
433
434 /**
435 * Mark lesson completed
436 *
437 * @since 1.0.0
438 *
439 * @return void
440 */
441 public function mark_lesson_complete() {
442 if ( 'tutor_complete_lesson' !== Input::post( 'tutor_action' ) ) {
443 return;
444 }
445 // Checking nonce.
446 tutor_utils()->checking_nonce();
447
448 $user_id = get_current_user_id();
449
450 // TODO: need to show view if not signed_in.
451 if ( ! $user_id ) {
452 die( esc_html__( 'Please Sign-In', 'tutor' ) );
453 }
454
455 $lesson_id = Input::post( 'lesson_id', 0, Input::TYPE_INT );
456
457 if ( ! $lesson_id ) {
458 return;
459 }
460
461 $validated = apply_filters( 'tutor_validate_lesson_complete', true, $user_id, $lesson_id );
462 if ( ! $validated ) {
463 return;
464 }
465
466 do_action( 'tutor_lesson_completed_before', $lesson_id );
467 /**
468 * Marking lesson at user meta, meta format, _tutor_completed_lesson_id_{id} and value = tutor_time();
469 */
470 LessonModel::mark_lesson_complete( $lesson_id );
471
472 do_action( 'tutor_lesson_completed_email_after', $lesson_id, $user_id );
473 do_action( 'tutor_lesson_completed_after', $lesson_id, $user_id );
474 }
475
476 /**
477 * Render the lesson content
478 *
479 * @since 1.0.0
480 *
481 * @return void
482 */
483 public function tutor_render_lesson_content() {
484 tutor_utils()->checking_nonce();
485
486 $lesson_id = Input::post( 'lesson_id', 0, Input::TYPE_INT );
487
488 $ancestors = get_post_ancestors( $lesson_id );
489 $course_id = ! empty( $ancestors ) ? array_pop( $ancestors ) : $lesson_id;
490
491 // Course must be public or current user must be enrolled to access this lesson.
492 if ( get_post_meta( $course_id, '_tutor_is_public_course', true ) !== 'yes' && ! tutor_utils()->is_enrolled( $course_id ) ) {
493
494 $is_admin = tutor_utils()->has_user_role( 'administrator' );
495 $allowed = $is_admin ? true : tutor_utils()->is_instructor_of_this_course( get_current_user_id(), $course_id );
496
497 if ( ! $allowed ) {
498 http_response_code( 400 );
499 exit;
500 }
501 }
502
503 ob_start();
504 global $post;
505
506 $post = get_post( $lesson_id ); //phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
507 setup_postdata( $post );
508 tutor_lesson_content();
509 wp_reset_postdata();
510
511 $html = ob_get_clean();
512
513 wp_send_json_success( array( 'html' => $html ) );
514 }
515
516 /**
517 * Load next course item automatically
518 *
519 * @since 1.4.9
520 *
521 * @return void
522 */
523 public function autoload_next_course_content() {
524 tutor_utils()->checking_nonce();
525
526 $post_id = Input::post( 'post_id', 0, Input::TYPE_INT );
527 $content_id = tutor_utils()->get_post_id( $post_id );
528 $contents = tutor_utils()->get_course_prev_next_contents_by_id( $content_id );
529
530 $autoload_course_content = (bool) get_tutor_option( 'autoload_next_course_content' );
531 $next_url = false;
532 if ( $autoload_course_content ) {
533 $next_url = get_the_permalink( $contents->next_id );
534 }
535 wp_send_json_success( array( 'next_url' => $next_url ) );
536 }
537
538 /**
539 * Load next course item after click complete button
540 *
541 * @since 1.5.3
542 *
543 * @param integer $content_id content ID.
544 * @return void
545 */
546 public function tutor_lesson_completed_after( $content_id ) {
547 $contents = tutor_utils()->get_course_prev_next_contents_by_id( $content_id );
548 $autoload_course_content = (bool) get_tutor_option( 'autoload_next_course_content' );
549 if ( $autoload_course_content ) {
550 wp_redirect( get_the_permalink( $contents->next_id ) );
551 } else {
552 wp_redirect( get_the_permalink( $content_id ) );
553 }
554 die();
555 }
556
557 /**
558 * Replay lesson comment
559 *
560 * @since 1.0.0
561 *
562 * @return void|null
563 */
564 public function reply_lesson_comment() {
565 tutor_utils()->checking_nonce();
566 $comment_data = array(
567 'comment_content' => Input::post( 'comment', '', Input::TYPE_KSES_POST ),
568 'comment_post_ID' => Input::post( 'comment_post_ID', 0, Input::TYPE_INT ),
569 'comment_parent' => Input::post( 'comment_parent', 0, Input::TYPE_INT ),
570 );
571 $comment_id = self::create_comment( $comment_data );
572 if ( false === $comment_id ) {
573 wp_send_json_error();
574 return;
575 }
576 $reply = get_comment( $comment_id );
577 ob_start();
578 ?>
579 <div class="tutor-comments-list tutor-child-comment tutor-mt-32" id="lesson-comment-<?php echo esc_attr( $reply->comment_ID ); ?>">
580 <div class="comment-avatar">
581 <img src="<?php echo esc_url( get_avatar_url( $reply->user_id ) ); ?>" alt="">
582 </div>
583 <div class="tutor-single-comment">
584 <div class="tutor-actual-comment tutor-mb-12">
585 <div class="tutor-comment-author">
586 <span class="tutor-fs-6 tutor-fw-bold">
587 <?php echo esc_html( $reply->comment_author ); ?>
588 </span>
589 <span class="tutor-fs-7 tutor-ml-0 tutor-ml-sm-10">
590 <?php echo esc_html( human_time_diff( strtotime( $reply->comment_date ), tutor_time() ) . __( ' ago', 'tutor' ) ); ?>
591 </span>
592 </div>
593 <div class="tutor-comment-text tutor-fs-6 tutor-mt-4">
594 <?php echo esc_html( $reply->comment_content ); ?>
595 </div>
596 </div>
597 </div>
598 </div>
599 <?php
600 $html = ob_get_clean();
601 wp_send_json_success( array( 'html' => $html ) );
602 }
603
604 /**
605 * Get comments
606 *
607 * @since 2.0.6
608 * @see Checkout arguments details: https://developer.wordpress.org/reference/classes/wp_comment_query/__construct/
609 *
610 * @param array $args arguments.
611 * @return mixed based on arguments
612 */
613 public static function get_comments( array $args ) {
614 $comments = get_comments( $args );
615 return $comments;
616 }
617
618 /**
619 * Create comment
620 *
621 * @since 1.0.0
622 *
623 * @param array $request request.
624 * @return mixed comment id on success, false on failure
625 */
626 public static function create_comment( array $request ) {
627 $current_user = wp_get_current_user();
628 $default_data = array(
629 'comment_content' => '',
630 'comment_post_ID' => '',
631 'comment_parent' => '',
632 'user_id' => $current_user->ID,
633 'comment_author' => $current_user->user_login,
634 'comment_author_email' => $current_user->user_email,
635 'comment_author_url' => $current_user->user_url,
636 'comment_agent' => 'Tutor',
637 );
638 $comment_data = wp_parse_args( $request, $default_data );
639 return wp_insert_comment( $comment_data );
640 }
641
642 }
643
644
645