PluginProbe ʕ •ᴥ•ʔ
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress / 4.17.3
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress v4.17.3
4.17.3 4.17.2 4.17.1 4.17.0 4.16.19 4.16.18 4.16.17 4.16.16 trunk 1.0 1.0.1 1.0.2 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5a 1.1.6 1.1.7 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.4 1.4.1 1.4.2 1.5 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 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.7 1.7.1 1.7.2 1.8 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.1.9 2.2.10 2.2.11 2.2.12 2.2.13 2.2.14 2.2.15 2.2.16 2.2.2 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 3.0 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 3.1.19 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.10 3.2.11 3.2.12 3.2.13 3.2.14 3.2.15 3.2.16 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 4.0.0 4.0.1 4.0.2 4.0.3 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.10.2 4.10.3 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.13.3 4.13.4 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.15.0 4.15.1 4.15.10 4.15.11 4.15.12 4.15.13 4.15.14 4.15.15 4.15.16 4.15.17 4.15.18 4.15.19 4.15.2 4.15.20 4.15.20.1 4.15.21 4.15.22 4.15.23 4.15.24 4.15.25 4.15.3 4.15.4 4.15.5 4.15.6 4.15.7 4.15.8 4.15.9 4.16.0 4.16.1 4.16.10 4.16.11 4.16.12 4.16.13 4.16.14 4.16.15 4.16.2 4.16.3 4.16.4 4.16.5 4.16.6 4.16.7 4.16.8 4.16.9 4.2.0 4.3.0 4.3.1 4.3.2 4.4.0 4.4.1 4.5.0 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.7.0 4.8.0 4.9.0
wp-user-avatar / src / Membership / Repositories / OrderRepository.php
wp-user-avatar / src / Membership / Repositories Last commit date
BaseRepository.php 4 years ago CouponRepository.php 3 years ago CustomerRepository.php 1 year ago GroupRepository.php 3 years ago OrderRepository.php 21 hours ago PlanRepository.php 4 months ago RepositoryInterface.php 4 years ago SubscriptionRepository.php 5 months ago index.php 3 years ago
OrderRepository.php
517 lines
1 <?php
2
3 namespace ProfilePress\Core\Membership\Repositories;
4
5 use ProfilePress\Core\Base;
6 use ProfilePress\Core\Membership\Models\Order\OrderFactory;
7 use ProfilePress\Core\Membership\Models\ModelInterface;
8 use ProfilePress\Core\Membership\Models\Order\OrderEntity;
9 use ProfilePress\Core\Membership\Models\Order\OrderMode;
10 use ProfilePress\Core\Membership\Models\Order\OrderStatus;
11 use ProfilePress\Core\Membership\Models\Order\OrderType;
12 use ProfilePress\Core\Membership\Services\OrderService;
13
14 class OrderRepository extends BaseRepository
15 {
16 protected $table;
17
18 public function __construct()
19 {
20 $this->table = Base::orders_db_table();
21 }
22
23 /**
24 * @param OrderEntity $data
25 *
26 * @return false|int
27 */
28 public function add(ModelInterface $data)
29 {
30 $result = $this->wpdb()->insert(
31 $this->table,
32 [
33 'order_key' => ! empty($data->order_key) ? $data->order_key : OrderService::init()->generate_order_key(),
34 'plan_id' => $data->plan_id,
35 'customer_id' => $data->customer_id,
36 'subscription_id' => $data->subscription_id,
37 'order_type' => $data->order_type,
38 'transaction_id' => $data->transaction_id,
39 'payment_method' => $data->payment_method,
40 'status' => $data->status,
41 'coupon_code' => $data->coupon_code,
42 'subtotal' => $data->subtotal,
43 'tax' => $data->tax,
44 'tax_rate' => $data->tax_rate,
45 'discount' => $data->discount,
46 'total' => $data->total,
47 'billing_address' => $data->billing_address,
48 'billing_city' => $data->billing_city,
49 'billing_state' => $data->billing_state,
50 'billing_country' => $data->billing_country,
51 'billing_postcode' => $data->billing_postcode,
52 'billing_phone' => $data->billing_phone,
53 'mode' => $data->mode,
54 'currency' => $data->currency,
55 'ip_address' => $data->ip_address,
56 'date_created' => empty($data->date_created) ? current_time('mysql', true) : $data->date_created,
57 'date_completed' => $data->date_completed
58 ],
59 [
60 '%s',
61 '%d',
62 '%d',
63 '%d',
64 '%s',
65 '%s',
66 '%s',
67 '%s',
68 '%s',
69 '%s',
70 '%s',
71 '%s',
72 '%s',
73 '%s',
74 '%s',
75 '%s',
76 '%s',
77 '%s',
78 '%s',
79 '%s',
80 '%s',
81 '%s',
82 '%s',
83 '%s',
84 '%s'
85 ]
86 );
87
88 return ! $result ? false : $this->wpdb()->insert_id;
89 }
90
91 /**
92 * @param OrderEntity $data
93 *
94 * @return false|int
95 */
96 public function update(ModelInterface $data)
97 {
98 $result = $this->wpdb()->update(
99 $this->table,
100 [
101 'order_key' => ! empty($data->order_key) ? $data->order_key : OrderService::init()->generate_order_key(),
102 'plan_id' => $data->plan_id,
103 'customer_id' => $data->customer_id,
104 'subscription_id' => $data->subscription_id,
105 'order_type' => $data->order_type,
106 'transaction_id' => $data->transaction_id,
107 'payment_method' => $data->payment_method,
108 'status' => $data->status,
109 'coupon_code' => $data->coupon_code,
110 'subtotal' => $data->subtotal,
111 'tax' => $data->tax,
112 'tax_rate' => $data->tax_rate,
113 'discount' => $data->discount,
114 'total' => $data->total,
115 'billing_address' => $data->billing_address,
116 'billing_city' => $data->billing_city,
117 'billing_state' => $data->billing_state,
118 'billing_country' => $data->billing_country,
119 'billing_postcode' => $data->billing_postcode,
120 'billing_phone' => $data->billing_phone,
121 'mode' => $data->mode,
122 'currency' => $data->currency,
123 'ip_address' => $data->ip_address,
124 'date_completed' => $data->date_completed
125 ],
126 ['id' => $data->id],
127 [
128 '%s',
129 '%d',
130 '%d',
131 '%d',
132 '%s',
133 '%s',
134 '%s',
135 '%s',
136 '%s',
137 '%s',
138 '%s',
139 '%s',
140 '%s',
141 '%s',
142 '%s',
143 '%s',
144 '%s',
145 '%s',
146 '%s',
147 '%s',
148 '%s',
149 '%s',
150 '%s',
151 '%s'
152 ],
153 ['%d']
154 );
155
156 return $result === false ? false : $data->id;
157 }
158
159 /**
160 * @param $id
161 *
162 * @return int|false
163 */
164 public function delete($id)
165 {
166 return $this->wpdb()->delete($this->table, ['id' => $id], ['%d']);
167 }
168
169 public function delete_pending_orders($customer_id, $plan_id)
170 {
171 return $this->wpdb()->delete(
172 $this->table,
173 [
174 'customer_id' => $customer_id,
175 'plan_id' => $plan_id,
176 'status' => OrderStatus::PENDING
177 ],
178 ['%d', '%d', '%s']
179 );
180 }
181
182 /**
183 * @param $id
184 *
185 * @return OrderEntity
186 */
187 public function retrieve($id)
188 {
189 $result = $this->wpdb()->get_row(
190 $this->wpdb()->prepare(
191 "SELECT * FROM $this->table WHERE id = %d",
192 $id
193 ),
194 ARRAY_A
195 );
196
197 if ( ! $result) $result = [];
198
199 return OrderFactory::make($result);
200 }
201
202 /**
203 * @param $order_key
204 *
205 * @return OrderEntity
206 */
207 public function retrieveByOrderKey($order_key)
208 {
209 $result = $this->wpdb()->get_row(
210 $this->wpdb()->prepare(
211 "SELECT * FROM $this->table WHERE order_key = %s",
212 $order_key
213 ),
214 ARRAY_A
215 );
216
217 if ( ! $result) $result = [];
218
219 return OrderFactory::make($result);
220 }
221
222 /**
223 * @param $args
224 * @param $count
225 *
226 * @return int|OrderEntity[]
227 */
228 public function retrieveBy($args = array(), $count = false)
229 {
230 $defaults = [
231 'search' => '',
232 'number' => 10,
233 'offset' => 0,
234 'order_id' => 0,
235 'plan_id' => 0,
236 'customer_id' => 0,
237 'subscription_id' => 0,
238 'transaction_id' => 0,
239 'order_type' => '',
240 'payment_method' => '',
241 'status' => [],
242 'coupon_code' => '',
243 'mode' => '',
244 'currency' => '',
245 'date_created' => '',
246 'date_completed' => '',
247 'start_date' => '',
248 'end_date' => '',
249 'date_compare' => '=',
250 'date_column' => 'date_created',
251 'order' => 'DESC',
252 'orderby' => 'id'
253 ];
254
255 $args = wp_parse_args($args, $defaults);
256
257 $limit = absint($args['number']);
258
259 $offset = $args['offset'];
260 $search = $args['search'];
261
262 $sql = "SELECT * FROM $this->table";
263
264 if ($count === true) {
265 $sql = "SELECT COUNT(id) FROM $this->table";
266 }
267
268 $user_table = $this->wpdb()->users;
269 $customer_table = Base::customers_db_table();
270
271 $allowed_columns = [
272 'id', 'order_key', 'plan_id', 'customer_id', 'subscription_id', 'order_type', 'transaction_id',
273 'payment_method', 'status', 'coupon_code', 'subtotal', 'tax', 'discount', 'total', 'mode',
274 'currency', 'ip_address', 'date_created', 'date_completed'
275 ];
276
277 $date_compare = in_array($args['date_compare'], ['=', '!=', '<', '<=', '>', '>='], true) ? $args['date_compare'] : '=';
278
279 $replacement = [1];
280 $sql .= " WHERE 1=%d"; // fixes Notice: wpdb::prepare was called incorrectly. The query argument of wpdb::prepare() must have a placeholder
281
282 if ($args['order_id'] > 0) {
283 $sql .= " AND id = %d";
284 $replacement[] = (int)$args['order_id'];
285 }
286
287 if ($args['plan_id'] > 0) {
288 $sql .= " AND plan_id = %d";
289 $replacement[] = (int)$args['plan_id'];
290 }
291
292 if ($args['customer_id'] > 0) {
293 $sql .= " AND customer_id = %d";
294 $replacement[] = (int)$args['customer_id'];
295 }
296
297 if ($args['subscription_id'] > 0) {
298 $sql .= " AND subscription_id = %d";
299 $replacement[] = (int)$args['subscription_id'];
300 }
301
302 if ( ! empty($args['transaction_id'])) {
303 $sql .= " AND transaction_id = %s";
304 $replacement[] = sanitize_text_field($args['transaction_id']);
305 }
306
307 $order_type = $args['order_type'];
308 if ( ! empty($order_type) && in_array($order_type, array_keys(OrderType::get_all()))) {
309 $sql .= " AND order_type = %s";
310 $replacement[] = $order_type;
311 }
312
313 if ( ! empty($args['payment_method'])) {
314 $sql .= " AND payment_method = %s";
315 $replacement[] = $args['payment_method'];
316 }
317
318 $args['status'] = ! empty($args['status']) && is_string($args['status']) ? [$args['status']] : $args['status'];
319
320 if (
321 ! empty($args['status']) &&
322 count(array_intersect($args['status'], array_keys(OrderStatus::get_all()))) == count($args['status'])
323 ) {
324 $sql .= " AND status IN (" . implode(',', array_fill(0, count($args['status']), '%s')) . ") ";
325 $replacement = array_merge($replacement, $args['status']);
326 }
327
328 if ( ! empty($args['coupon_code'])) {
329 $sql .= " AND coupon_code = %s";
330 $replacement[] = sanitize_text_field($args['coupon_code']);
331 }
332
333 if ( ! empty($args['currency'])) {
334 $sql .= " AND currency = %s";
335 $replacement[] = sanitize_text_field($args['currency']);
336 }
337
338 if ( ! empty($args['mode']) && in_array($args['mode'], array_keys(OrderMode::get_all()))) {
339 $sql .= " AND mode = %s";
340 $replacement[] = $args['mode'];
341 }
342
343 if ( ! empty($args['date_created'])) {
344 $sql .= " AND date_created $date_compare %s";
345 $replacement[] = gmdate('Y-m-d H:i:s', ppress_strtotime_utc($args['date_created']));
346 }
347
348 if ( ! empty($args['date_completed'])) {
349 $sql .= " AND date_created = %s";
350 $replacement[] = gmdate('Y-m-d H:i:s', ppress_strtotime_utc($args['date_completed']));
351 }
352
353 $start_date = $args['start_date'];
354 $end_date = $args['end_date'];
355 $date_column = in_array($args['date_column'], ['date_created', 'date_completed'], true) ? $args['date_column'] : 'date_created';
356
357 if ( ! empty($start_date)) {
358 $sql .= " AND $date_column >= %s";
359 $replacement[] = gmdate('Y-m-d H:i:s', ppress_strtotime_utc($start_date));
360 }
361
362 if ( ! empty($end_date)) {
363 $sql .= " AND $date_column <= %s";
364 $replacement[] = gmdate('Y-m-d H:i:s', ppress_strtotime_utc($end_date));
365 }
366
367 if ( ! empty($search)) {
368
369 if (is_numeric($search)) {
370 $sql .= " AND (id = %d";
371 $sql .= " OR plan_id = %d";
372 $sql .= " OR customer_id = %d";
373 $sql .= " OR subscription_id = %d)";
374
375 $replacement[] = $search;
376 $replacement[] = $search;
377 $replacement[] = $search;
378 $replacement[] = $search;
379 } elseif (filter_var($search, FILTER_VALIDATE_EMAIL)) {
380 $sql .= " AND customer_id = (SELECT id FROM $customer_table WHERE user_id = (SELECT ID FROM $user_table WHERE user_email = %s))";
381 $replacement[] = $search;
382 } else {
383 $sql .= " AND (order_key LIKE %s";
384 $sql .= " OR transaction_id = %s";
385 $sql .= " OR payment_method = %s";
386 $sql .= " OR coupon_code = %s";
387 $sql .= " OR ip_address = %s)";
388 $sql .= " OR customer_id IN (SELECT id FROM $customer_table WHERE user_id IN (SELECT ID FROM $user_table WHERE user_nicename LIKE %s OR display_name LIKE %s))";
389
390 $search_like = '%' . parent::wpdb()->esc_like(sanitize_text_field($search)) . '%';
391
392 $replacement[] = parent::wpdb()->esc_like(sanitize_text_field($search)) . '%';
393 $replacement[] = $search;
394 $replacement[] = $search;
395 $replacement[] = $search;
396 $replacement[] = $search;
397 $replacement[] = $search_like;
398 $replacement[] = $search_like;
399 }
400 }
401
402 $orderby = in_array($args['orderby'], $allowed_columns, true) ? $args['orderby'] : 'id';
403 $order = strtoupper((string)$args['order']) === 'ASC' ? 'ASC' : 'DESC';
404
405 $sql .= sprintf(" ORDER BY %s %s", $orderby, $order);
406
407 if ($count === false) {
408 if ($limit > 0) {
409 $sql .= " LIMIT %d";
410 $replacement[] = $limit;
411 }
412
413 if ($offset > 0) {
414 $sql .= " OFFSET %d";
415 $replacement[] = $offset;
416 }
417 }
418
419
420 if ($count === true) {
421 return (int)$this->wpdb()->get_var($this->wpdb()->prepare($sql, $replacement));
422 }
423
424 $result = $this->wpdb()->get_results($this->wpdb()->prepare($sql, $replacement), 'ARRAY_A');
425
426 if (is_array($result) && ! empty($result)) {
427 return array_map([OrderFactory::class, 'make'], $result);
428 }
429
430 return [];
431 }
432
433 public function get_customer_total_spend($customer_id)
434 {
435 return $this->wpdb()->get_var(
436 $this->wpdb()->prepare(
437 "SELECT SUM(total) FROM $this->table WHERE customer_id = %d AND status = %s",
438 $customer_id,
439 OrderStatus::COMPLETED
440 )
441 );
442 }
443
444 /**
445 * @param int $order_id
446 * @param string $meta_key
447 * @param string $meta_value
448 * @param bool $unique
449 *
450 * @return int|false Meta ID on success, false on failure.
451 */
452 public function add_meta_data($order_id, $meta_key, $meta_value, $unique = false)
453 {
454 return add_metadata('ppress_order', $order_id, $meta_key, $meta_value, $unique);
455 }
456
457 /**
458 * @param int $order_id
459 * @param string $meta_key
460 * @param string $meta_value
461 * @param string $prev_value
462 *
463 * @return int|bool Meta ID if the key didn't exist, true on successful update, false on failure.
464 */
465 public function update_meta_data($order_id, $meta_key, $meta_value, $prev_value = '')
466 {
467 return update_metadata('ppress_order', $order_id, $meta_key, $meta_value, $prev_value);
468 }
469
470 /**
471 * @param int $order_id
472 * @param string $meta_key
473 * @param string $meta_value
474 * @param bool $delete_all
475 *
476 * @return bool True on success, false on failure.
477 */
478 public function delete_meta_data($order_id, $meta_key, $meta_value = '', $delete_all = false)
479 {
480 return delete_metadata('ppress_order', $order_id, $meta_key, $meta_value, $delete_all);
481 }
482
483 /**
484 * @param $order_id
485 *
486 * @return bool
487 */
488 public function delete_all_meta_data($order_id)
489 {
490 return $this->wpdb()->delete(
491 Base::order_meta_db_table(),
492 array('ppress_order_id' => $order_id)
493 );
494 }
495
496 /**
497 * @param $order_id
498 * @param string $meta_key
499 * @param bool $single
500 *
501 * @return array|false|mixed
502 */
503 public function get_meta_data($order_id, $meta_key = '', $single = true)
504 {
505 return get_metadata('ppress_order', $order_id, $meta_key, $single);
506 }
507
508 public function get_count_by_status($status)
509 {
510 return $this->wpdb()->get_var(
511 $this->wpdb()->prepare(
512 "SELECT COUNT(id) FROM $this->table WHERE status = %s",
513 $status
514 )
515 );
516 }
517 }