1 <?php
2 3 4 5 6 7 8 9 10
11
12
13 if ( !defined( 'ABSPATH' ) ) exit;
14
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
31 function edd_get_payments( $args = array() ) {
32 $defaults = array(
33 'number' => 20,
34 'page' => null,
35 'mode' => 'live',
36 'orderby' => 'ID',
37 'order' => 'DESC',
38 'user' => null,
39 'status' => 'any',
40 'meta_key' => null,
41 'year' => null,
42 'month' => null,
43 'day' => null,
44 's' => null,
45 'children' => false,
46 'fields' => null
47 );
48
49 $args = wp_parse_args( $args, $defaults );
50
51 $payment_args = array(
52 'post_type' => 'edd_payment',
53 'paged' => $args['page'],
54 'order' => $args['order'],
55 'orderby' => $args['orderby'],
56 'post_status' => $args['status'],
57 'year' => $args['year'],
58 'monthnum' => $args['month'],
59 'day' => $args['day'],
60 'fields' => $args['fields']
61 );
62
63 if( $args['number'] == -1 )
64 $payment_args['nopaging'] = true;
65 else
66 $payment_args['posts_per_page'] = $args['number'];
67
68 switch ( $args['orderby'] ) :
69 case 'amount' :
70 $payment_args['orderby'] = 'meta_value_num';
71 $payment_args['meta_key'] = '_edd_payment_total';
72 break;
73 default :
74 $payment_args['orderby'] = $args['status'];
75 break;
76 endswitch;
77
78 if ( ! $args['children'] )
79 $payment_args['post_parent'] = 0;
80
81 if ( ! is_null( $args['meta_key'] ) )
82 $payment_args['meta_key'] = $args['meta_key'];
83
84 if ( ! is_null( $args['user'] ) ) {
85 if ( is_numeric( $args['user'] ) ) {
86 $user_key = '_edd_payment_user_id';
87 } else {
88 $user_key = '_edd_payment_user_email';
89 }
90 $payment_args['meta_query'] = array(
91 array(
92 'key' => $user_key,
93 'value' => $args['user']
94 )
95 );
96 }
97
98 $search = trim( $args['s'] );
99
100 if ( is_email( $search ) || strlen( $search ) == 32 ) {
101
102 $key = is_email( $search ) ? '_edd_payment_user_email' : '_edd_payment_purchase_key';
103
104 $search_meta = array(
105 'key' => $key,
106 'value' => $search
107 );
108
109 if ( isset( $payment_args['meta_query'] ) ) {
110 $payment_args['meta_query'][1] = $search_meta;
111 } else {
112
113 $payment_args['meta_query'] = array( $search_meta );
114 }
115 } elseif ( is_numeric( $search ) ) {
116
117 $search_meta = array(
118 'key' => '_edd_payment_user_id',
119 'value' => $search
120 );
121
122 if ( isset( $payment_args['meta_query'] ) ) {
123 $payment_args['meta_query'][1] = $search_meta;
124 } else {
125
126 $payment_args['meta_query'] = array( $search_meta );
127 }
128 } else {
129 $payment_args['s'] = $search;
130 }
131
132 if ( $args['mode'] != 'all' ) {
133 if ( isset( $payment_args['meta_query'] ) ) {
134
135
136 $payment_args['meta_query'][2] = array(
137 'key' => '_edd_payment_mode',
138 'value' => $args['mode']
139 );
140 } else {
141
142 $payment_args['meta_query'] = array(
143 array(
144 'key' => '_edd_payment_mode',
145 'value' => $args['mode']
146 )
147 );
148 }
149 }
150
151 $payments = get_posts( apply_filters( 'edd_get_payments_args', $payment_args ) );
152 if ( $payments ) {
153 return $payments;
154 }
155
156 return false;
157 }
158
159 160 161 162 163 164 165
166 function edd_insert_payment( $payment_data = array() ) {
167 if ( empty( $payment_data ) )
168 return false;
169
170
171 if ( isset( $payment_data['user_info']['first_name'] ) || isset( $payment_data['user_info']['last_name'] ) ) {
172 $payment_title = $payment_data['user_info']['first_name'] . ' ' . $payment_data['user_info']['last_name'];
173 } else {
174 $payment_title = $payment_data['user_email'];
175 }
176
177
178 if ( $payment_data['user_info']['discount'] != 'none' ) {
179 $discount = edd_get_discount_by_code( $payment_data['user_info']['discount'] );
180 }
181
182 $args = apply_filters( 'edd_insert_payment_args', array(
183 'post_title' => $payment_title,
184 'post_status' => isset( $payment_data['status'] ) ? $payment_data['status'] : 'pending',
185 'post_type' => 'edd_payment',
186 'post_parent' => isset( $payment_data['parent'] ) ? $payment_data['parent'] : null,
187 'post_date' => isset( $payment_data['post_date'] ) ? $payment_data['post_date'] : null,
188 'post_date_gmt' => isset( $payment_data['post_date'] ) ? $payment_data['post_date'] : null
189 ), $payment_data );
190
191
192 $payment = wp_insert_post( $args );
193
194 if ( $payment ) {
195 $payment_meta = array(
196 'currency' => $payment_data['currency'],
197 'downloads' => serialize( $payment_data['downloads'] ),
198 'user_info' => serialize( $payment_data['user_info'] ),
199 'cart_details' => serialize( $payment_data['cart_details'] ),
200 'tax' => edd_is_cart_taxed() ? edd_get_cart_tax() : 0,
201 );
202
203 $mode = edd_is_test_mode() ? 'test' : 'live';
204 $gateway = isset( $_POST['edd-gateway'] ) ? $_POST['edd-gateway'] : '';
205
206
207 update_post_meta( $payment, '_edd_payment_meta', apply_filters( 'edd_payment_meta', $payment_meta, $payment_data ) );
208 update_post_meta( $payment, '_edd_payment_user_id', $payment_data['user_info']['id'] );
209 update_post_meta( $payment, '_edd_payment_user_email', $payment_data['user_email'] );
210 update_post_meta( $payment, '_edd_payment_user_ip', edd_get_ip() );
211 update_post_meta( $payment, '_edd_payment_purchase_key', $payment_data['purchase_key'] );
212 update_post_meta( $payment, '_edd_payment_total', $payment_data['price'] );
213 update_post_meta( $payment, '_edd_payment_mode', $mode );
214 update_post_meta( $payment, '_edd_payment_gateway', $gateway );
215 if ( ! empty( $discount ) )
216 update_post_meta( $payment, '_edd_payment_discount_id', $discount->ID );
217
218
219 delete_transient( 'edd_user_' . $payment_data['user_info']['id'] . '_purchases' );
220
221 do_action( 'edd_insert_payment', $payment, $payment_data );
222
223 return $payment;
224 }
225
226 return false;
227 }
228
229 230 231 232 233 234 235 236
237 function edd_update_payment_status( $payment_id, $new_status = 'publish' ) {
238 if ( $new_status == 'completed' || $new_status == 'complete' ) {
239 $new_status = 'publish';
240 }
241
242 $payment = get_post( $payment_id );
243
244 if ( is_wp_error( $payment ) || !is_object( $payment ) )
245 return;
246
247 $old_status = $payment->post_status;
248
249 if ( $old_status === $new_status )
250 return;
251
252 do_action( 'edd_before_payment_status_change', $payment_id, $new_status, $old_status );
253
254 $update_fields = array( 'ID' => $payment_id, 'post_status' => $new_status );
255
256 wp_update_post( apply_filters( 'edd_update_payment_status_fields', $update_fields ) );
257
258 do_action( 'edd_update_payment_status', $payment_id, $new_status, $old_status );
259 }
260
261 262 263 264 265 266 267 268 269
270 function edd_delete_purchase( $payment_id = 0 ) {
271 global $edd_logs;
272
273 $downloads = edd_get_payment_meta_downloads( $payment_id );
274
275 if ( is_array( $downloads ) ) {
276
277 foreach ( $downloads as $download ) {
278 edd_undo_purchase( $download['id'], $payment_id );
279 }
280 }
281
282 do_action( 'edd_payment_delete', $payment_id );
283
284
285 wp_delete_post( $payment_id, true );
286
287
288 $edd_logs->delete_logs(
289 null,
290 'sale',
291 array(
292 array(
293 'key' => '_edd_log_payment_id',
294 'value' => $payment_id
295 )
296 )
297 );
298
299 do_action( 'edd_payment_deleted', $payment_id );
300 }
301
302 303 304 305 306 307 308 309 310
311 function edd_undo_purchase( $download_id, $payment_id ) {
312 $payment = get_post( $payment_id );
313
314 $status = $payment->post_status;
315
316 if ( $status != 'publish' )
317 return;
318
319 edd_decrease_purchase_count( $download_id );
320 $purchase_meta = edd_get_payment_meta( $payment_id );
321 $user_purchase_info = maybe_unserialize( $purchase_meta['user_info'] );
322 $cart_details = maybe_unserialize( $purchase_meta['cart_details'] );
323 $amount = null;
324
325 if ( is_array( $cart_details ) ) {
326 $cart_item_id = array_search( $download_id, $cart_details );
327 $amount = isset( $cart_details[$cart_item_id]['price'] ) ? $cart_details[$cart_item_id]['price'] : null;
328 }
329
330 $amount = edd_get_download_final_price( $download_id, $user_purchase_info, $amount );
331
332 edd_decrease_earnings( $download_id, $amount );
333 }
334
335 336 337 338 339 340 341
342 function edd_check_for_existing_payment( $payment_id ) {
343 $payment = get_post( $payment_id );
344
345 if ( $payment && $payment->post_status == 'publish' ) {
346 return true;
347 }
348
349 return false;
350 }
351
352 353 354 355 356 357 358 359
360 function edd_get_payment_status( $payment = OBJECT, $return_label = false ) {
361 if ( ! is_object( $payment ) || !isset( $payment->post_status ) )
362 return false;
363
364 $statuses = edd_get_payment_statuses();
365 if ( ! is_array( $statuses ) || empty( $statuses ) )
366 return false;
367
368 if ( array_key_exists( $payment->post_status, $statuses ) ) {
369 if ( true === $return_label ) {
370 return $statuses[ $payment->post_status ];
371 } else {
372 return array_search( $payment->post_status, $statuses );
373 }
374 }
375
376 return false;
377 }
378
379 380 381 382 383 384
385 function edd_get_payment_statuses() {
386 $payment_statuses = array(
387 'pending' => __( 'Pending', 'edd' ),
388 'publish' => __( 'Complete', 'edd' ),
389 'refunded' => __( 'Refunded', 'edd' ),
390 'failed' => __( 'Failed', 'edd' ),
391 'revoked' => __( 'Revoked', 'edd' )
392 );
393
394 return apply_filters( 'edd_payment_statuses', $payment_statuses );
395 }
396
397 398 399 400 401 402 403 404 405 406
407 function edd_get_earnings_by_date( $day = null, $month_num, $year = null, $hour = null ) {
408 $args = array(
409 'post_type' => 'edd_payment',
410 'nopaging' => true,
411 'year' => $year,
412 'monthnum' => $month_num,
413 'meta_key' => '_edd_payment_mode',
414 'meta_value' => 'live',
415 'post_status' => 'publish',
416 'fields' => 'ids',
417 'update_post_term_cache' => false
418 );
419 if ( ! empty( $day ) )
420 $args['day'] = $day;
421
422 if ( ! empty( $hour ) )
423 $args['hour'] = $hour;
424
425 $args = apply_filters( 'edd_get_earnings_by_date_args', $args );
426 $key = md5( serialize( $args ) );
427 $earnings = get_transient( $key );
428
429 if( false === $earnings ) {
430 $sales = get_posts( $args );
431 $earnings = 0;
432 if ( $sales ) {
433 foreach ( $sales as $sale ) {
434 $amount = edd_get_payment_amount( $sale );
435 $earnings = $earnings + $amount;
436 }
437 }
438
439 set_transient( $key, $earnings, 60*60 );
440 }
441
442 return round( $earnings, 2 );
443 }
444
445 446 447 448 449 450 451 452 453 454 455
456 function edd_get_sales_by_date( $day = null, $month_num = null, $year = null, $hour = null ) {
457 $args = array(
458 'post_type' => 'edd_payment',
459 'nopaging' => true,
460 'year' => $year,
461 'meta_key' => '_edd_payment_mode',
462 'meta_value' => 'live',
463 'fields' => 'ids',
464 'post_status' => 'publish',
465 'update_post_meta_cache' => false,
466 'update_post_term_cache' => false
467 );
468
469 if ( ! empty( $month_num ) )
470 $args['monthnum'] = $month_num;
471
472 if ( ! empty( $day ) )
473 $args['day'] = $day;
474
475 if ( ! empty( $hour ) )
476 $args['hour'] = $hour;
477
478 $key = md5( serialize( $args ) );
479 $count = get_transient( $key, 'edd' );
480
481 if( false === $count ) {
482 $sales = new WP_Query( $args );
483 $count = (int) $sales->post_count;
484
485 set_transient( $key, $count, 60*60 );
486 }
487
488 return $count;
489 }
490
491 492 493 494 495 496 497
498 function edd_is_payment_complete( $payment_id ) {
499 $payment = get_post( $payment_id );
500 if ( $payment )
501 if ( $payment->post_status == 'publish' )
502 return true;
503 return false;
504 }
505
506 507 508 509 510 511
512 function edd_get_total_sales() {
513 $args = apply_filters( 'edd_get_total_sales_args', array(
514 'post_type' => 'edd_payment',
515 'nopaging' => true,
516 'meta_key' => '_edd_payment_mode',
517 'meta_value' => 'live',
518 'fields' => 'ids',
519 'post_status' => 'publish',
520 'update_post_meta_cache' => false,
521 'update_post_term_cache' => false
522 ) );
523
524 $key = md5( serialize( $args ) );
525 $count = get_transient( $key );
526
527 if ( false === $count ) {
528 $sales = new WP_Query( $args );
529 $count = (int) $sales->post_count;
530 set_transient( $key, $count, 60 * 60 );
531
532 }
533 return $count;
534 }
535
536 537 538 539 540 541
542 function edd_get_total_earnings() {
543
544 $total = get_transient( 'edd_earnings_total' );
545
546 if( false === $total ) {
547
548 $total = (float) 0;
549
550 $args = apply_filters( 'edd_get_total_earnings_args', array(
551 'offset' => 0,
552 'number' => -1,
553 'mode' => 'live',
554 'status' => 'publish',
555 'fields' => 'ids'
556 ) );
557
558 $payments = edd_get_payments( $args );
559 if ( $payments ) {
560 foreach ( $payments as $payment ) {
561 $total += edd_get_payment_amount( $payment );
562 }
563 }
564
565
566 set_transient( 'edd_earnings_total', $total, 86400 );
567 }
568 return apply_filters( 'edd_total_earnings', $total );
569 }
570
571 572 573 574 575 576 577
578 function edd_get_payment_meta( $payment_id ) {
579 $meta = get_post_meta( $payment_id, '_edd_payment_meta', true );
580
581
582 if ( ! isset( $meta['key'] ) )
583 $meta['key'] = edd_get_payment_key( $payment_id );
584
585 if ( ! isset( $meta['amount'] ) )
586 $meta['amount'] = edd_get_payment_amount( $payment_id );
587
588 if ( ! isset( $meta['email'] ) )
589 $meta['email'] = edd_get_payment_user_email( $payment_id );
590
591 if ( ! isset( $meta['date'] ) )
592 $meta['date'] = get_post_field( 'post_date', $payment_id );
593
594 return apply_filters( 'edd_get_payment_meta', $meta, $payment_id );
595 }
596
597 598 599 600 601 602 603
604 function edd_get_payment_meta_user_info( $payment_id ) {
605 $payment_meta = edd_get_payment_meta( $payment_id );
606 $user_info = isset( $payment_meta['user_info'] ) ? maybe_unserialize( $payment_meta['user_info'] ) : false;
607
608 return apply_filters( 'edd_payment_meta_user_info', $user_info );
609 }
610
611 612 613 614 615 616 617
618 function edd_get_payment_meta_downloads( $payment_id ) {
619 $payment_meta = edd_get_payment_meta( $payment_id );
620 $downloads = maybe_unserialize( $payment_meta['downloads'] );
621
622 return apply_filters( 'edd_payment_meta_downloads', $downloads );
623 }
624
625 626 627 628 629 630 631
632 function edd_get_payment_meta_cart_details( $payment_id ) {
633 $payment_meta = edd_get_payment_meta( $payment_id );
634 $cart_details = maybe_unserialize( $payment_meta['cart_details'] );
635
636 return apply_filters( 'edd_payment_meta_cart_details', $cart_details );
637 }
638
639 640 641 642 643 644 645
646 function edd_get_payment_user_email( $payment_id ) {
647 $email = get_post_meta( $payment_id, '_edd_payment_user_email', true );
648
649 return apply_filters( 'edd_payment_user_email', $email );
650 }
651
652
653 654 655 656 657 658 659
660 function edd_get_payment_user_id( $payment_id ) {
661 $user_id = get_post_meta( $payment_id, '_edd_payment_user_id', true );
662
663 return apply_filters( 'edd_payment_user_id', $user_id );
664 }
665
666 667 668 669 670 671 672
673 function edd_get_payment_gateway( $payment_id ) {
674 $gateway = get_post_meta( $payment_id, '_edd_payment_gateway', true );
675
676 return apply_filters( 'edd_payment_gateway', $gateway );
677 }
678
679 680 681 682 683 684 685
686 function edd_get_payment_key( $payment_id = 0 ) {
687 $key = get_post_meta( $payment_id, '_edd_payment_purchase_key', true );
688 return apply_filters( 'edd_payment_key', $key, $payment_id );
689 }
690
691 692 693 694 695 696 697 698 699
700 function edd_payment_amount( $payment_id = 0 ) {
701 $amount = edd_get_payment_amount( $payment_id );
702 return edd_currency_filter( edd_format_amount( $amount ) );
703 }
704 705 706 707 708 709 710 711
712 function edd_get_payment_amount( $payment_id ) {
713 $amount = get_post_meta( $payment_id, '_edd_payment_total', true );
714
715 if ( empty( $amount ) && $amount != 0 ) {
716 $payment_meta = edd_get_payment_meta( $payment_id );
717 $amount = $payment_meta['amount'];
718 }
719
720 return apply_filters( 'edd_payment_amount', $amount );
721 }
722
723 724 725 726 727 728 729 730 731 732 733
734 function edd_payment_subtotal( $payment_id = 0, $payment_meta = false ) {
735 $subtotal = edd_get_payment_subtotal( $payment_id, $payment_meta );
736
737 return edd_currency_filter( edd_format_amount( $subtotal ) );
738 }
739
740 741 742 743 744 745 746 747 748 749
750 function edd_get_payment_subtotal( $payment_id = 0, $payment_meta = false ) {
751 global $edd_options;
752
753 if ( ! $payment_meta )
754 $payment_meta = edd_get_payment_meta( $payment_id );
755
756 $subtotal = isset( $payment_meta['subtotal'] ) ? $payment_meta['subtotal'] : $payment_meta['amount'];
757
758 $tax = edd_use_taxes() ? edd_get_payment_tax( $payment_id ) : 0;
759
760 if (
761 ( isset( $edd_options['prices_include_tax'] ) && $edd_options['prices_include_tax'] == 'no' && ! edd_prices_show_tax_on_checkout() ) ||
762 ( isset( $edd_options['prices_include_tax'] ) && ! edd_prices_show_tax_on_checkout() && $edd_options['prices_include_tax'] == 'yes' )
763 ) {
764 $subtotal -= $tax;
765 }
766
767 return apply_filters( 'edd_get_payment_subtotal', $subtotal, $payment_id );
768 }
769
770 771 772 773 774 775 776 777 778 779
780 function edd_payment_tax( $payment_id = 0, $payment_meta = false ) {
781 $tax = edd_get_payment_tax( $payment_id, $payment_meta );
782
783 return edd_currency_filter( edd_format_amount( $tax ) );
784 }
785
786 787 788 789 790 791 792 793
794 function edd_get_payment_tax( $payment_id = 0, $payment_meta = false ) {
795 if ( ! $payment_meta )
796 $payment_meta = edd_get_payment_meta( $payment_id );
797
798 $tax = isset( $payment_meta['tax'] ) ? $payment_meta['tax'] : 0;
799
800 return apply_filters( 'edd_get_payment_tax', $tax, $payment_id );
801 }
802
803 804 805 806 807 808 809 810
811 function edd_get_payment_fees( $payment_id = 0, $payment_meta = false ) {
812 if ( ! $payment_meta )
813 $payment_meta = edd_get_payment_meta( $payment_id );
814
815 $fees = array();
816 $payment_fees = isset( $payment_meta['fees'] ) ? $payment_meta['fees'] : false;
817
818 if ( ! empty( $payment_fees ) ) {
819 foreach ( $payment_fees as $fee_id => $fee ) {
820 $fees[] = array(
821 'id' => $fee_id,
822 'amount' => $fee['amount'],
823 'label' => $fee['label']
824 );
825 }
826 }
827
828 return apply_filters( 'edd_get_payment_fees', $fees, $payment_id );
829 }
830
831 832 833 834 835 836 837 838 839
840 function edd_get_purchase_id_by_key( $key ) {
841 global $wpdb;
842
843 $purchase = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_edd_payment_purchase_key' AND meta_value = %s LIMIT 1", $key ) );
844
845 if ( $purchase != NULL )
846 return $purchase;
847
848 return 0;
849 }
850
851 852 853 854 855 856 857
858 function edd_get_payment_notes( $payment_id = 0 ) {
859 if ( empty( $payment_id ) )
860 return false;
861
862 remove_filter( 'comments_clauses', 'edd_hide_payment_notes', 10, 2 );
863
864 $notes = get_comments( array( 'post_id' => $payment_id, 'order' => 'ASC' ) );
865
866 add_filter( 'comments_clauses', 'edd_hide_payment_notes', 10, 2 );
867
868 return $notes;
869 }
870
871 872 873 874 875 876 877 878
879 function edd_insert_payment_note( $payment_id = 0, $note = '' ) {
880 if ( empty( $payment_id ) )
881 return false;
882
883 do_action( 'edd_pre_insert_payment_note', $payment_id, $note );
884
885 $note_id = wp_insert_comment( wp_filter_comment( array(
886 'comment_post_ID' => $payment_id,
887 'comment_content' => $note,
888 'user_id' => is_admin() ? get_current_user_id() : 0,
889 'comment_date' => current_time( 'mysql' ),
890 'comment_date_gmt' => current_time( 'mysql', 1 ),
891 'comment_approved' => 1,
892 'comment_parent' => 0,
893 'comment_author' => '',
894 'comment_author_IP' => '',
895 'comment_author_url' => '',
896 'comment_author_email' => '',
897 'comment_type' => 'edd_payment_note'
898
899 ) ) );
900
901 do_action( 'edd_insert_payment_note', $note_id, $payment_id, $note );
902
903 return $note_id;
904 }
905
906 907 908 909 910 911 912 913 914
915 function edd_hide_payment_notes( $clauses, $wp_comment_query ) {
916 global $wpdb;
917
918 if ( ! $clauses['join'] )
919 $clauses['join'] = "JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID";
920
921 if ( ! $wp_comment_query->query_vars['post_type' ] )
922 $clauses['where'] .= $wpdb->prepare( " AND {$wpdb->posts}.post_type != %s", 'edd_payment' );
923
924 return $clauses;
925 }
926 add_filter( 'comments_clauses', 'edd_hide_payment_notes', 10, 2 );
927
928 929 930 931 932 933 934 935
936 function edd_hide_payment_notes_from_feeds( $where, $wp_comment_query ) {
937 global $wpdb;
938
939 if ( ! $wp_comment_query->query_vars['post_type' ] )
940 $where .= $wpdb->prepare( " AND post_type != %s", 'edd_payment' );
941
942 return $where;
943 }
944 add_filter( 'comment_feed_where', 'edd_hide_payment_notes_from_feeds', 10, 2 );