query_vars['adscaleCustomers'] = sanitize_key( wp_unslash( $_GET['adscaleCustomers'] ) ); } // make sure endpoint request if ( ! isset( $wp->query_vars['adscaleCustomers'] ) ) { return; } try { ob_start(); // Error handler self::setErrorHandler(); Helper::nocache_headers(); // Check Request (Guards) self::checkRequest(); ob_end_clean(); // Handle Request self::handleRequest(); // Default error Helper::send_response_formatted_error( self::makeErrorBody() ); } catch ( PluginApiException $ex ) { Helper::send_response_formatted_error( self::makeErrorBody( $ex->getApiErrorCode(), $ex->getMessage(), $ex->getApiErrorDetails() ) ); } catch ( \Exception $ex ) { Helper::send_response_formatted_error( self::makeErrorBody( $ex->getCode(), $ex->getMessage() ) ); } } public static function checkRequest() { parent::checkRequest(); self::initParams(); // last id from the previous page if ( ! self::checkParamAfter() ) { Helper::send_response_formatted_error( self::makeErrorBody('I001','Invalid argument value', 'after' ) ); } // Number of items per page, min if ( ! self::checkParamLimitForMin() ) { Helper::send_response_formatted_error( self::makeErrorBody('I001','Invalid argument value', 'limit' ) ); } // Number of items per page, max if ( ! self::checkParamLimitForMax() ) { Helper::send_response_formatted_error( self::makeErrorBody('I001','Invalid argument value', 'limit' ) ); } } public static function initParams() { self::$requestParams['after'] = Helper::get_post_body_data_value('after', 'absint'); self::$requestParams['limit'] = Helper::get_post_body_data_value('limit', 'absint'); self::$requestParams['ids'] = Helper::get_post_body_data_value( 'ids' ); // Set default params if not exists if ( null === self::$requestParams['after'] ) { self::$requestParams['after'] = 0; } if ( null === self::$requestParams['limit'] ) { self::$requestParams['limit'] = self::$defaultLimit; } if ( null === self::$requestParams['ids'] ) { self::$requestParams['ids'] = self::$defaultIds; } // Params Type Hinting self::$requestParams['after'] = (int) self::$requestParams['after']; self::$requestParams['limit'] = (int) self::$requestParams['limit']; self::$requestParams['ids'] = self::resolveIds( self::$requestParams['ids'] ); } /** * Last id from the previous page, check if is valid * * @return bool is valid */ public static function checkParamAfter() { return self::$requestParams['after'] >= 0; } /** * Check min Number of items per page * * @return bool is valid */ public static function checkParamLimitForMin() { return self::$requestParams['limit'] > 0; } /** * Check max Number of items per page * * @return bool is valid */ public static function checkParamLimitForMax() { return self::$requestParams['limit'] <= self::$maxLimit; } /** * Resolve Ids * * @param mixed $ids * * @return array */ private static function resolveIds( $ids ) { if ( is_float( $ids ) ) { Helper::send_response_formatted_error( self::makeErrorBody('I001','Invalid argument value', 'ids' ) ); } if ( is_numeric( $ids ) ) { $ids = [ (int) $ids ]; } if ( ! is_array( $ids ) ) { Helper::send_response_formatted_error( self::makeErrorBody('I001','Invalid argument value', 'ids' ) ); } $filteredIds = []; foreach ( $ids as $id ) { if ( ! is_numeric( $id ) || is_float( $id ) ) { Helper::send_response_formatted_error( self::makeErrorBody('I001','Invalid argument value', 'ids' ) ); } $filteredIds[] = (int) $id; } return $filteredIds; } /** * Handle API request * */ public static function handleRequest() { $customers_data = []; $args = [ 'role' => 'customer', 'number' => - 1, 'orderby' => 'ID', 'order' => 'ASC', ]; if ( self::$requestParams['limit'] ) { $args['number'] = self::$requestParams['limit']; } add_filter( 'pre_user_query', [ self::class, 'queryFilter' ], 777, 1 ); $users_objs = get_users( $args ); remove_filter( 'pre_user_query', [ self::class, 'queryFilter' ], 777 ); if ( ! is_array( $users_objs ) ) { Helper::send_response_formatted_error( self::makeErrorBody('S000','Unknown error', 'Customers could not be found' ) ); } foreach ( $users_objs as $user_obj ) { /* @var \WP_User $user_obj WP_User object */ $customer = new \WC_Customer( $user_obj->ID ); if ( $customer->get_id() !== $user_obj->ID ) { continue; } $customers_data[] = self::getCustomerData( $customer ); } Helper::send_response_formatted_success( [ 'customers' => $customers_data, ] ); } /** * Filters all query clauses at once. * * @param \WP_User_Query $query The WP_User_Query instance (passed by reference). */ public static function queryFilter( $query ) { global $wpdb; $query->set('orderby', 'ID'); $query->set('order', 'ASC'); if ( self::$requestParams['ids'] ) { $post__in = implode( ',', array_map( 'absint', self::$requestParams['ids'] ) ); $query->query_where = str_replace( 'WHERE 1=1', "WHERE 1=1 AND {$wpdb->users}.ID IN ({$post__in})", $query->query_where ); } if ( self::$requestParams['after'] ) { $after = (int) self::$requestParams['after']; $query->query_where = str_replace( 'WHERE 1=1', "WHERE 1=1 AND {$wpdb->users}.ID > {$after}", $query->query_where ); } } /** * Get Customer data * * @param \WC_Customer $customer * * @return array */ public static function getCustomerData( $customer ) { try { if ( ! $customer instanceof \WC_Customer ) { throw new \Exception( 'Not WC_Customer object' ); } $billing = $customer->get_billing(); $phone = ! empty( $billing['phone'] ) ? $billing['phone'] : null; $address_data_billing = self::getAddressData( $billing ); $shipping = $customer->get_shipping(); $address_data_shipping = self::getAddressData( $shipping ); $addresses_data = []; $addresses_data[] = $address_data_billing; if ( array_filter( $address_data_shipping ) ) { $addresses_data[] = $address_data_shipping; } return [ 'id' => $customer->get_id(), 'type' => 'Customer', 'last_visit' => self::getLastVisit( $customer ), 'subscription' => 'Unknown', 'first_name' => $customer->get_first_name(), 'last_name' => $customer->get_last_name(), 'email' => $customer->get_email(), 'phone' => $phone, 'birthdate' => null, 'gender' => null, 'title' => null, 'addresses' => $addresses_data, ]; } catch ( \Exception $ex ) { Helper::send_response_formatted_error( self::makeErrorBody('S000','Unknown error', $ex->getMessage() ) ); } } public static function getLastVisit( $customer ) { $last_active = $customer->get_meta( 'wc_last_active', true ); if ( ! $last_active ) { $last_active = $customer->get_date_created()->getTimestamp(); } return $last_active ? gmdate( 'Y-m-d', $last_active ) : null; } /** * Get customer address * * @param array $address_data * * @return array */ public static function getAddressData( $address_data ) { $country = ! empty( $address_data['country'] ) ? $address_data['country'] : ''; $state = $country && ! empty( $address_data['state'] ) ? Helper::get_full_state_name( $country, $address_data['state'] ) : ''; return [ 'country' => $country, 'state' => $state, 'city' => ! empty( $address_data['city'] ) ? $address_data['city'] : '', 'address' => ! empty( $address_data['address_1'] ) ? $address_data['address_1'] : '', 'address2' => ! empty( $address_data['address_2'] ) ? $address_data['address_2'] : '', 'zip' => ! empty( $address_data['postcode'] ) ? $address_data['postcode'] : '', ]; } }