· 6 years ago · Sep 08, 2019, 08:34 AM
1<?php
2/*
3 * Woocommerce Rest API Order Validation
4 *
5 * @package WooCommerce/REST API
6 */
7
8defined( 'ABSPATH' ) || exit;
9
10class Validation_For_Woo_Rest_Api
11{
12
13 /*
14 * sets constant for required billing information
15 */
16 protected const billing = [
17 'first_name',
18 'last_name',
19 'address_1',
20 'city',
21 'state',
22 'postcode',
23 'country',
24 'email',
25 'phone',
26 ];
27
28
29 /*
30 * sets constant for required shipping information
31 */
32 protected const shipping = [
33 'first_name',
34 'last_name',
35 'address_1',
36 'city',
37 'state',
38 'postcode',
39 'country',
40 ];
41
42
43 /*
44 * sets empty constant for order meta so it can be filtered
45 */
46 protected const meta_data = [];
47
48
49 /*
50 * String | list of keys that were not present but required
51 */
52 protected $missing_required_key;
53
54
55 /*
56 * Array | Users who will be validated when using the WC REST API
57 */
58 protected $validation_users;
59
60
61 /**
62 * Validation_For_Woo_Rest_Api constructor.
63 */
64 public function __construct()
65 {
66 $this->validation_users = get_field('dropship_users', 'options');
67
68 add_action( 'rest_api_init', [$this, 'run_validation'], 10);
69 }
70
71 /**
72 * Matches user id to list of users if true adds filter
73 */
74 public function run_validation()
75 {
76 $this->current_user = wp_get_current_user()->ID;
77
78 if(in_array(wp_get_current_user()->ID, $this->validation_users)){
79
80 add_filter( 'woocommerce_rest_pre_insert_shop_order_object', [$this, 'validate_order_creation_data'], 10, 3 );
81 }
82 }
83
84 /**
85 * function to validate
86 *
87 * @param $order
88 * @param $request
89 * @param $creating
90 * @return WP_Error
91 */
92 public function validate_order_creation_data($order, $request, $creating)
93 {
94 do_action('pwdc_additional_order_processing', $order, $request, $creating);
95
96 $fields_to_validate = [
97 'billing' => $request['billing'],
98 'shipping' => $request['shipping'],
99 'meta_data' => $request['meta_data']
100 ];
101
102 foreach ($fields_to_validate as $group_key => $group_value) {
103
104 $validate = $this->validate_data($group_value, $group_key);
105
106 if(!$validate){
107 return new WP_Error( 'required_api_data', "{$group_key} {$this->missing_required_key} is/are required", array( 'status' => 404 ) );
108 }
109 }
110
111 return $order;
112 }
113
114 /**
115 * Does the actual validation
116 *
117 * @param $array
118 * @param $field_group
119 * @return bool
120 */
121 protected function validate_data($array, $field_group)
122 {
123
124 if ($field_group === 'billing'){
125 $required = self::billing;
126 }elseif ($field_group === 'shipping'){
127 $required = self::shipping;
128 }elseif ($field_group === 'meta_data'){
129 $required = self::meta_data;
130 }
131
132 $required = apply_filters('pwdc_set_required_fields', $required, $field_group);
133
134 $key_count = [];
135 foreach ($array as $key => $data) {
136
137 if (empty($required)){
138 continue;
139 }
140
141 if(is_array($data)){
142 if(empty($data['value'])){
143 if(in_array($data['key'], $required)){
144 $this->missing_required_key = $data['key'];
145 return false;
146 }
147
148 }
149 if (in_array($data['key'], $required)){
150 $key_count[] = $data['key'];
151 }
152 }else{
153 if(empty($data)){
154 if(in_array($key, $required)){
155 $this->missing_required_key = $key;
156 return false;
157 }
158 }
159 if (in_array($key, $required)){
160 $key_count[] = $key;
161 }
162 }
163
164
165 }
166
167 if(count($key_count) !== count($required)){
168 $missing_keys = array_diff($required,$key_count);
169 $missing_keys = implode(', ', $missing_keys);
170 $this->missing_required_key = $missing_keys;
171 return false;
172 }
173
174 return true;
175 }
176}