'GET', 'callback' => [__CLASS__, 'get_addresses'], 'permission_callback' => [__CLASS__, 'check_customer_permission'], ], [ 'methods' => 'POST', 'callback' => [__CLASS__, 'create_address'], 'permission_callback' => [__CLASS__, 'check_customer_permission'], ], ]); // Update address register_rest_route($namespace, '/account/addresses/(?P\d+)', [ 'methods' => 'PUT', 'callback' => [__CLASS__, 'update_address'], 'permission_callback' => [__CLASS__, 'check_customer_permission'], ]); // Delete address register_rest_route($namespace, '/account/addresses/(?P\d+)', [ 'methods' => 'DELETE', 'callback' => [__CLASS__, 'delete_address'], 'permission_callback' => [__CLASS__, 'check_customer_permission'], ]); // Set default address register_rest_route($namespace, '/account/addresses/(?P\d+)/set-default', [ 'methods' => 'POST', 'callback' => [__CLASS__, 'set_default_address'], 'permission_callback' => [__CLASS__, 'check_customer_permission'], ]); } /** * Check if user is logged in */ public static function check_customer_permission() { return is_user_logged_in(); } /** * Get all addresses for current user */ public static function get_addresses(WP_REST_Request $request) { $user_id = get_current_user_id(); $addresses = get_user_meta($user_id, 'woonoow_addresses', true); if (!$addresses || !is_array($addresses)) { $addresses = []; } $addresses = array_values($addresses); return new WP_REST_Response($addresses, 200); } /** * Create new address */ public static function create_address(WP_REST_Request $request) { $user_id = get_current_user_id(); $addresses = get_user_meta($user_id, 'woonoow_addresses', true); if (!is_array($addresses)) { $addresses = []; } // Generate new ID $new_id = empty($addresses) ? 1 : max(array_column($addresses, 'id')) + 1; // Prepare address data $address = [ 'id' => $new_id, 'label' => sanitize_text_field($request->get_param('label')), 'type' => sanitize_text_field($request->get_param('type')), // 'billing', 'shipping', or 'both' 'first_name' => sanitize_text_field($request->get_param('first_name')), 'last_name' => sanitize_text_field($request->get_param('last_name')), 'company' => sanitize_text_field($request->get_param('company')), 'address_1' => sanitize_text_field($request->get_param('address_1')), 'address_2' => sanitize_text_field($request->get_param('address_2')), 'city' => sanitize_text_field($request->get_param('city')), 'state' => sanitize_text_field($request->get_param('state')), 'postcode' => sanitize_text_field($request->get_param('postcode')), 'country' => sanitize_text_field($request->get_param('country')), 'email' => sanitize_email($request->get_param('email')), 'phone' => sanitize_text_field($request->get_param('phone')), 'is_default' => (bool) $request->get_param('is_default'), ]; // If this is set as default, unset other defaults of the same type if ($address['is_default']) { foreach ($addresses as &$addr) { if ($addr['type'] === $address['type'] || $addr['type'] === 'both' || $address['type'] === 'both') { $addr['is_default'] = false; } } } $addresses[] = $address; update_user_meta($user_id, 'woonoow_addresses', $addresses); return new WP_REST_Response($address, 201); } /** * Update existing address */ public static function update_address(WP_REST_Request $request) { $user_id = get_current_user_id(); $address_id = (int) $request->get_param('id'); $addresses = get_user_meta($user_id, 'woonoow_addresses', true); if (!is_array($addresses)) { return new WP_Error('no_addresses', 'No addresses found', ['status' => 404]); } $found = false; foreach ($addresses as &$addr) { if ($addr['id'] === $address_id) { $found = true; // Update fields $addr['label'] = sanitize_text_field($request->get_param('label')); $addr['type'] = sanitize_text_field($request->get_param('type')); $addr['first_name'] = sanitize_text_field($request->get_param('first_name')); $addr['last_name'] = sanitize_text_field($request->get_param('last_name')); $addr['company'] = sanitize_text_field($request->get_param('company')); $addr['address_1'] = sanitize_text_field($request->get_param('address_1')); $addr['address_2'] = sanitize_text_field($request->get_param('address_2')); $addr['city'] = sanitize_text_field($request->get_param('city')); $addr['state'] = sanitize_text_field($request->get_param('state')); $addr['postcode'] = sanitize_text_field($request->get_param('postcode')); $addr['country'] = sanitize_text_field($request->get_param('country')); $addr['email'] = sanitize_email($request->get_param('email')); $addr['phone'] = sanitize_text_field($request->get_param('phone')); $addr['is_default'] = (bool) $request->get_param('is_default'); // If this is set as default, unset other defaults of the same type if ($addr['is_default']) { foreach ($addresses as &$other_addr) { if ($other_addr['id'] !== $address_id) { if ($other_addr['type'] === $addr['type'] || $other_addr['type'] === 'both' || $addr['type'] === 'both') { $other_addr['is_default'] = false; } } } } break; } } if (!$found) { return new WP_Error('address_not_found', 'Address not found', ['status' => 404]); } update_user_meta($user_id, 'woonoow_addresses', $addresses); return new WP_REST_Response(['success' => true], 200); } /** * Delete address */ public static function delete_address(WP_REST_Request $request) { $user_id = get_current_user_id(); $address_id = (int) $request->get_param('id'); $addresses = get_user_meta($user_id, 'woonoow_addresses', true); if (!is_array($addresses)) { return new WP_Error('no_addresses', 'No addresses found', ['status' => 404]); } $addresses = array_filter($addresses, function($addr) use ($address_id) { return $addr['id'] !== $address_id; }); // Re-index array $addresses = array_values($addresses); update_user_meta($user_id, 'woonoow_addresses', $addresses); return new WP_REST_Response(['success' => true], 200); } /** * Set address as default */ public static function set_default_address(WP_REST_Request $request) { $user_id = get_current_user_id(); $address_id = (int) $request->get_param('id'); $addresses = get_user_meta($user_id, 'woonoow_addresses', true); if (!is_array($addresses)) { return new WP_Error('no_addresses', 'No addresses found', ['status' => 404]); } $found = false; $address_type = null; foreach ($addresses as &$addr) { if ($addr['id'] === $address_id) { $found = true; $address_type = $addr['type']; $addr['is_default'] = true; } else { // Unset default for addresses of the same type if ($address_type && ($addr['type'] === $address_type || $addr['type'] === 'both' || $address_type === 'both')) { $addr['is_default'] = false; } } } if (!$found) { return new WP_Error('address_not_found', 'Address not found', ['status' => 404]); } update_user_meta($user_id, 'woonoow_addresses', $addresses); return new WP_REST_Response(['success' => true], 200); } }