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