PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 3.0.3
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v3.0.3
4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 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 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / app / src / WordPress / Users / UsersService.php
surecart / app / src / WordPress / Users Last commit date
CustomerLinkService.php 2 years ago UsersService.php 2 years ago UsersServiceProvider.php 3 years ago
UsersService.php
249 lines
1 <?php
2
3 namespace SureCart\WordPress\Users;
4
5 use SureCart\Models\User;
6
7 /**
8 * WordPress Users service.
9 */
10 class UsersService {
11 /**
12 * Register rest related queries.
13 *
14 * @return void
15 */
16 public function bootstrap() {
17 add_filter( 'rest_user_query', array( $this, 'userMetaQuery' ), 10, 2 );
18 add_filter( 'rest_user_query', array( $this, 'isCustomerQuery' ), 10, 2 );
19 add_filter( 'rest_user_collection_params', array( $this, 'collectionParams' ) );
20 add_filter( 'show_admin_bar', array( $this, 'disableAdminBar' ), 10, 1 );
21 add_action( 'profile_update', array( $this, 'syncUserProfile' ), 10, 3 );
22 add_action( 'surecart/customer_updated', array( $this, 'syncCustomerProfile' ) );
23 $this->registerMeta();
24 }
25
26 /**
27 * Fires immediately after an existing customer is updated.
28 *
29 * @param object $customer Customer Data.
30 */
31 public function syncCustomerProfile( $customer ) {
32 $wp_user = \SureCart\Models\User::findByCustomerId( $customer->id );
33
34 if ( ! empty( $wp_user->ID ) ) {
35 // prevent potential infinite loop of catching a webhook and updating again.
36 remove_action( 'profile_update', array( $this, 'syncUserProfile' ), 10 );
37
38 // update user.
39 wp_update_user(
40 array(
41 'ID' => $wp_user->ID,
42 'user_email' => ! empty( $customer->email ) ? $customer->email : $wp_user->user_email,
43 'first_name' => ! empty( $customer->first_name ) ? $customer->first_name : $wp_user->first_name,
44 'last_name' => ! empty( $customer->last_name ) ? $customer->last_name : $wp_user->last_name,
45 'phone' => ! empty( $customer->phone ) ? $customer->phone : $wp_user->phone,
46 )
47 );
48
49 // re-add profile_update in case it is done in the same request somewhere.
50 add_action( 'profile_update', array( $this, 'syncUserProfile' ), 10 );
51 }
52
53 return $wp_user;
54 }
55
56 /**
57 * Fires immediately after an existing user is updated.
58 *
59 * @param int $user_id User ID.
60 * @param WP_User $old_user_data Object containing user's data prior to update.
61 * @param array $userdata The raw array of data passed to wp_insert_user().
62 */
63 public function syncUserProfile( $user_id, $old_user_data, $userdata ) {
64 $customer_ids = \SureCart\Models\User::find( $user_id )->customerIds();
65 if ( is_wp_error( $customer_ids ) || empty( $customer_ids ) ) {
66 return;
67 }
68
69 foreach ( $customer_ids as $id ) {
70 \SureCart\Models\Customer::update(
71 array_filter(
72 array(
73 'id' => $id,
74 'first_name' => $userdata['first_name'],
75 'last_name' => $userdata['last_name'],
76 'email' => $userdata['user_email'],
77 'phone' => $userdata['phone'] ?? null,
78 ),
79 function ( $x ) {
80 return null !== $x;
81 }
82 )
83 );
84 }
85 }
86
87 /**
88 * Prevent any user who cannot 'edit_posts' (subscribers, customers etc) from seeing the admin bar.
89 *
90 * @param bool $show_admin_bar If should display admin bar.
91 * @return bool
92 */
93 public function disableAdminBar( $show_admin_bar ) {
94 if ( apply_filters( 'surecart_disable_admin_bar', true ) && ! ( current_user_can( 'edit_posts' ) || current_user_can( 'manage_sc_shop_settings' ) ) ) {
95 return false;
96 }
97
98 return $show_admin_bar;
99 }
100
101 /**
102 * Add our query parameters to the rest api.
103 *
104 * @param array $query_params The query parameters.
105 * @return array
106 */
107 public function collectionParams( $query_params ) {
108 $query_params['is_customer'] = array(
109 'description' => __( 'Limit result set to users with a customer.', 'surecart' ),
110 'type' => 'boolean',
111 );
112 $query_params['sc_customer_ids'] = array(
113 'description' => __( 'Limit result set to users with specific customer ids.', 'surecart' ),
114 'type' => 'array',
115 'items' => array(
116 'type' => 'string',
117 ),
118 );
119 return $query_params;
120 }
121
122 /**
123 * Register customer id meta.
124 *
125 * @return void
126 */
127 public function registerMeta() {
128 register_meta(
129 'user',
130 'sc_customer_ids',
131 array(
132 'type' => 'object',
133 'show_in_rest' => array(
134 'schema' => array(
135 'type' => 'object',
136 'properties' => array(
137 'live' => array(
138 'type' => 'string',
139 ),
140 'test' => array(
141 'type' => 'string',
142 ),
143 ),
144 ),
145 ),
146 'single' => true,
147 'sanitize_callback' => function ( $value ) {
148 return array_filter( array_map( 'sanitize_text_field', (array) $value ) );
149 },
150 'auth_callback' => function () {
151 return current_user_can( 'edit_sc_customers' );
152 },
153 )
154 );
155
156 register_meta(
157 'user',
158 'default_password_nag',
159 array(
160 'type' => 'boolean',
161 'show_in_rest' => true,
162 'single' => true,
163 )
164 );
165 }
166
167 /**
168 * Allow querying by customer id in the REST API
169 *
170 * @param array $args Query args.
171 * @param \WP_REST_Request $request Request.
172 * @return array
173 */
174 public function userMetaQuery( $args, $request ) {
175 $key = User::getCustomerMetaKey();
176 $customer_ids = $request->get_param( 'sc_customer_ids' );
177
178 // we're only concerned about our param.
179 if ( empty( $customer_ids ) ) {
180 return $args;
181 }
182
183 // lets double-check our permissions in case other permissions fail.
184 if ( ! current_user_can( 'edit_sc_customers' ) ) {
185 return $args;
186 }
187
188 // set the meta query.
189 $args['meta_query'] = array(
190 'relation' => 'OR',
191 );
192
193 foreach ( $customer_ids as $customer_id ) {
194 $args['meta_query'][] = array(
195 'key' => $key,
196 'value' => $customer_id,
197 'compare' => 'LIKE',
198 );
199 }
200
201 return $args;
202 }
203
204 /**
205 * Query only users who are customers or not.
206 *
207 * @param array $args Query args.
208 * @param \WP_REST_Request $request Request.
209 * @return array
210 */
211 public function isCustomerQuery( $args, $request ) {
212 $is_customer = $request->get_param( 'is_customer' );
213 if ( null === $is_customer ) {
214 return $args;
215 }
216
217 if ( $is_customer ) {
218 // exists and not empty.
219 $args['meta_query'] = array(
220 'relation' => 'AND',
221 array(
222 'key' => User::getCustomerMetaKey(),
223 'compare' => 'EXISTS',
224 ),
225 array(
226 'key' => User::getCustomerMetaKey(),
227 'value' => '',
228 'compare' => '!=',
229 ),
230 );
231 } else {
232 $args['meta_query'] = array(
233 'relation' => 'OR',
234 array(
235 'key' => User::getCustomerMetaKey(),
236 'compare' => 'NOT EXISTS',
237 ),
238 array(
239 'key' => User::getCustomerMetaKey(),
240 'value' => '',
241 'compare' => '=',
242 ),
243 );
244 }
245
246 return $args;
247 }
248 }
249