PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.2.2
Tutor LMS – eLearning and online course solution v2.2.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 3 years ago Admin.php 3 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 3 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 3 years ago Frontend.php 3 years ago Gutenberg.php 3 years ago Input.php 3 years ago Instructor.php 3 years ago Instructors_List.php 3 years ago Lesson.php 3 years ago Options_V2.php 3 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 3 years ago Quiz_Attempts_List.php 3 years ago RestAPI.php 3 years ago Reviews.php 3 years ago Rewrite_Rules.php 3 years ago Shortcode.php 3 years ago Student.php 3 years ago Students_List.php 3 years ago Taxonomies.php 3 years ago Template.php 3 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 3 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 3 years ago Video_Stream.php 3 years ago Withdraw.php 3 years ago Withdraw_Requests_List.php 3 years ago WooCommerce.php 3 years ago
Lesson.php
638 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 ) );
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 $_lesson_thumbnail_id = Input::post( '_lesson_thumbnail_id', 0, Input::TYPE_INT );
275 $is_html_active = Input::post( 'is_html_active' ) === 'true' ? true : false;
276 $raw_html_content = Input::post( 'tutor_lesson_modal_editor', '', Input::TYPE_KSES_POST );
277 $tmce_content = Input::post( 'lesson_content', '', Input::TYPE_KSES_POST );
278
279 if ( ! tutor_utils()->can_user_manage( 'topic', $topic_id ) ) {
280 wp_send_json_error( array( 'message' => __( 'Access Denied', 'tutor' ) ) );
281 }
282
283 $title = Input::post( 'lesson_title' );
284 $lesson_content = $is_html_active ? $raw_html_content : $tmce_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' => $lesson_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
299 $lesson_data['menu_order'] = tutor_utils()->get_next_course_content_order_id( $topic_id );
300 $lesson_id = wp_insert_post( $lesson_data );
301
302 if ( $lesson_id ) {
303 do_action( 'tutor/lesson/created', $lesson_id );
304 } else {
305 wp_send_json_error( array( 'message' => __( 'Couldn\'t create lesson.', 'tutor' ) ) );
306 }
307 } else {
308 $lesson_data['ID'] = $lesson_id;
309
310 do_action( 'tutor/lesson_update/before', $lesson_id );
311 wp_update_post( $lesson_data );
312 if ( $_lesson_thumbnail_id ) {
313 update_post_meta( $lesson_id, '_thumbnail_id', $_lesson_thumbnail_id );
314 } else {
315 delete_post_meta( $lesson_id, '_thumbnail_id' );
316 }
317
318 do_action( 'tutor/lesson_update/after', $lesson_id );
319 }
320
321 ob_start();
322 include tutor()->path . 'views/metabox/course-contents.php';
323 $course_contents = ob_get_clean();
324
325 wp_send_json_success( array( 'course_contents' => $course_contents ) );
326 }
327
328 /**
329 * Delete Lesson from course builder by ID
330 *
331 * @since 1.0.0
332 *
333 * @return void
334 */
335 public function tutor_delete_lesson_by_id() {
336 tutor_utils()->checking_nonce();
337
338 $lesson_id = Input::post( 'lesson_id', 0, Input::TYPE_INT );
339
340 if ( ! tutor_utils()->can_user_manage( 'lesson', $lesson_id ) ) {
341 wp_send_json_error( array( 'message' => __( 'Access Denied', 'tutor' ) ) );
342 }
343
344 wp_delete_post( $lesson_id, true );
345 wp_send_json_success();
346 }
347
348
349 /**
350 * Changed the URI based
351 *
352 * @since 1.0.0
353 *
354 * @param string $uri URI.
355 * @param integer $lesson_id lesson ID.
356 *
357 * @return string
358 */
359 public function change_lesson_permalink( $uri, $lesson_id ) {
360 $post = get_post( $lesson_id );
361
362 if ( $post && $post->post_type === $this->lesson_post_type ) {
363 $uri_base = trailingslashit( site_url() );
364
365 $sample_course = 'sample-course';
366 $is_course = tutor_utils()->get_course_id_by( 'lesson', get_the_ID() );
367 if ( $is_course ) {
368 $course = get_post( $is_course );
369 if ( $course ) {
370 $sample_course = $course->post_name;
371 }
372 }
373
374 $new_course_base = $uri_base . "course/{$sample_course}/lesson/%pagename%/";
375 $uri[0] = $new_course_base;
376 }
377
378 return $uri;
379 }
380
381
382 /**
383 * Flash rewrite rules
384 *
385 * @since 1.0.0
386 * @return void
387 */
388 public function flush_rewrite_rules() {
389 $is_required_flush = get_option( 'required_rewrite_flush' );
390 if ( $is_required_flush ) {
391 flush_rewrite_rules();
392 delete_option( 'required_rewrite_flush' );
393 }
394 }
395
396 /**
397 * Add column to lesson HTML table
398 *
399 * @since 1.0.0
400 *
401 * @param array $columns columns.
402 * @return array
403 */
404 public function add_column( $columns ) {
405 $date_col = $columns['date'];
406 unset( $columns['date'] );
407 $columns['course'] = __( 'Course', 'tutor' );
408 $columns['date'] = $date_col;
409
410 return $columns;
411 }
412
413 /**
414 * Add custom lesson column.
415 *
416 * @since 1.0.0
417 *
418 * @param string $column column name.
419 * @param integer $post_id post ID.
420 *
421 * @return mixed
422 */
423 public function custom_lesson_column( $column, $post_id ) {
424 if ( 'course' === $column ) {
425
426 $course_id = tutor_utils()->get_course_id_by( 'lesson', $post_id );
427 if ( $course_id ) {
428 echo wp_kses(
429 '<a href="' . admin_url( 'post.php?post=' . $course_id . '&action=edit' ) . '">' . get_the_title( $course_id ) . '</a>',
430 array( 'a' => array( 'href' => true ) )
431 );
432 }
433 }
434 }
435
436 /**
437 * Mark lesson completed
438 *
439 * @since 1.0.0
440 *
441 * @return void
442 */
443 public function mark_lesson_complete() {
444 if ( 'tutor_complete_lesson' !== Input::post( 'tutor_action' ) ) {
445 return;
446 }
447 // Checking nonce.
448 tutor_utils()->checking_nonce();
449
450 $user_id = get_current_user_id();
451
452 // TODO: need to show view if not signed_in.
453 if ( ! $user_id ) {
454 die( esc_html__( 'Please Sign-In', 'tutor' ) );
455 }
456
457 $lesson_id = Input::post( 'lesson_id', 0, Input::TYPE_INT );
458
459 do_action( 'tutor_lesson_completed_before', $lesson_id );
460 /**
461 * Marking lesson at user meta, meta format, _tutor_completed_lesson_id_{id} and value = tutor_time();
462 */
463 LessonModel::mark_lesson_complete( $lesson_id );
464
465 do_action( 'tutor_lesson_completed_email_after', $lesson_id, $user_id );
466 do_action( 'tutor_lesson_completed_after', $lesson_id, $user_id );
467 }
468
469 /**
470 * Render the lesson content
471 *
472 * @since 1.0.0
473 *
474 * @return void
475 */
476 public function tutor_render_lesson_content() {
477 tutor_utils()->checking_nonce();
478
479 $lesson_id = Input::post( 'lesson_id', 0, Input::TYPE_INT );
480
481 $ancestors = get_post_ancestors( $lesson_id );
482 $course_id = ! empty( $ancestors ) ? array_pop( $ancestors ) : $lesson_id;
483
484 // Course must be public or current user must be enrolled to access this lesson.
485 if ( get_post_meta( $course_id, '_tutor_is_public_course', true ) !== 'yes' && ! tutor_utils()->is_enrolled( $course_id ) ) {
486
487 $is_admin = tutor_utils()->has_user_role( 'administrator' );
488 $allowed = $is_admin ? true : tutor_utils()->is_instructor_of_this_course( get_current_user_id(), $course_id );
489
490 if ( ! $allowed ) {
491 http_response_code( 400 );
492 exit;
493 }
494 }
495
496 ob_start();
497 global $post;
498
499 $post = get_post( $lesson_id ); //phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
500 setup_postdata( $post );
501 tutor_lesson_content();
502 wp_reset_postdata();
503
504 $html = ob_get_clean();
505
506 wp_send_json_success( array( 'html' => $html ) );
507 }
508
509 /**
510 * Load next course item automatically
511 *
512 * @since 1.4.9
513 *
514 * @return void
515 */
516 public function autoload_next_course_content() {
517 tutor_utils()->checking_nonce();
518
519 $post_id = Input::post( 'post_id', 0, Input::TYPE_INT );
520 $content_id = tutor_utils()->get_post_id( $post_id );
521 $contents = tutor_utils()->get_course_prev_next_contents_by_id( $content_id );
522
523 $autoload_course_content = (bool) get_tutor_option( 'autoload_next_course_content' );
524 $next_url = false;
525 if ( $autoload_course_content ) {
526 $next_url = get_the_permalink( $contents->next_id );
527 }
528 wp_send_json_success( array( 'next_url' => $next_url ) );
529 }
530
531 /**
532 * Load next course item after click complete button
533 *
534 * @since 1.5.3
535 *
536 * @param integer $content_id content ID.
537 * @return void
538 */
539 public function tutor_lesson_completed_after( $content_id ) {
540 $contents = tutor_utils()->get_course_prev_next_contents_by_id( $content_id );
541 $autoload_course_content = (bool) get_tutor_option( 'autoload_next_course_content' );
542 if ( $autoload_course_content ) {
543 wp_redirect( get_the_permalink( $contents->next_id ) );
544 } else {
545 wp_redirect( get_the_permalink( $content_id ) );
546 }
547 die();
548 }
549
550 /**
551 * Replay lesson comment
552 *
553 * @since 1.0.0
554 *
555 * @return void|null
556 */
557 public function reply_lesson_comment() {
558 tutor_utils()->checking_nonce();
559 $comment_data = array(
560 'comment_content' => Input::post( 'comment', '', Input::TYPE_KSES_POST ),
561 'comment_post_ID' => Input::post( 'comment_post_ID', 0, Input::TYPE_INT ),
562 'comment_parent' => Input::post( 'comment_parent', 0, Input::TYPE_INT ),
563 );
564 $comment_id = self::create_comment( $comment_data );
565 if ( false === $comment_id ) {
566 wp_send_json_error();
567 return;
568 }
569 $reply = get_comment( $comment_id );
570 ob_start();
571 ?>
572 <div class="tutor-comments-list tutor-child-comment tutor-mt-32" id="lesson-comment-<?php echo esc_attr( $reply->comment_ID ); ?>">
573 <div class="comment-avatar">
574 <img src="<?php echo esc_url( get_avatar_url( $reply->user_id ) ); ?>" alt="">
575 </div>
576 <div class="tutor-single-comment">
577 <div class="tutor-actual-comment tutor-mb-12">
578 <div class="tutor-comment-author">
579 <span class="tutor-fs-6 tutor-fw-bold">
580 <?php echo esc_html( $reply->comment_author ); ?>
581 </span>
582 <span class="tutor-fs-7 tutor-ml-0 tutor-ml-sm-10">
583 <?php echo esc_html( human_time_diff( strtotime( $reply->comment_date ), tutor_time() ) . __( ' ago', 'tutor' ) ); ?>
584 </span>
585 </div>
586 <div class="tutor-comment-text tutor-fs-6 tutor-mt-4">
587 <?php echo esc_html( $reply->comment_content ); ?>
588 </div>
589 </div>
590 </div>
591 </div>
592 <?php
593 $html = ob_get_clean();
594 wp_send_json_success( array( 'html' => $html ) );
595 }
596
597 /**
598 * Get comments
599 *
600 * @since 2.0.6
601 * @see Checkout arguments details: https://developer.wordpress.org/reference/classes/wp_comment_query/__construct/
602 *
603 * @param array $args arguments.
604 * @return mixed based on arguments
605 */
606 public static function get_comments( array $args ) {
607 $comments = get_comments( $args );
608 return $comments;
609 }
610
611 /**
612 * Create comment
613 *
614 * @since 1.0.0
615 *
616 * @param array $request request.
617 * @return mixed comment id on success, false on failure
618 */
619 public static function create_comment( array $request ) {
620 $current_user = wp_get_current_user();
621 $default_data = array(
622 'comment_content' => '',
623 'comment_post_ID' => '',
624 'comment_parent' => '',
625 'user_id' => $current_user->ID,
626 'comment_author' => $current_user->user_login,
627 'comment_author_email' => $current_user->user_email,
628 'comment_author_url' => $current_user->user_url,
629 'comment_agent' => 'Tutor',
630 );
631 $comment_data = wp_parse_args( $request, $default_data );
632 return wp_insert_comment( $comment_data );
633 }
634
635 }
636
637
638