PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.2.3
Tutor LMS – eLearning and online course solution v2.2.3
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 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 3 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 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 2 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
636 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 do_action( 'tutor_lesson_completed_before', $lesson_id );
458 /**
459 * Marking lesson at user meta, meta format, _tutor_completed_lesson_id_{id} and value = tutor_time();
460 */
461 LessonModel::mark_lesson_complete( $lesson_id );
462
463 do_action( 'tutor_lesson_completed_email_after', $lesson_id, $user_id );
464 do_action( 'tutor_lesson_completed_after', $lesson_id, $user_id );
465 }
466
467 /**
468 * Render the lesson content
469 *
470 * @since 1.0.0
471 *
472 * @return void
473 */
474 public function tutor_render_lesson_content() {
475 tutor_utils()->checking_nonce();
476
477 $lesson_id = Input::post( 'lesson_id', 0, Input::TYPE_INT );
478
479 $ancestors = get_post_ancestors( $lesson_id );
480 $course_id = ! empty( $ancestors ) ? array_pop( $ancestors ) : $lesson_id;
481
482 // Course must be public or current user must be enrolled to access this lesson.
483 if ( get_post_meta( $course_id, '_tutor_is_public_course', true ) !== 'yes' && ! tutor_utils()->is_enrolled( $course_id ) ) {
484
485 $is_admin = tutor_utils()->has_user_role( 'administrator' );
486 $allowed = $is_admin ? true : tutor_utils()->is_instructor_of_this_course( get_current_user_id(), $course_id );
487
488 if ( ! $allowed ) {
489 http_response_code( 400 );
490 exit;
491 }
492 }
493
494 ob_start();
495 global $post;
496
497 $post = get_post( $lesson_id ); //phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
498 setup_postdata( $post );
499 tutor_lesson_content();
500 wp_reset_postdata();
501
502 $html = ob_get_clean();
503
504 wp_send_json_success( array( 'html' => $html ) );
505 }
506
507 /**
508 * Load next course item automatically
509 *
510 * @since 1.4.9
511 *
512 * @return void
513 */
514 public function autoload_next_course_content() {
515 tutor_utils()->checking_nonce();
516
517 $post_id = Input::post( 'post_id', 0, Input::TYPE_INT );
518 $content_id = tutor_utils()->get_post_id( $post_id );
519 $contents = tutor_utils()->get_course_prev_next_contents_by_id( $content_id );
520
521 $autoload_course_content = (bool) get_tutor_option( 'autoload_next_course_content' );
522 $next_url = false;
523 if ( $autoload_course_content ) {
524 $next_url = get_the_permalink( $contents->next_id );
525 }
526 wp_send_json_success( array( 'next_url' => $next_url ) );
527 }
528
529 /**
530 * Load next course item after click complete button
531 *
532 * @since 1.5.3
533 *
534 * @param integer $content_id content ID.
535 * @return void
536 */
537 public function tutor_lesson_completed_after( $content_id ) {
538 $contents = tutor_utils()->get_course_prev_next_contents_by_id( $content_id );
539 $autoload_course_content = (bool) get_tutor_option( 'autoload_next_course_content' );
540 if ( $autoload_course_content ) {
541 wp_redirect( get_the_permalink( $contents->next_id ) );
542 } else {
543 wp_redirect( get_the_permalink( $content_id ) );
544 }
545 die();
546 }
547
548 /**
549 * Replay lesson comment
550 *
551 * @since 1.0.0
552 *
553 * @return void|null
554 */
555 public function reply_lesson_comment() {
556 tutor_utils()->checking_nonce();
557 $comment_data = array(
558 'comment_content' => Input::post( 'comment', '', Input::TYPE_KSES_POST ),
559 'comment_post_ID' => Input::post( 'comment_post_ID', 0, Input::TYPE_INT ),
560 'comment_parent' => Input::post( 'comment_parent', 0, Input::TYPE_INT ),
561 );
562 $comment_id = self::create_comment( $comment_data );
563 if ( false === $comment_id ) {
564 wp_send_json_error();
565 return;
566 }
567 $reply = get_comment( $comment_id );
568 ob_start();
569 ?>
570 <div class="tutor-comments-list tutor-child-comment tutor-mt-32" id="lesson-comment-<?php echo esc_attr( $reply->comment_ID ); ?>">
571 <div class="comment-avatar">
572 <img src="<?php echo esc_url( get_avatar_url( $reply->user_id ) ); ?>" alt="">
573 </div>
574 <div class="tutor-single-comment">
575 <div class="tutor-actual-comment tutor-mb-12">
576 <div class="tutor-comment-author">
577 <span class="tutor-fs-6 tutor-fw-bold">
578 <?php echo esc_html( $reply->comment_author ); ?>
579 </span>
580 <span class="tutor-fs-7 tutor-ml-0 tutor-ml-sm-10">
581 <?php echo esc_html( human_time_diff( strtotime( $reply->comment_date ), tutor_time() ) . __( ' ago', 'tutor' ) ); ?>
582 </span>
583 </div>
584 <div class="tutor-comment-text tutor-fs-6 tutor-mt-4">
585 <?php echo esc_html( $reply->comment_content ); ?>
586 </div>
587 </div>
588 </div>
589 </div>
590 <?php
591 $html = ob_get_clean();
592 wp_send_json_success( array( 'html' => $html ) );
593 }
594
595 /**
596 * Get comments
597 *
598 * @since 2.0.6
599 * @see Checkout arguments details: https://developer.wordpress.org/reference/classes/wp_comment_query/__construct/
600 *
601 * @param array $args arguments.
602 * @return mixed based on arguments
603 */
604 public static function get_comments( array $args ) {
605 $comments = get_comments( $args );
606 return $comments;
607 }
608
609 /**
610 * Create comment
611 *
612 * @since 1.0.0
613 *
614 * @param array $request request.
615 * @return mixed comment id on success, false on failure
616 */
617 public static function create_comment( array $request ) {
618 $current_user = wp_get_current_user();
619 $default_data = array(
620 'comment_content' => '',
621 'comment_post_ID' => '',
622 'comment_parent' => '',
623 'user_id' => $current_user->ID,
624 'comment_author' => $current_user->user_login,
625 'comment_author_email' => $current_user->user_email,
626 'comment_author_url' => $current_user->user_url,
627 'comment_agent' => 'Tutor',
628 );
629 $comment_data = wp_parse_args( $request, $default_data );
630 return wp_insert_comment( $comment_data );
631 }
632
633 }
634
635
636