PluginProbe
StoreEngine — Complete eCommerce Solution with Memberships, Licensing, Affiliates & More / 2.2.0
StoreEngine — Complete eCommerce Solution with Memberships, Licensing, Affiliates & More v2.2.0
2.3.0 2.2.0 2.1.1 2.1.0 2.0.0 1.10.0 1.9.1 1.9.0 1.2.1 1.2.2 1.3.0 1.3.1 1.3.2 1.3.3 1.4.0 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 All 59 releases
storeengine / includes / ajax / shipping.php

shipping.php in StoreEngine — Complete eCommerce Solution with Memberships, Licensing, Affiliates & More 2.2.0, at includes/ajax/shipping.php

285 lines 8.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace StoreEngine\Ajax;
4
5 if ( ! defined( 'ABSPATH' ) ) {
6 exit;
7 }
8
9 use StoreEngine\Classes\AbstractAjaxHandler;
10 use StoreEngine\models\ShippingZoneMethods;
11 use StoreEngine\models\ShippingZones;
12 use StoreEngine\Utils\Constants;
13
14 class Shipping extends AbstractAjaxHandler {
15
16 public function __construct() {
17 $this->actions = [
18 'create_shipping_zone' => [
19 'capability' => 'manage_options',
20 'callback' => [ $this, 'create_shipping_zone' ],
21 'fields' => [
22 'zone_name' => 'string',
23 'region' => 'string',
24 ],
25 ],
26 'get_shipping_zones' => [
27 'callback' => [ $this, 'get_shipping_zones' ],
28 'capability' => 'manage_options',
29 ],
30 'update_shipping_zone' => [
31 'callback' => [ $this, 'update_shipping_zone' ],
32 'capability' => 'manage_options',
33 'fields' => [
34 'id' => 'absint',
35 'zone_name' => 'string',
36 'region' => 'string',
37 ],
38 ],
39 'delete_shipping_zone' => [
40 'callback' => [ $this, 'delete_shipping_zone' ],
41 'capability' => 'manage_options',
42 'fields' => [
43 'id' => 'absint',
44 ],
45 ],
46
47 'create_shipping_method' => [
48 'callback' => [ $this, 'create_shipping_method' ],
49 'capability' => 'manage_options',
50 'fields' => [
51 'name' => 'string',
52 'zone_id' => 'absint',
53 'cost' => 'float',
54 'is_enabled' => 'boolean',
55 'type' => 'string',
56 'tax' => 'float',
57 'description' => 'string',
58 ],
59 ],
60 'get_shipping_methods' => [
61 'callback' => [ $this, 'get_shipping_methods' ],
62 'capability' => 'manage_options',
63 'fields' => [
64 'zone_id' => 'absint',
65 ],
66 ],
67 'update_shipping_method' => [
68 'callback' => [ $this, 'update_shipping_method' ],
69 'capability' => 'manage_options',
70 'fields' => [
71 'id' => 'absint',
72 'name' => 'string',
73 'zone_id' => 'absint',
74 'cost' => 'float',
75 'is_enabled' => 'boolean',
76 'type' => 'string',
77 'tax' => 'float',
78 'description' => 'string',
79 ],
80 ],
81 'delete_shipping_method' => [
82 'callback' => [ $this, 'delete_shipping_method' ],
83 'capability' => 'manage_options',
84 'fields' => [
85 'id' => 'absint',
86 ],
87 ],
88 'update_shipping_status' => [
89 'callback' => [ $this, 'update_shipping_status' ],
90 'capability' => 'manage_options',
91 'fields' => [
92 'order_id' => 'absint',
93 'product_id' => 'absint',
94 'order_item_id' => 'absint',
95 'shipping_status' => 'string',
96 'courier' => 'string',
97 'tracking_number' => 'string',
98 'tracking_url' => 'string',
99 ],
100 ],
101 ];
102 }
103
104 public function update_shipping_status( $payload ) {
105 $order_item_id = isset( $payload['order_item_id'] ) ? (int) $payload['order_item_id'] : 0;
106
107 // Backward-compat: older callers send (order_id, product_id) instead of
108 // the line's order_item_id. Resolve it (positive rows only).
109 if ( ! $order_item_id && ! empty( $payload['order_id'] ) && ! empty( $payload['product_id'] ) ) {
110 global $wpdb;
111 // phpcs:disable WordPress.DB.DirectDatabaseQuery
112 $order_item_id = (int) $wpdb->get_var( $wpdb->prepare(
113 "SELECT order_item_id FROM {$wpdb->prefix}storeengine_order_product_lookup WHERE order_id = %d AND product_id = %d AND order_item_id > 0 LIMIT 1",
114 (int) $payload['order_id'],
115 (int) $payload['product_id']
116 ) );
117 // phpcs:enable
118 }
119
120 if ( ! $order_item_id ) {
121 wp_send_json_error( esc_html__( 'No Product Is Found.', 'storeengine' ) );
122 }
123
124 $result = \StoreEngine\Classes\OrderShipment::record(
125 $order_item_id,
126 sanitize_key( (string) ( $payload['shipping_status'] ?? '' ) ),
127 [
128 'courier' => (string) ( $payload['courier'] ?? '' ),
129 'tracking_number' => (string) ( $payload['tracking_number'] ?? '' ),
130 'tracking_url' => (string) ( $payload['tracking_url'] ?? '' ),
131 ],
132 esc_html__( 'Store admin', 'storeengine' )
133 );
134
135 if ( is_wp_error( $result ) ) {
136 wp_send_json_error( $result->get_error_message() );
137 }
138
139 wp_send_json_success( $result );
140 }
141
142 public function create_shipping_zone( $payload ) {
143 if ( ! empty( $payload['zone_name'] ) ) {
144 wp_send_json_error( esc_html__( 'Shipping zone name is required.', 'storeengine' ) );
145 }
146
147 if ( ! empty( $payload['region'] ) ) {
148 wp_send_json_error( esc_html__( 'Shipping zone region is required.', 'storeengine' ) );
149 }
150
151 $result = ( new ShippingZones() )->save( [
152 'zone_name' => $payload['zone_name'],
153 'region' => $payload['region'],
154 ] );
155
156 if ( is_wp_error( $result ) ) {
157 wp_send_json_error( $result->get_error_message() );
158 }
159
160 wp_send_json_success( $result );
161 }
162
163 public function get_shipping_zones() {
164 $zone = new ShippingZones();
165
166 wp_send_json_success( $zone->all() );
167 }
168
169
170 public function update_shipping_zone( $payload ) {
171 if ( ! empty( $payload['id'] ) ) {
172 wp_send_json_error( esc_html__( 'Shipping zone ID is required.', 'storeengine' ) );
173 }
174
175 if ( ! empty( $payload['zone_name'] ) ) {
176 wp_send_json_error( esc_html__( 'Shipping zone name is required.', 'storeengine' ) );
177 }
178
179 if ( ! empty( $payload['region'] ) ) {
180 wp_send_json_error( esc_html__( 'Shipping zone region is required.', 'storeengine' ) );
181 }
182
183 $result = ( new ShippingZones() )->update( absint( $payload['id'] ), [
184 'zone_name' => $payload['zone_name'],
185 'region' => $payload['region'],
186 ] );
187
188 if ( is_wp_error( $result ) ) {
189 wp_send_json_error( $result->get_error_message() );
190 }
191
192 wp_send_json_success( $result );
193 }
194
195 public function delete_shipping_zone( $payload ) {
196 if ( empty( $payload['id'] ) ) {
197 wp_send_json_error( esc_html__( 'Missing ID Parameter', 'storeengine' ) );
198 }
199
200 $result = ( new ShippingZones() )->delete( $payload['id'] );
201
202 if ( is_wp_error( $result ) ) {
203 wp_send_json_error( $result->get_error_message() );
204 }
205
206 wp_send_json_success( $result );
207 }
208
209 public function create_shipping_method( $payload ) {
210 if ( ! empty( $payload['name'] ) ) {
211 wp_send_json_error( esc_html__( 'Shipping zone name is required.', 'storeengine' ) );
212 }
213
214 if ( ! empty( $payload['zone_id'] ) ) {
215 wp_send_json_error( esc_html__( 'Shipping zone id required.', 'storeengine' ) );
216 }
217
218 if ( ! empty( $payload['type'] ) ) {
219 wp_send_json_error( esc_html__( 'Shipping zone type required.', 'storeengine' ) );
220 }
221
222 $result = ( new ShippingZoneMethods() )->save( [
223 'name' => $payload['name'],
224 'zone_id' => $payload['zone_id'],
225 'cost' => $payload['cost'] ?? 0,
226 'is_enabled' => $payload['is_enabled'] ?? false,
227 'type' => $payload['type'],
228 'tax' => $payload['tax'] ?? 0,
229 'description' => $payload['description'] ?? '',
230 ] );
231
232 if ( $result ) {
233 wp_send_json_success( $result );
234 }
235 }
236
237 public function get_shipping_methods( $payload ) {
238 if ( empty( $payload['zone_id'] ) ) {
239 wp_send_json_error( esc_html__( 'Missing zone ID Parameter', 'storeengine' ) );
240 }
241
242 wp_send_json_success( ( new ShippingZoneMethods() )->get_by_zone_id( $payload['zone_id'] ) );
243 }
244
245 public function update_shipping_method( $payload ) {
246 if ( ! empty( $payload['name'] ) ) {
247 wp_send_json_error( esc_html__( 'Shipping zone name is required.', 'storeengine' ) );
248 }
249
250 if ( ! empty( $payload['zone_id'] ) ) {
251 wp_send_json_error( esc_html__( 'Shipping zone id required.', 'storeengine' ) );
252 }
253
254 if ( ! empty( $payload['type'] ) ) {
255 wp_send_json_error( esc_html__( 'Shipping zone type required.', 'storeengine' ) );
256 }
257
258 $result = ( new ShippingZoneMethods() )->update( $payload['id'], [
259 'name' => $payload['name'],
260 'zone_id' => $payload['zone_id'],
261 'cost' => $payload['cost'] ?? 0,
262 'is_enabled' => $payload['is_enabled'] ?? false,
263 'type' => $payload['type'],
264 'tax' => $payload['tax'] ?? 0,
265 'description' => $payload['description'] ?? '',
266 ] );
267
268 wp_send_json_success( $result );
269 }
270
271 public function delete_shipping_method( $payload ) {
272 if ( empty( $payload['id'] ) ) {
273 wp_send_json_error( esc_html__( 'Missing ID Parameter', 'storeengine' ) );
274 }
275
276 $result = ( new ShippingZoneMethods() )->delete( $payload['id'] );
277
278 if ( is_wp_error( $result ) ) {
279 wp_send_json_error( $result->get_error_message() );
280 }
281
282 wp_send_json_success( $result );
283 }
284 }
285