PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.6
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.6
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 / Ajax / Order / ExportOrderCSVAjax.php

ExportOrderCSVAjax.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.6, at inc/Ajax/Order/ExportOrderCSVAjax.php

234 lines 5.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace LearnPress\Ajax\Order;
4
5 use Exception;
6 use LearnPress\Ajax\AbstractAjax;
7 use LearnPress\Databases\PostDB;
8 use LearnPress\Filters\OrderPostFilter;
9 use LearnPress\Models\UserModel;
10 use LP_Datetime;
11 use LP_Helper;
12 use LP_Order;
13 use LP_Request;
14 use LP_REST_Response;
15 use Throwable;
16
17 defined( 'ABSPATH' ) || exit;
18
19 /**
20 * Class ExportOrderCSVAjax
21 *
22 * @author ThimPress
23 * @package LearnPress\Ajax
24 * @since 4.3.2.8
25 * @version 1.0.0
26 */
27 class ExportOrderCSVAjax extends AbstractAjax {
28 /**
29 * Export orders to CSV file, action call from js file: export-order.js
30 *
31 * @return void
32 */
33 public function export_order_csv() {
34 $response = new LP_REST_Response();
35 try {
36 // Check permission
37 if ( ! current_user_can( UserModel::ROLE_ADMINISTRATOR ) ) {
38 throw new Exception( __( 'You do not have permission to perform this action.', 'learnpress' ) );
39 }
40
41 $data_str = LP_Request::get_param( 'data' );
42 $params = LP_Helper::json_decode( $data_str, true );
43
44 $export_id = sanitize_key( $params['export_id'] ?? '' );
45 if ( ! $export_id ) {
46 throw new Exception( __( 'Missing export id', 'learnpress' ) );
47 }
48
49 $paged = max( 1, intval( $params['paged'] ?? 1 ) );
50
51 $post_db = PostDB::getInstance();
52 $filter = new OrderPostFilter();
53 $filter->post_type = LP_ORDER_CPT;
54 LP_Order::handle_params_query_list_orders( $filter, $params );
55 $total_rows = 0;
56 $lp_orders = $post_db->get_posts( $filter, $total_rows );
57
58 if ( count( $lp_orders ) > 0 ) {
59 $file = self::get_export_csv_path( $export_id );
60 $handle = fopen( $file, $paged === 1 ? 'w' : 'a' );
61
62 if ( $paged === 1 ) {
63 fprintf( $handle, "\xEF\xBB\xBF" );
64 fputcsv(
65 $handle,
66 [
67 __( 'Order', 'learnpress' ),
68 __( 'Student', 'learnpress' ),
69 __( 'Purchased', 'learnpress' ),
70 __( 'Date', 'learnpress' ),
71 __( 'Total', 'learnpress' ),
72 __( 'Status', 'learnpress' ),
73 ],
74 ',',
75 '"',
76 '\\',
77 );
78 }
79
80 foreach ( $lp_orders as $order ) {
81 $order_id = $order->ID;
82 $order = learn_press_get_order( $order_id );
83 if ( ! $order ) {
84 continue;
85 }
86 fputcsv(
87 $handle,
88 [
89 $order->get_order_number(),
90 $this->get_order_users( $order ),
91 $this->get_order_items( $order ),
92 $order->get_order_date( 'edit' )->format( LP_Datetime::I18N_FORMAT_HAS_TIME ),
93 $order->get_formatted_order_total(),
94 LP_Order::get_status_label( $order->get_status() ),
95 ],
96 ',',
97 '"',
98 '\\',
99 );
100 }
101
102 fclose( $handle );
103 } else {
104 if ( intval( $paged ) === 1 ) {
105 throw new Exception( __( 'There are no orders.', 'learnpress' ) );
106 }
107 }
108
109 $data = [];
110 $max_page = $post_db::get_total_pages( $filter->limit, $total_rows );
111 $data['max_page'] = $max_page;
112
113 if ( $paged < $max_page ) {
114 $data['next_page'] = $paged + 1;
115 } else {
116 $data['download_url'] = add_query_arg(
117 [
118 'lp_download_order' => 1,
119 'export_id' => $export_id,
120 ],
121 home_url( '/' )
122 );
123 $data['done'] = true;
124 $response->message = esc_html__( 'Orders export successfully!', 'learnpress' );
125 }
126
127 $response->data = $data;
128 $response->status = 'success';
129 } catch ( Throwable $e ) {
130 $response->message = $e->getMessage();
131 }
132
133 wp_send_json( $response );
134 }
135
136 /**
137 * Get export CSV file path
138 *
139 * @param string $export_id
140 *
141 * @return string
142 */
143 public static function get_export_csv_path( string $export_id = '' ): string {
144 $upload = wp_upload_dir();
145 $dir = $upload['basedir'] . '/lp-order-export';
146
147 if ( ! file_exists( $dir ) ) {
148 wp_mkdir_p( $dir );
149 }
150
151 return $dir . "/lp-orders-{$export_id}.csv";
152 }
153
154 /**
155 * @param LP_Order $order
156 *
157 * @return string|null
158 */
159 public function get_order_users( $order ) {
160 $user_ids = $order->get_users();
161 $checkout_email = $order->get_checkout_email();
162
163 if ( $order->is_manual() && empty( $user_ids ) ) {
164 return __( '(No customer)', 'learnpress' );
165 } else {
166 $outputs = array();
167 foreach ( $user_ids as $user_id ) {
168 $userModel = UserModel::find( $user_id, true );
169 if ( $userModel ) {
170 $outputs[] = sprintf(
171 '%s (#%d)',
172 $userModel->get_display_name(),
173 $user_id,
174 );
175 } elseif ( $user_id > 0 ) {
176 $outputs[] = sprintf(
177 __( 'User #%d (Deleted)', 'learnpress' ),
178 $user_id,
179 );
180 } elseif ( ! empty( $checkout_email ) ) {
181 $outputs[] = sprintf(
182 '%s',
183 $order->get_checkout_email(),
184 );
185 } else {
186 $outputs[] = __( '(Guest)', 'learnpress' );
187 }
188 }
189
190 return join( ', ', $outputs );
191 }
192 }
193
194 /**
195 * @param LP_Order $order
196 *
197 * @return string
198 */
199 private function get_order_items( $order ): string {
200 $order_item_str = '';
201 $items = $order->get_all_items();
202 $total_items = count( $items );
203
204 if ( $total_items === 0 ) {
205 return __( '(No item)', 'learnpress' );
206 } else {
207 foreach ( $items as $i => $itemObj ) {
208 $item_type = $itemObj['item_type'] ?? '';
209 $item_id = $itemObj['item_id'] ?? 0;
210 $item_name = $itemObj['order_item_name'] ?? '';
211 $course_id_meta = learn_press_get_order_item_meta( $itemObj['order_item_id'], '_course_id' );
212 // For old data, the data not migrated yet to new column.
213 if ( ( empty( $item_type ) || empty( $item_id ) )
214 && ! empty( $course_id_meta ) ) {
215 $item_id = $course_id_meta;
216 $item_type = LP_COURSE_CPT;
217 }
218
219 $order_item_str .= sprintf(
220 '%s (#%d)',
221 esc_html( $item_name ),
222 $item_id
223 );
224
225 if ( $i < $total_items && $total_items > 1 ) {
226 $order_item_str .= '|';
227 }
228 }
229 }
230
231 return $order_item_str;
232 }
233 }
234