| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- <?php
- /**
- * REST API Taxes controller
- *
- * Handles requests to the /taxes endpoint.
- *
- * @package WooCommerce\RestApi
- * @since 2.6.0
- */
- defined( 'ABSPATH' ) || exit;
- /**
- * REST API Taxes controller class.
- *
- * @package WooCommerce\RestApi
- * @extends WC_REST_Taxes_V2_Controller
- */
- class WC_REST_Taxes_Controller extends WC_REST_Taxes_V2_Controller {
- /**
- * Endpoint namespace.
- *
- * @var string
- */
- protected $namespace = 'wc/v3';
- /**
- * Add tax rate locales to the response array.
- *
- * @param array $data Response data.
- * @param stdClass $tax Tax object.
- *
- * @return array
- */
- protected function add_tax_rate_locales( $data, $tax ) {
- global $wpdb;
- $data = parent::add_tax_rate_locales( $data, $tax );
- $data['postcodes'] = array();
- $data['cities'] = array();
- // Get locales from a tax rate.
- $locales = $wpdb->get_results(
- $wpdb->prepare(
- "
- SELECT location_code, location_type
- FROM {$wpdb->prefix}woocommerce_tax_rate_locations
- WHERE tax_rate_id = %d
- ",
- $tax->tax_rate_id
- )
- );
- if ( ! is_wp_error( $tax ) && ! is_null( $tax ) ) {
- foreach ( $locales as $locale ) {
- if ( 'postcode' === $locale->location_type ) {
- $data['postcodes'][] = $locale->location_code;
- } elseif ( 'city' === $locale->location_type ) {
- $data['cities'][] = $locale->location_code;
- }
- }
- }
- return $data;
- }
- /**
- * Get the taxes schema, conforming to JSON Schema.
- *
- * @return array
- */
- public function get_item_schema() {
- $schema = parent::get_item_schema();
- $schema['properties']['postcodes'] = array(
- 'description' => __( 'List of postcodes / ZIPs. Introduced in WooCommerce 5.3.', 'woocommerce' ),
- 'type' => 'array',
- 'items' => array(
- 'type' => 'string',
- ),
- 'context' => array( 'view', 'edit' ),
- );
- $schema['properties']['cities'] = array(
- 'description' => __( 'List of city names. Introduced in WooCommerce 5.3.', 'woocommerce' ),
- 'type' => 'array',
- 'items' => array(
- 'type' => 'string',
- ),
- 'context' => array( 'view', 'edit' ),
- );
- $schema['properties']['postcode']['description'] =
- __( "Postcode/ZIP, it doesn't support multiple values. Deprecated as of WooCommerce 5.3, 'postcodes' should be used instead.", 'woocommerce' );
- $schema['properties']['city']['description'] =
- __( "City name, it doesn't support multiple values. Deprecated as of WooCommerce 5.3, 'cities' should be used instead.", 'woocommerce' );
- return $schema;
- }
- /**
- * Create a single tax.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|WP_REST_Response The response, or an error.
- */
- public function create_item( $request ) {
- $this->adjust_cities_and_postcodes( $request );
- return parent::create_item( $request );
- }
- /**
- * Update a single tax.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|WP_REST_Response The response, or an error.
- */
- public function update_item( $request ) {
- $this->adjust_cities_and_postcodes( $request );
- return parent::update_item( $request );
- }
- /**
- * Convert array "cities" and "postcodes" parameters
- * into semicolon-separated strings "city" and "postcode".
- *
- * @param WP_REST_Request $request The request to adjust.
- */
- private function adjust_cities_and_postcodes( &$request ) {
- if ( isset( $request['cities'] ) ) {
- $request['city'] = join( ';', $request['cities'] );
- }
- if ( isset( $request['postcodes'] ) ) {
- $request['postcode'] = join( ';', $request['postcodes'] );
- }
- }
- }
|