PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.9
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.9
4.4.9 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 All 140 releases
← All changes | inc/curds/class-lp-order-curd.php +154 -124 4.1.7 → 4.4.9 View file →
@@ -4,8 +4,10 @@
4 4 *
5 5 * @since 3.0.0
6 6 */
7 7
8 +use LearnPress\Models\UserItems\UserCourseModel;
9 +
8 10 defined( 'ABSPATH' ) || exit();
9 11
10 12 class LP_Order_CURD extends LP_Object_Data_CURD implements LP_Interface_CURD {
11 13
@@ -28,20 +30,22 @@
28 30 if ( ! $order instanceof LP_Order ) {
29 31 return false;
30 32 }
31 33
32 - $order->set_order_date( current_time( 'mysql' ) );
34 + //$order->set_order_date( time() );
33 35 $order->set_order_key( learn_press_generate_order_key() );
36 + $status = $this->format_status_save_db( $order );
37 + $lp_time = new LP_Datetime( time() );
34 38
35 39 $order_data = array(
36 40 'post_author' => get_current_user_id(),
37 41 'post_parent' => $order->get_parent_id(),
38 42 'post_type' => LP_ORDER_CPT,
39 - 'post_status' => $order->get_order_status(),
43 + 'post_status' => $status,
40 44 'ping_status' => 'closed',
41 45 '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 ),
46 + 'post_date' => $lp_time->toSql( true ),
47 + 'post_date_gmt' => $lp_time->toSql(),
44 48 'post_excerpt' => $order->get_customer_note(),
45 49 );
46 50
47 51 $order_data = apply_filters( 'learn-press/order/new-data', $order_data );
@@ -46,11 +50,17 @@
46 50
47 51 $order_data = apply_filters( 'learn-press/order/new-data', $order_data );
48 52
49 53 $id = wp_insert_post( $order_data, true );
50 -
51 54 if ( $id && ! is_wp_error( $id ) ) {
52 55 $order->set_id( $id );
56 + // Update title oder when order is have just create.
57 + wp_update_post(
58 + array(
59 + 'ID' => $id,
60 + 'post_title' => learn_press_transaction_order_number( $id ),
61 + )
62 + );
53 63 $this->_updates( $order );
54 64 }
55 65
56 66 return $id;
@@ -56,10 +66,89 @@
56 66 return $id;
57 67 }
58 68
59 69 /**
70 + * Update order.
71 + *
60 72 * @param LP_Order $order
73 + *
74 + * @return int
75 + * @Todo tungnx - check method
61 76 */
77 + public function update( &$order ) {
78 + if ( ! $order instanceof LP_Order ) {
79 + return false;
80 + }
81 +
82 + $post = get_post( $order->get_id() );
83 + $status = $this->format_status_save_db( $order );
84 + $post_data = array(
85 + 'post_status' => $status,
86 + );
87 +
88 + // For case edit Order on Backend.
89 + if ( isset( $_POST['order-date'] ) ) {
90 + // Data time submit edit order will is local time
91 + $order_date = LP_Request::get_param( 'order-date' );
92 + $order_hour = LP_Request::get_param( 'order-hour', '00' );
93 + $order_min = LP_Request::get_param( 'order-minute', '00' );
94 + $date_time_local = $order_date . ' ' . $order_hour . ':' . $order_min . ':00';
95 +
96 + // Date GMT
97 + $lpDateTimeLocal = new LP_Datetime( $date_time_local );
98 + $date_time_gmt = $lpDateTimeLocal->to_gmt_string( $lpDateTimeLocal );
99 + $post_data['post_date'] = $date_time_local;
100 + $post_data['post_date_gmt'] = $date_time_gmt;
101 + } elseif ( $post->post_status === 'auto-draft'
102 + && $post->post_date_gmt === '0000-00-00 00:00:00' ) {
103 + $date_time_gmt = get_gmt_from_date( $post->post_date );
104 + $post_data['post_date_gmt'] = $date_time_gmt;
105 + }
106 +
107 + $post_data = apply_filters( 'learn-press/order/update-data', $post_data, $order->get_id() );
108 +
109 + /**
110 + * When updating this object, to prevent infinite loops, use $wpdb
111 + * to update data, since wp_update_post spawns more calls to the
112 + * save_post action.
113 + *
114 + * This ensures hooks are fired by either WP itself (admin screen save),
115 + * or an update purely from CRUD.
116 + */
117 + if ( doing_action( 'save_post' ) ) {
118 + $GLOBALS['wpdb']->update( $GLOBALS['wpdb']->posts, $post_data, array( 'ID' => $order->get_id() ) );
119 + clean_post_cache( $order->get_id() );
120 + } else {
121 + wp_update_post( array_merge( array( 'ID' => $order->get_id() ), $post_data ) );
122 + }
123 + $this->_updates( $order );
124 +
125 + return $order->get_id();
126 + }
127 +
128 + /**
129 + * Format status of LP Order before save DB.
130 + *
131 + * @param LP_Order $lp_order
132 + *
133 + * @return string
134 + */
135 + private function format_status_save_db( LP_Order $lp_order ): string {
136 + $status = ! empty( $lp_order->get_status() ) ? $lp_order->get_status() : LP_ORDER_PENDING;
137 + if ( $status === LP_ORDER_TRASH || $status === 'auto-draft' ) {
138 + return $status;
139 + }
140 +
141 + if ( ! preg_match( '/^lp-/', $status ) ) {
142 + $status = 'lp-' . $status;
143 + }
144 +
145 + return $status;
146 + }
147 +
148 + /**
149 + * @param LP_Order $order
150 + */
62 151 public function _updates( &$order ) {
63 152 $this->update_post_meta( $order );
64 153 $order->update_meta();
65 154 }
@@ -74,9 +163,9 @@
74 163 '_user_id' => $order->get_user_id(),
75 164 '_order_subtotal' => $order->get_subtotal(),
76 165 '_order_total' => $order->get_total(),
77 166 '_order_key' => $order->get_order_key(),
78 - '_payment_method' => $order->get_payment_method_title(),
167 + '_payment_method' => $order->get_data( 'payment_method', '' ),
79 168 '_payment_method_title' => $order->get_payment_method_title(),
80 169 '_user_ip_address' => $order->get_user_ip_address(),
81 170 '_user_agent' => $order->get_user_agent(),
82 171 '_order_version' => '3.0.0',
@@ -100,9 +189,9 @@
100 189 *
101 190 * @return mixed
102 191 */
103 192 /*
104 - old function - comment by tungnx
193 + old function - comment by tungnx
105 194 public function read_items( $order ) {
106 195 global $wpdb;
107 196 $screen = function_exists('get_current_screen')? get_current_screen():null;
108 197 $query = $wpdb->prepare( "
@@ -142,10 +231,17 @@
142 231 * @param LP_Order $order
143 232 *
144 233 * @return mixed
145 234 * @author tungnx
235 + * Todo: review to rewrite.
146 236 */
147 237 public function read_items( $order ) {
238 + $key = "order/{$order->get_id()}/{$order->get_status()}/items";
239 + $items = LP_Cache::cache_load_first( 'get', $key );
240 + if ( false !== $items ) {
241 + return $items;
242 + }
243 +
148 244 global $wpdb;
149 245
150 246 $table_order_items = $wpdb->learnpress_order_items;
151 247 $table_order_item_meta = $wpdb->learnpress_order_itemmeta;
@@ -190,8 +286,10 @@
190 286 $items[ $order_item_meta->order_item_id ][ $order_item_meta->meta_key ] = $order_item_meta->meta_value;
191 287 }
192 288 }
193 289
290 + LP_Cache::cache_load_first( 'set', $key, $items );
291 +
194 292 return $items; // apply_filters( 'learn_press_order_get_items', $items, $this );
195 293 }
196 294
197 295 /**
@@ -257,64 +355,20 @@
257 355
258 356 return $items; // apply_filters( 'learn_press_order_get_items', $items, $this );
259 357 }
260 358
261 - public function getTotalItem() {
359 + /*public function getTotalItem() {
360 + }*/
262 361
263 - }
264 -
265 - public function get_item_meta( &$item ) {
362 + /*public function get_item_meta( &$item ) {
266 363 $metas = get_metadata( 'learnpress_order_item', $item['id'] );
267 364 if ( $metas ) {
268 365 foreach ( $metas as $k => $v ) {
269 366 $item[ preg_replace( '!^_!', '', $k ) ] = LP_Helper::maybe_unserialize( $v[0] );
270 367 }
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 368 }
312 - $this->_updates( $order );
369 + }*/
313 370
314 - return $order->get_id();
315 - }
316 -
317 371 public function delete( &$object ) {
318 372 // TODO: Implement delete() method.
319 373 }
320 374
@@ -321,10 +375,12 @@
321 375 /**
322 376 * @param LP_Order $order
323 377 *
324 378 * @return LP_Order
379 + * @deprecated 4.2.3.5
325 380 */
326 - public function cln( $order ) {
381 + /*public function cln( $order ) {
382 + _deprecated_function( __METHOD__, '4.2.3.5' );
327 383
328 384 $cloned = clone $order;
329 385
330 386 $cloned->set_id( 0 );
@@ -350,9 +406,9 @@
350 406
351 407 $this->cln_items( $order->get_id(), $cloned->get_id() );
352 408
353 409 return $cloned;
354 - }
410 + }*/
355 411
356 412 /**
357 413 * Clone items from an order to another
358 414 *
@@ -359,10 +415,12 @@
359 415 * @param int $from
360 416 * @param int $to
361 417 *
362 418 * @return mixed
419 + * @deprecated 4.2.3.5
363 420 */
364 - public function cln_items( $from, $to ) {
421 + /*public function cln_items( $from, $to ) {
422 + _deprecated_function( __METHOD__, '4.2.3.5' );
365 423 $order = learn_press_get_order( $from );
366 424 global $wpdb;
367 425
368 426 $query = $wpdb->prepare(
@@ -370,9 +428,9 @@
370 428 SELECT *
371 429 FROM {$wpdb->learnpress_order_items} oi
372 430 INNER JOIN {$wpdb->learnpress_order_itemmeta} oim ON oi.order_item_id = oim.learnpress_order_item_id
373 431 WHERE order_id = %d
374 - ",
432 + ",
375 433 $from
376 434 );
377 435
378 436 $items = $order->get_items();
@@ -419,9 +477,9 @@
419 477 }
420 478 $this->read_items( $order );
421 479
422 480 return true;
423 - }
481 + }*/
424 482
425 483 /**
426 484 * Load order data
427 485 *
@@ -453,27 +511,29 @@
453 511 } else {
454 512 $users = 0;
455 513 }
456 514
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 - );
515 + $lpDateTimeGmt = new LP_Datetime( $post->post_date_gmt );
516 + $date_local = $lpDateTimeGmt->toSql( true );
517 + $order->set_order_date( new LP_Datetime( $date_local ) );
474 518
475 - $order->get_items();
519 + $order->set_user_id( $users );
520 + $order->set_date_modified( new LP_Datetime( $post->post_modified ) );
521 + $order->set_status( str_replace( 'lp-', '', $post->post_status ) );
522 + $order->set_parent_id( $post->post_parent );
523 + $order->set_created_via( get_post_meta( $post->ID, '_created_via', true ) );
524 + $order->set_total( get_post_meta( $post->ID, '_order_total', true ) );
525 + $order->set_subtotal( get_post_meta( $post->ID, '_order_subtotal', true ) );
526 + $order->set_order_key( get_post_meta( $post->ID, '_order_key', true ) );
527 + $order->set_user_ip_address( get_post_meta( $post->ID, '_user_ip_address', true ) );
528 + $order->set_user_agent( get_post_meta( $post->ID, '_user_agent', true ) );
529 + $order->set_checkout_email( get_post_meta( $post->ID, '_checkout_email', true ) );
530 + $order->set_currency( get_post_meta( $post->ID, '_order_currency', true ) );
531 + $order->set_data( 'order_subtotal', get_post_meta( $post->ID, '_order_subtotal', true ) );
532 + $order->set_data( 'order_total', get_post_meta( $post->ID, '_order_total', true ) );
533 + $order->set_data( 'payment_method', get_post_meta( $post->ID, '_payment_method', true ) );
534 + $order->set_data( 'payment_method_title', get_post_meta( $post->ID, '_payment_method_title', true ) );
535 + //$order->get_items();
476 536 $order->read_meta();
477 537 }
478 538
479 539 return true;
@@ -492,23 +552,23 @@
492 552 $order = $this->get_order_by_key( $order_key );
493 553
494 554 // Validations
495 555 if ( ! $order ) {
496 - throw new Exception( esc_html__( 'Invalid order.', 'learnpress' ) );
556 + throw new Exception( esc_html__( 'Invalid Order key.', 'learnpress' ) );
497 557 }
498 558
499 559 if ( ! $order->is_guest() ) {
500 - throw new Exception( esc_html__( 'Order is already assigned.', 'learnpress' ) );
560 + throw new Exception( esc_html__( 'Order key is already assigned.', 'learnpress' ) );
501 561 }
502 562
503 563 $user = learn_press_get_user( $user_id );
504 564
505 565 if ( ! $user || $user instanceof LP_User_Guest ) {
506 - throw new Exception( esc_html__( 'User invalid!.', 'learnpress' ) );
566 + throw new Exception( esc_html__( 'Invalid User!', 'learnpress' ) );
507 567 }
508 568
509 569 if ( $order->get_checkout_email() !== $user->get_email() ) {
510 - throw new Exception( esc_html__( 'Order key invalid with Email!', 'learnpress' ) );
570 + throw new Exception( esc_html__( 'Invalid order key with Email!', 'learnpress' ) );
511 571 }
512 572
513 573 // Set user to order and update
514 574 $order->set_user_id( $user_id );
@@ -515,13 +575,20 @@
515 575 $order->save();
516 576
517 577 // Update user_id of lp_user_item
518 578 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 );
579 + $user_item_db = LP_User_Items_DB::getInstance();
580 + $filter = new LP_User_Items_Filter();
581 + $filter->ref_id = $order->get_id();
582 + $filter->limit = -1;
583 + $userItemModels = $user_item_db->get_user_items( $filter );
584 + if ( ! empty( $userItemModels ) ) {
585 + foreach ( $userItemModels as $userItemModelObj ) {
586 + $userItemModel = new UserCourseModel( $userItemModelObj );
587 + $userItemModel->user_id = $user_id;
588 + $userItemModel->save();
589 + }
590 + }
524 591 }
525 592
526 593 // Trigger action
527 594 do_action( 'learn-press/order/recovered-successful', $order->get_id(), $user_id );
@@ -558,45 +625,8 @@
558 625 $order = learn_press_get_order( $order_id );
559 626 }
560 627
561 628 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 629 }
600 630
601 631 public function duplicate( &$order, $args = array() ) {
602 632 // TODO: Implement duplicate() method.