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

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

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