PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.1.7.3.2
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.1.7.3.2
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-order-curd.php

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

605 lines 16.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Class LP_Order_CURD
4 *
5 * @since 3.0.0
6 */
7
8 defined( 'ABSPATH' ) || exit();
9
10 class LP_Order_CURD extends LP_Object_Data_CURD implements LP_Interface_CURD {
11
12 /**
13 * @var string
14 */
15 protected $_meta_type = 'post';
16
17 /**
18 * @var array
19 */
20 protected $_meta_keys = array();
21
22 /**
23 * @param LP_Order $order
24 *
25 * @return mixed
26 */
27 public function create( &$order ) {
28 if ( ! $order instanceof LP_Order ) {
29 return false;
30 }
31
32 $order->set_order_date( time() );
33 $order->set_order_key( learn_press_generate_order_key() );
34
35 $order_data = array(
36 'post_author' => get_current_user_id(),
37 'post_parent' => $order->get_parent_id(),
38 'post_type' => LP_ORDER_CPT,
39 'post_status' => $order->get_order_status(),
40 'ping_status' => 'closed',
41 'post_title' => $order->get_title(),
42 'post_date' => $order->get_order_date( 'edit' )->toSql( true ),
43 'post_date_gmt' => $order->get_order_date( 'edit' )->toSql( false ),
44 'post_excerpt' => $order->get_customer_note(),
45 );
46
47 $order_data = apply_filters( 'learn-press/order/new-data', $order_data );
48
49 $id = wp_insert_post( $order_data, true );
50
51 if ( $id && ! is_wp_error( $id ) ) {
52 $order->set_id( $id );
53 $this->_updates( $order );
54 }
55
56 return $id;
57 }
58
59 /**
60 * @param LP_Order $order
61 */
62 public function _updates( &$order ) {
63 $this->update_post_meta( $order );
64 $order->update_meta();
65 }
66
67 /**
68 * @param LP_Order $order
69 */
70 public function update_post_meta( $order ) {
71 $meta_data = array(
72 '_order_currency' => $order->get_currency(),
73 '_prices_include_tax' => 'no',
74 '_user_id' => $order->get_user_id(),
75 '_order_subtotal' => $order->get_subtotal(),
76 '_order_total' => $order->get_total(),
77 '_order_key' => $order->get_order_key(),
78 '_payment_method' => $order->get_payment_method_title(),
79 '_payment_method_title' => $order->get_payment_method_title(),
80 '_user_ip_address' => $order->get_user_ip_address(),
81 '_user_agent' => $order->get_user_agent(),
82 '_order_version' => '3.0.0',
83 '_created_via' => $order->get_created_via(),
84 );
85
86 $checkout_email = $order->get_checkout_email();
87 if ( $checkout_email ) {
88 $meta_data['_checkout_email'] = $checkout_email;
89 }
90
91 foreach ( $meta_data as $key => $value ) {
92 update_post_meta( $order->get_id(), $key, $value );
93 }
94 }
95
96 /**
97 * Read order's items
98 *
99 * @param LP_Order $order
100 *
101 * @return mixed
102 */
103 /*
104 old function - comment by tungnx
105 public function read_items( $order ) {
106 global $wpdb;
107 $screen = function_exists('get_current_screen')? get_current_screen():null;
108 $query = $wpdb->prepare( "
109 SELECT order_item_id as id, order_item_name as name
110 , oim.meta_value as `course_id`
111 # , oim2.meta_value as `quantity`
112 # , oim3.meta_value as `total`
113 FROM {$wpdb->learnpress_order_items} oi
114 INNER JOIN {$wpdb->learnpress_order_itemmeta} oim ON oi.order_item_id = oim.learnpress_order_item_id AND oim.meta_key='_course_id'
115 # INNER JOIN {$wpdb->learnpress_order_itemmeta} oim2 ON oi.order_item_id = oim2.learnpress_order_item_id AND oim2.meta_key='_quantity'
116 # INNER JOIN {$wpdb->learnpress_order_itemmeta} oim3 ON oi.order_item_id = oim3.learnpress_order_item_id AND oim3.meta_key='_total'
117 WHERE order_id = %d
118 ", $order->get_id() );
119
120 $_items = $wpdb->get_results( $query );
121 $items = array();
122 // Loop items
123 if ( $_items ) {
124 foreach ( $_items as $item ) {
125 $item = (array) $item;
126 $items[$item['id']] = $item;
127 if(!$screen || $screen->id !== 'edit-lp_order'){
128 $this->get_item_meta( $item );
129 }
130 if ( ! empty( $item['course_id'] ) ) {
131 $items[ $item['id'] ] = $item;
132 }
133 }
134 }
135
136 return $items;// apply_filters( 'learn_press_order_get_items', $items, $this );
137 } */
138
139 /**
140 * Get order's items
141 *
142 * @param LP_Order $order
143 *
144 * @return mixed
145 * @author tungnx
146 */
147 public function read_items( $order ) {
148 global $wpdb;
149
150 $table_order_items = $wpdb->learnpress_order_items;
151 $table_order_item_meta = $wpdb->learnpress_order_itemmeta;
152
153 $query = $wpdb->prepare(
154 "SELECT o_item.order_item_id, o_item.order_item_name, o_itemmeta.meta_value, o_itemmeta.meta_key
155 From $table_order_items as o_item
156 INNER JOIN $table_order_item_meta as o_itemmeta
157 ON o_item.order_item_id = o_itemmeta.learnpress_order_item_id
158 WHERE o_item.order_id = %d
159 LIMIT %d",
160 $order->get_id(),
161 4 * 50
162 );
163
164 // Todo: write query to function and call ajax load more
165 $order_item_metas = $wpdb->get_results( $query, OBJECT );
166
167 $items = array();
168
169 foreach ( $order_item_metas as $order_item_meta ) {
170 if ( ! array_key_exists( $order_item_meta->order_item_id, $items ) ) {
171 $items[ $order_item_meta->order_item_id ] = array();
172 $items[ $order_item_meta->order_item_id ]['id'] = $order_item_meta->order_item_id;
173 $items[ $order_item_meta->order_item_id ]['name'] = isset( $order_item_meta->order_item_name ) ? $order_item_meta->order_item_name : '';
174 }
175
176 switch ( $order_item_meta->meta_key ) {
177 case '_course_id':
178 $items[ $order_item_meta->order_item_id ]['course_id'] = $order_item_meta->meta_value;
179 break;
180 case '_quantity':
181 $items[ $order_item_meta->order_item_id ]['quantity'] = $order_item_meta->meta_value;
182 break;
183 case '_subtotal':
184 $items[ $order_item_meta->order_item_id ]['subtotal'] = $order_item_meta->meta_value;
185 break;
186 case '_total':
187 $items[ $order_item_meta->order_item_id ]['total'] = $order_item_meta->meta_value;
188 break;
189 default:
190 $items[ $order_item_meta->order_item_id ][ $order_item_meta->meta_key ] = $order_item_meta->meta_value;
191 }
192 }
193
194 return $items; // apply_filters( 'learn_press_order_get_items', $items, $this );
195 }
196
197 /**
198 * Get order's items
199 *
200 * @param LP_Order $order
201 * @param array $filter
202 *
203 * @return mixed
204 * @author tungnx
205 */
206 public function read_items_filter( $order, $filter = array() ) {
207 global $wpdb;
208
209 $p = $filter['p'];
210 $limit = $filter['limit'] * 4; // 4 fields on 1 item
211 $offset = $p * $limit;
212
213 $table_order_items = $wpdb->learnpress_order_items;
214 $table_order_item_meta = $wpdb->learnpress_order_itemmeta;
215
216 $query = $wpdb->prepare(
217 "SELECT o_item.order_item_id, o_item.order_item_name, o_itemmeta.meta_value, o_itemmeta.meta_key
218 From $table_order_items as o_item
219 INNER JOIN $table_order_item_meta as o_itemmeta
220 ON o_item.order_item_id = o_itemmeta.learnpress_order_item_id
221 WHERE o_item.order_id = %d
222 LIMIT %d, %d",
223 $order->get_id(),
224 $offset,
225 $limit
226 );
227
228 // Todo: write query to function and call ajax load more
229 $order_item_metas = $wpdb->get_results( $query, OBJECT );
230
231 $items = array();
232
233 foreach ( $order_item_metas as $order_item_meta ) {
234 if ( ! array_key_exists( $order_item_meta->order_item_id, $items ) ) {
235 $items[ $order_item_meta->order_item_id ] = array();
236 $items[ $order_item_meta->order_item_id ]['id'] = $order_item_meta->order_item_id;
237 $items[ $order_item_meta->order_item_id ]['name'] = isset( $order_item_meta->order_item_name ) ? $order_item_meta->order_item_name : '';
238 }
239
240 switch ( $order_item_meta->meta_key ) {
241 case '_course_id':
242 $items[ $order_item_meta->order_item_id ]['course_id'] = $order_item_meta->meta_value;
243 break;
244 case '_quantity':
245 $items[ $order_item_meta->order_item_id ]['quantity'] = $order_item_meta->meta_value;
246 break;
247 case '_subtotal':
248 $items[ $order_item_meta->order_item_id ]['subtotal'] = $order_item_meta->meta_value;
249 break;
250 case '_total':
251 $items[ $order_item_meta->order_item_id ]['total'] = $order_item_meta->meta_value;
252 break;
253 default:
254 $items[ $order_item_meta->order_item_id ][ $order_item_meta->meta_key ] = $order_item_meta->meta_value;
255 }
256 }
257
258 return $items; // apply_filters( 'learn_press_order_get_items', $items, $this );
259 }
260
261 public function getTotalItem() {
262
263 }
264
265 public function get_item_meta( &$item ) {
266 $metas = get_metadata( 'learnpress_order_item', $item['id'] );
267 if ( $metas ) {
268 foreach ( $metas as $k => $v ) {
269 $item[ preg_replace( '!^_!', '', $k ) ] = LP_Helper::maybe_unserialize( $v[0] );
270 }
271 };
272 }
273
274 /**
275 * Update order.
276 *
277 * @param LP_Order $order
278 *
279 * @return int
280 */
281 public function update( &$order ) {
282
283 // If there is no items in the order then set it status to Pending
284 $status = $order->get_status() ? $order->get_status() : learn_press_default_order_status();
285 /*if ( in_array( $status, array( 'completed', 'processing' ) ) && ! $order->get_items() ) {
286 $status = 'pending';
287 }*/
288
289 $post_data = array(
290 'post_date' => $order->get_order_date( 'edit' )->toSql(),
291 'post_date_gmt' => $order->get_order_date( 'edit' )->toSql( false ),
292 'post_status' => 'lp-' . $status,
293 'post_parent' => $order->get_parent_id(),
294 );
295
296 $post_data = apply_filters( 'learn-press/order/update-data', $post_data, $order->get_id() );
297
298 /**
299 * When updating this object, to prevent infinite loops, use $wpdb
300 * to update data, since wp_update_post spawns more calls to the
301 * save_post action.
302 *
303 * This ensures hooks are fired by either WP itself (admin screen save),
304 * or an update purely from CRUD.
305 */
306 if ( doing_action( 'save_post' ) ) {
307 $GLOBALS['wpdb']->update( $GLOBALS['wpdb']->posts, $post_data, array( 'ID' => $order->get_id() ) );
308 clean_post_cache( $order->get_id() );
309 } else {
310 wp_update_post( array_merge( array( 'ID' => $order->get_id() ), $post_data ) );
311 }
312 $this->_updates( $order );
313
314 return $order->get_id();
315 }
316
317 public function delete( &$object ) {
318 // TODO: Implement delete() method.
319 }
320
321 /**
322 * @param LP_Order $order
323 *
324 * @return LP_Order
325 */
326 public function cln( $order ) {
327
328 $cloned = clone $order;
329
330 $cloned->set_id( 0 );
331 $cloned->save();
332
333 $meta_keys = array(
334 '_order_currency',
335 '_prices_include_tax',
336 '_user_ip_address',
337 '_user_agent',
338 '_order_subtotal',
339 '_order_total',
340 '_order_key',
341 '_payment_method',
342 '_payment_method_title',
343 '_order_version',
344 '_created_via',
345 );
346
347 foreach ( $meta_keys as $key ) {
348 update_post_meta( $cloned->get_id(), $key, get_post_meta( $order->get_id(), $key, true ) );
349 }
350
351 $this->cln_items( $order->get_id(), $cloned->get_id() );
352
353 return $cloned;
354 }
355
356 /**
357 * Clone items from an order to another
358 *
359 * @param int $from
360 * @param int $to
361 *
362 * @return mixed
363 */
364 public function cln_items( $from, $to ) {
365 $order = learn_press_get_order( $from );
366 global $wpdb;
367
368 $query = $wpdb->prepare(
369 "
370 SELECT *
371 FROM {$wpdb->learnpress_order_items} oi
372 INNER JOIN {$wpdb->learnpress_order_itemmeta} oim ON oi.order_item_id = oim.learnpress_order_item_id
373 WHERE order_id = %d
374 ",
375 $from
376 );
377
378 $items = $order->get_items();
379 if ( $items ) {
380 $to_order = learn_press_get_order( $to );
381 if ( ! $to_order ) {
382 return false;
383 }
384
385 $to_order->remove_order_items();
386
387 foreach ( $items as $item ) {
388 $wpdb->insert(
389 $wpdb->learnpress_order_items,
390 array(
391 'order_item_name' => $item['name'],
392 'order_id' => $to,
393 )
394 );
395 $learnpress_order_item_id = $wpdb->insert_id;
396
397 $query = $wpdb->prepare(
398 "
399 SELECT *
400 FROM {$wpdb->learnpress_order_itemmeta}
401 WHERE learnpress_order_item_id = %d
402 ",
403 $item['id']
404 );
405
406 if ( $metas = $wpdb->get_results( $query ) ) {
407 foreach ( $metas as $meta ) {
408 $wpdb->insert(
409 $wpdb->learnpress_order_itemmeta,
410 array(
411 'learnpress_order_item_id' => $learnpress_order_item_id,
412 'meta_key' => $meta->meta_key,
413 'meta_value' => $meta->meta_value,
414 )
415 );
416 }
417 }
418 }
419 }
420 $this->read_items( $order );
421
422 return true;
423 }
424
425 /**
426 * Load order data
427 *
428 * @param LP_Order $order
429 *
430 * @return mixed
431 * @throws Exception
432 */
433 public function load( &$order ) {
434 $the_id = $order->get_id();
435 if ( ! $the_id || LP_ORDER_CPT !== learn_press_get_post_type( $the_id ) ) {
436 if ( LP_Debug::is_debug() ) {
437 throw new Exception( sprintf( __( 'Invalid order with ID "%d".', 'learnpress' ), $the_id ) );
438 }
439 }
440
441 $post = get_post( $the_id );
442 if ( $post ) {
443 $_users = get_post_meta( $order->get_id(), '_user_id' );
444 if ( $_users ) {
445 settype( $_users, 'array' );
446 } else {
447 $_users = array();
448 }
449 if ( sizeof( $_users ) > 1 ) {
450 $users = $_users;
451 } elseif ( sizeof( $_users ) == 1 ) {
452 $users = $_users[0];
453 } else {
454 $users = 0;
455 }
456
457 $order->set_data_via_methods(
458 array(
459 'user_id' => $users,
460 'order_date' => new LP_Datetime( $post->post_date ),
461 'date_modified' => new LP_Datetime( $post->post_modified ),
462 'status' => str_replace( 'lp-', '', $post->post_status ),
463 'parent_id' => $post->post_parent,
464 'created_via' => get_post_meta( $post->ID, '_created_via', true ),
465 'total' => get_post_meta( $post->ID, '_order_total', true ),
466 'subtotal' => get_post_meta( $post->ID, '_order_subtotal', true ),
467 'order_key' => get_post_meta( $post->ID, '_order_key', true ),
468 'user_ip_address' => get_post_meta( $post->ID, '_user_ip_address', true ),
469 'user_agent' => get_post_meta( $post->ID, '_user_agent', true ),
470 'checkout_email' => get_post_meta( $post->ID, '_checkout_email', true ),
471 'currency' => get_post_meta( $post->ID, '_order_currency', true ),
472 )
473 );
474
475 $order->get_items();
476 $order->read_meta();
477 }
478
479 return true;
480 }
481
482 /**
483 * Recover an order checked out by Guest for an user.
484 *
485 * @param string $order_key
486 * @param int $user_id
487 *
488 * @return bool|LP_Order|WP_Error
489 */
490 public function recover( $order_key, $user_id ) {
491 try {
492 $order = $this->get_order_by_key( $order_key );
493
494 // Validations
495 if ( ! $order ) {
496 throw new Exception( esc_html__( 'Invalid order.', 'learnpress' ) );
497 }
498
499 if ( ! $order->is_guest() ) {
500 throw new Exception( esc_html__( 'Order is already assigned.', 'learnpress' ) );
501 }
502
503 $user = learn_press_get_user( $user_id );
504
505 if ( ! $user || $user instanceof LP_User_Guest ) {
506 throw new Exception( esc_html__( 'Invalid User!', 'learnpress' ) );
507 }
508
509 if ( $order->get_checkout_email() !== $user->get_email() ) {
510 throw new Exception( esc_html__( 'Invalid order key with Email!', 'learnpress' ) );
511 }
512
513 // Set user to order and update
514 $order->set_user_id( $user_id );
515 $order->save();
516
517 // Update user_id of lp_user_item
518 if ( $order->is_completed() ) {
519 $lp_user_items_db = LP_User_Items_DB::getInstance();
520 $filter = new LP_User_Items_Filter();
521 $filter->user_id = $user_id;
522 $filter->ref_id = $order->get_id();
523 $lp_user_items_db->update_user_id_by_order( $filter );
524 }
525
526 // Trigger action
527 do_action( 'learn-press/order/recovered-successful', $order->get_id(), $user_id );
528 } catch ( Exception $ex ) {
529 return new WP_Error( 'lp_order_recover_error', $ex->getMessage() );
530 }
531
532 return $order;
533 }
534
535 /**
536 * Retrieve an order by order key.
537 *
538 * @param string $order_key
539 *
540 * @return bool|LP_Order
541 */
542 public function get_order_by_key( $order_key ) {
543 global $wpdb;
544 $query = $wpdb->prepare(
545 "
546 SELECT ID
547 FROM {$wpdb->posts} p
548 INNER JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID AND pm.meta_key = %s AND pm.meta_value = %s
549 ",
550 '_order_key',
551 $order_key
552 );
553
554 $order = false;
555 $order_id = $wpdb->get_var( $query );
556
557 if ( $order_id ) {
558 $order = learn_press_get_order( $order_id );
559 }
560
561 return $order;
562 }
563
564 /**
565 * Get all child orders of an order by id
566 *
567 * @param int $order_id
568 *
569 * @return array|bool|mixed
570 */
571 public function get_child_orders( $order_id ) {
572 global $wpdb;
573
574 $orders = LP_Object_Cache::get( 'order-' . $order_id, 'lp-child-orders' );
575
576 if ( false === $orders ) {
577 $query = $wpdb->prepare(
578 "
579 SELECT *
580 FROM {$wpdb->posts}
581 WHERE post_parent = %d
582 ",
583 $order_id
584 );
585
586 $posts = $wpdb->get_results( $query );
587 if ( $posts ) {
588 foreach ( $posts as $order ) {
589 new WP_Post( $order );
590 $orders[] = $order->ID;
591 }
592 } else {
593 $orders = array();
594 }
595 LP_Object_Cache::set( 'order-' . $order_id, $orders, 'lp-child-orders' );
596 }
597
598 return $orders;
599 }
600
601 public function duplicate( &$order, $args = array() ) {
602 // TODO: Implement duplicate() method.
603 }
604 }
605