PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.5
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.5
4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 All 139 releases
learnpress / inc / curds / class-lp-section-curd.php

class-lp-section-curd.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.5, at inc/curds/class-lp-section-curd.php

575 lines 12.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Class LP_Section_CURD
5 *
6 * @since 3.0.0
7 */
8 class LP_Section_CURD extends LP_Object_Data_CURD implements LP_Interface_CURD {
9 /**
10 * @var int
11 *
12 * @since 3.0.0
13 */
14 private $course_id = null;
15
16 /**
17 * LP_Section_CURD constructor.
18 *
19 * @param $course_id
20 *
21 * @since 3.0.0
22 */
23 public function __construct( $course_id ) {
24 $this->course_id = $course_id;
25 }
26
27 /**
28 * Create item and insert to database.
29 *
30 * @param $section_origin array
31 *
32 * @return array
33 * @since 3.0.0
34 * @version 3.0.1
35 */
36 public function create( &$section_origin ) {
37 global $wpdb;
38 $section = [];
39
40 try {
41 $section = $this->parse( $section_origin );
42 //$section = stripslashes_deep( $section );
43 $last_section_order_number = LP_Section_DB::getInstance()->get_last_number_order( $section['section_course_id'] );
44 $section_order_new = $last_section_order_number + 1;
45 $insert_data = apply_filters(
46 'lp/section/data-insert',
47 array(
48 'section_course_id' => $this->course_id,
49 'section_name' => $section['section_name'],
50 'section_order' => $section_order_new,
51 'section_description' => $section['section_description'],
52 ),
53 $section_origin
54 );
55
56 $wpdb->insert(
57 $wpdb->learnpress_sections,
58 $insert_data,
59 array( '%d', '%s', '%d', '%s' )
60 );
61 $section['section_id'] = $wpdb->insert_id;
62 $section['section_order'] = $section_order_new;
63
64 do_action( 'lp/section/created', $section );
65 } catch ( Throwable $e ) {
66 error_log( $e->getMessage() );
67 }
68
69 return $section;
70 }
71
72 /**
73 * Update data into database.
74 *
75 * @param $args
76 *
77 * @return mixed
78 * @since 3.0.0
79 */
80 public function update( &$args ) {
81
82 $section = $this->parse( $args );
83
84 if ( empty( $section['section_id'] ) ) {
85 return $this->create( $args );
86 }
87
88 $section_id = $section['section_id'];
89 $update_data = array(
90 'section_name' => $section['section_name'],
91 'section_course_id' => $section['section_course_id'],
92 'section_order' => $section['section_order'],
93 'section_description' => $section['section_description'],
94 );
95
96 global $wpdb;
97
98 $wpdb->update(
99 $wpdb->learnpress_sections,
100 $update_data,
101 array( 'section_id' => $section_id )
102 );
103 $section['section_id'] = $section_id;
104
105 return $section;
106 }
107
108 /**
109 * Delete section data from database.
110 *
111 * @param $id string
112 *
113 * @return bool
114 * @since 3.0.0
115 */
116 public function delete( &$id ) {
117
118 global $wpdb;
119
120 // allow hook
121 do_action( 'learn-press/before-delete-section', $this->course_id, $id );
122
123 // Remove section items.
124 $wpdb->delete( $wpdb->learnpress_section_items, array( 'section_id' => $id ) );
125 learn_press_reset_auto_increment( 'learnpress_section_items' );
126
127 // Remove section
128 $result = $wpdb->delete( $wpdb->learnpress_sections, array( 'section_id' => $id ) );
129 learn_press_reset_auto_increment( 'learnpress_sections' );
130
131 return ! ! $result;
132 }
133
134 public function duplicate( &$section, $args = array() ) {
135 // TODO: Implement duplicate() method.
136 }
137
138 /**
139 * Load data from database.
140 *
141 * @param object $object
142 *
143 * @return mixed
144 * @since 3.0.0
145 */
146 public function load( &$object ) {
147 // TODO: Implement load() method.
148 }
149
150 /**
151 * Parse input data.
152 *
153 * @param $args
154 *
155 * @return array
156 * @since 3.0.0
157 */
158 private function parse( $args ) {
159 $data = wp_parse_args(
160 $args,
161 array(
162 'section_name' => '',
163 'section_description' => '',
164 'section_course_id' => 0,
165 'section_order' => 0,
166 'items' => array(),
167 )
168 );
169
170 return $data;
171 }
172
173 /**
174 * Update sort sections.
175 *
176 * @param string[] $sections_new_order
177 *
178 * @return array
179 * @version 4.0.1
180 */
181 public function update_sections_order( $sections_new_order ) {
182 global $wpdb;
183
184 $orders = array();
185
186 foreach ( $sections_new_order as $order_new => $section_id ) {
187 $order_new = $order_new + 1;
188
189 $wpdb->update(
190 $wpdb->learnpress_sections,
191 array( 'section_order' => $order_new ),
192 array( 'section_id' => $section_id )
193 );
194 }
195
196 return $orders;
197 }
198
199 /**
200 * Get list items of section.
201 *
202 * @param $section_id
203 *
204 * @return array
205 * @since 3.0.0
206 */
207 public function get_section_items( $section_id ) {
208 $course = learn_press_get_course( $this->course_id );
209
210 $sections = $course->get_curriculum_raw();
211
212 $return = array();
213
214 if ( ! empty( $sections ) ) {
215 foreach ( $sections as $section ) {
216 if ( $section['id'] == $section_id ) {
217 if ( isset( $section['items'] ) && is_array( $section['items'] ) ) {
218 $return = $section['items'];
219 }
220 }
221 }
222 }
223
224 return $return;
225 }
226
227 /**
228 * Create new section item and add to course.
229 *
230 * @param int $section_id
231 * @param array $item
232 *
233 * @return array | bool
234 * @since 3.0.0
235 */
236 public function new_item( $section_id, $item ) {
237 // course author, for case co-instructor add new items.
238 $author_id = get_current_user_id();
239
240 if ( ! $author_id ) {
241 $author_id = get_post_field( 'post_author', $this->course_id ) ? get_post_field( 'post_author', $this->course_id ) : learn_press_get_current_user_id();
242 }
243
244 // $item = wp_parse_args( $item, array( 'title' => '', 'type' => '' ) );
245 $item = array_merge(
246 array(
247 'title' => '',
248 'type' => '',
249 'content' => '',
250 'status' => 'publish',
251 ),
252 $item
253 );
254
255 $args = array(
256 'title' => $item['title'],
257 'author' => $author_id,
258 'content' => $item['content'],
259 'status' => $item['status'],
260 );
261
262 if ( ! empty( $item['id'] ) ) {
263 $item['old_id'] = $item ['id'];
264 }
265 if ( $item['type'] == LP_LESSON_CPT ) {
266 $lesson_curd = new LP_Lesson_CURD();
267 $item['id'] = $lesson_curd->create( $args );
268 } elseif ( $item['type'] == LP_QUIZ_CPT ) {
269 $quiz_curd = new LP_Quiz_CURD();
270 $item['id'] = $quiz_curd->create( $args );
271 } else {
272 $item['id'] = apply_filters( 'learn-press/new-section-item-data', $item['id'], $item, $args, $this->course_id );
273 }
274
275 if ( is_wp_error( $item['id'] ) || ! $item['id'] ) {
276 return false;
277 }
278
279 $item['preview'] = get_post_meta( $item['id'], '_lp_preview', true ) == 'yes';
280
281 // allow hook
282 do_action( 'learn-press/after-new-section-item', $item['id'], $section_id, $this->course_id );
283
284 // add item to section
285 return $this->add_items_section( $section_id, array( $item ) );
286 }
287
288 /**
289 * Add list new items to section.
290 *
291 * @param $section_id
292 * @param array $items
293 *
294 * @return array
295 */
296 public function add_items_section( $section_id, $items = array() ) {
297 // $order = 1;
298 $current_items = $this->get_section_items( $section_id );
299 // allow hook
300 do_action( 'learn-press/before-add-items-section', $items, $section_id, $this->course_id );
301
302 global $wpdb;
303
304 $all_items = array_merge( $current_items, $items );
305 $result = array();
306 foreach ( $all_items as $key => $item ) {
307 $key = $key + 1;
308 if ( ! isset( $item['id'] ) || ! isset( $item['type'] ) ) {
309 continue;
310 }
311
312 $item = (array) $item;
313 $exist = $this->item_section_exist( $section_id, $item['id'] );
314
315 if ( $exist ) {
316 $wpdb->update(
317 $wpdb->learnpress_section_items,
318 array( 'item_order' => $key ),
319 array(
320 'section_id' => $section_id,
321 'item_id' => $item['id'],
322 )
323 );
324 } else {
325 $wpdb->insert(
326 $wpdb->learnpress_section_items,
327 array(
328 'section_id' => $section_id,
329 'item_id' => $item['id'],
330 'item_order' => $key,
331 'item_type' => $item['type'],
332 )
333 );
334 }
335 // get WP Post
336 $post = get_post( $item['id'] );
337 if ( ! $post ) {
338 continue;
339 }
340
341 $item = array_merge(
342 $item,
343 array(
344 'id' => $post->ID,
345 'title' => $post->post_title,
346 'type' => $post->post_type,
347 'preview' => get_post_meta( $post->ID, '_lp_preview', true ) == 'yes',
348 )
349 );
350
351 if ( ! $exist ) {
352 do_action( 'learn-press/added-item-to-section', $item, $section_id, $this->course_id );
353 } else {
354 do_action( 'learn-press/updated-item-to-section', $item, $section_id, $this->course_id );
355 }
356
357 $result[] = $item;
358 }
359
360 return $result;
361 }
362
363 /**
364 * Add item to section.
365 *
366 * @param int $section_id
367 * @param array $item
368 *
369 * @return void
370 * @version 1.0.0
371 * @since 4.1.7
372 */
373 public function assign_item_section( int $section_id, array $item = array() ) {
374 global $wpdb;
375
376 if ( ! isset( $item['item_id'] ) && ! isset( $item['item_type'] ) ) {
377 return;
378 }
379
380 try {
381 $exist = $this->item_section_exist( $section_id, $item['item_id'] );
382
383 if ( $exist ) {
384 $wpdb->update(
385 $wpdb->learnpress_section_items,
386 array( 'item_order' => $item['item_order'] ?? 0 ),
387 array(
388 'section_id' => $section_id,
389 'item_id' => $item['item_id'],
390 )
391 );
392 } else {
393 $wpdb->insert(
394 $wpdb->learnpress_section_items,
395 array(
396 'section_id' => $section_id,
397 'item_id' => $item['item_id'],
398 'item_order' => $item['item_order'] ?? 0,
399 'item_type' => $item['item_type'],
400 )
401 );
402 }
403 } catch ( Throwable $e ) {
404 error_log( $e->getMessage() );
405 }
406 }
407
408 /**
409 * Check item was been added to any section.
410 *
411 * @param $section_id
412 * @param $item_id
413 *
414 * @return bool
415 * @since 3.0.0
416 */
417 private function item_section_exist( $section_id, $item_id ) {
418 global $wpdb;
419
420 $section_id = intval( $section_id );
421 $item_id = intval( $item_id );
422
423 $query = $wpdb->prepare( "SELECT * FROM {$wpdb->learnpress_section_items} WHERE section_id = %d AND item_id = %d", $section_id, $item_id );
424 $item = $wpdb->get_row( $query, ARRAY_A );
425
426 return ! ! $item;
427 }
428
429 /**
430 * Get section id of lesson, quiz id in curriculum.
431 *
432 * @param $item_id
433 *
434 * @return array|bool|null|object
435 */
436 public function get_item_section( $item_id ) {
437 global $wpdb;
438
439 $query = $wpdb->prepare( "SELECT section_id, item_order FROM {$wpdb->learnpress_section_items} WHERE item_id = %d", $item_id );
440 $section = $wpdb->get_row( $query, ARRAY_A );
441
442 return $section;
443 }
444
445 /**
446 * Remove section item.
447 *
448 * @param $section_id
449 * @param $item_id
450 *
451 * @return bool
452 * @since 3.0.0
453 */
454 public function remove_section_item( $section_id, $item_id ) {
455 global $wpdb;
456
457 $result = $wpdb->delete(
458 $wpdb->learnpress_section_items,
459 array(
460 'section_id' => $section_id,
461 'item_id' => $item_id,
462 ),
463 array(
464 '%d',
465 '%d',
466 )
467 );
468
469 return ! ! $result;
470 }
471
472 /**
473 * Update section items.
474 *
475 * @param $section_id
476 * @param $items array
477 *
478 * @return array
479 * @since 3.0.1
480 */
481 public function update_section_items( $section_id, $items ) {
482 global $wpdb;
483
484 foreach ( $items as $index => $item ) {
485 $item_id = 0;
486 $item_type = '';
487 if ( is_object( $item ) ) {
488 $item_id = $item->id ?? 0;
489 $item_type = $item->post_type ?? '';
490 } elseif ( is_array( $item ) ) {
491 $item_id = $item['id'] ?? 0;
492 $item_type = $item['type'] ?? '';
493 }
494
495 $order = $index + 1;
496 $exist = $this->item_section_exist( $section_id, $item_id );
497
498 if ( $exist ) {
499 $wpdb->update(
500 $wpdb->learnpress_section_items,
501 array( 'item_order' => $order ),
502 array(
503 'section_id' => $section_id,
504 'item_id' => $item_id,
505 )
506 );
507 } else {
508 $wpdb->insert(
509 $wpdb->learnpress_section_items,
510 array(
511 'section_id' => $section_id,
512 'item_id' => $item_id,
513 'item_order' => $order,
514 'item_type' => $item_type,
515 )
516 );
517 }
518 }
519
520 return $items;
521 }
522
523 /**
524 * Check item exist.
525 *
526 * @param $items array
527 * @param $item_id string
528 *
529 * @return bool
530 * @since 3.0.0
531 */
532 private function check_item_exist( $items, $item_id ) {
533 foreach ( $items as $item ) {
534 if ( $item['id'] == $item_id ) {
535 return true;
536 }
537 }
538
539 return false;
540 }
541
542 /**
543 * Update lesson, quiz title in admin course editor.
544 *
545 * @param $item
546 *
547 * @return array
548 * @since 3.0.0
549 */
550 public function update_item( $item ) {
551 $item = wp_parse_args(
552 $item,
553 array(
554 'id' => '',
555 'title' => '',
556 )
557 );
558
559 wp_update_post(
560 array(
561 'ID' => $item['id'],
562 'post_title' => $item['title'],
563 )
564 );
565
566 if ( isset( $item['preview'] ) && $item['preview'] ) {
567 update_post_meta( $item['id'], '_lp_preview', 'yes' );
568 } else {
569 delete_post_meta( $item['id'], '_lp_preview' );
570 }
571
572 return $item;
573 }
574 }
575