Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-content
/
plugins
/
woocommerce
/
includes
/
legacy
/
api
/
v2
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php if (!defined('ABSPATH')) { exit; } class WC_API_Coupons extends WC_API_Resource { protected $base = '/coupons'; public function register_routes($routes) { $routes[$this->base] = array(array(array($this, 'get_coupons'), WC_API_Server::READABLE), array(array($this, 'create_coupon'), WC_API_Server::CREATABLE | WC_API_Server::ACCEPT_DATA)); $routes[$this->base . '/count'] = array(array(array($this, 'get_coupons_count'), WC_API_Server::READABLE)); $routes[$this->base . '/(?P<id>\\d+)'] = array(array(array($this, 'get_coupon'), WC_API_Server::READABLE), array(array($this, 'edit_coupon'), WC_API_SERVER::EDITABLE | WC_API_SERVER::ACCEPT_DATA), array(array($this, 'delete_coupon'), WC_API_SERVER::DELETABLE)); $routes[$this->base . '/code/(?P<code>\\w[\\w\\s\\-]*)'] = array(array(array($this, 'get_coupon_by_code'), WC_API_Server::READABLE)); $routes[$this->base . '/bulk'] = array(array(array($this, 'bulk'), WC_API_Server::EDITABLE | WC_API_Server::ACCEPT_DATA)); return $routes; } public function get_coupons($fields = null, $filter = array(), $page = 1) { $filter['page'] = $page; $query = $this->query_coupons($filter); $coupons = array(); foreach ($query->posts as $coupon_id) { if (!$this->is_readable($coupon_id)) { continue; } $coupons[] = current($this->get_coupon($coupon_id, $fields)); } $this->server->add_pagination_headers($query); return array('coupons' => $coupons); } public function get_coupon($id, $fields = null) { try { $id = $this->validate_request($id, 'shop_coupon', 'read'); if (is_wp_error($id)) { return $id; } $coupon = new WC_Coupon($id); if (0 === $coupon->get_id()) { throw new WC_API_Exception('woocommerce_api_invalid_coupon_id', __('Invalid coupon ID', 'woocommerce'), 404); } $coupon_data = array('id' => $coupon->get_id(), 'code' => $coupon->get_code(), 'type' => $coupon->get_discount_type(), 'created_at' => $this->server->format_datetime($coupon->get_date_created() ? $coupon->get_date_created()->getTimestamp() : 0), 'updated_at' => $this->server->format_datetime($coupon->get_date_modified() ? $coupon->get_date_modified()->getTimestamp() : 0), 'amount' => wc_format_decimal($coupon->get_amount(), 2), 'individual_use' => $coupon->get_individual_use(), 'product_ids' => array_map('absint', (array) $coupon->get_product_ids()), 'exclude_product_ids' => array_map('absint', (array) $coupon->get_excluded_product_ids()), 'usage_limit' => $coupon->get_usage_limit() ? $coupon->get_usage_limit() : null, 'usage_limit_per_user' => $coupon->get_usage_limit_per_user() ? $coupon->get_usage_limit_per_user() : null, 'limit_usage_to_x_items' => (int) $coupon->get_limit_usage_to_x_items(), 'usage_count' => (int) $coupon->get_usage_count(), 'expiry_date' => $coupon->get_date_expires() ? $this->server->format_datetime($coupon->get_date_expires()->getTimestamp()) : null, 'enable_free_shipping' => $coupon->get_free_shipping(), 'product_category_ids' => array_map('absint', (array) $coupon->get_product_categories()), 'exclude_product_category_ids' => array_map('absint', (array) $coupon->get_excluded_product_categories()), 'exclude_sale_items' => $coupon->get_exclude_sale_items(), 'minimum_amount' => wc_format_decimal($coupon->get_minimum_amount(), 2), 'maximum_amount' => wc_format_decimal($coupon->get_maximum_amount(), 2), 'customer_emails' => $coupon->get_email_restrictions(), 'description' => $coupon->get_description()); return array('coupon' => apply_filters('woocommerce_api_coupon_response', $coupon_data, $coupon, $fields, $this->server)); } catch (WC_API_Exception $e) { return new WP_Error($e->getErrorCode(), $e->getMessage(), array('status' => $e->getCode())); } } public function get_coupons_count($filter = array()) { try { if (!current_user_can('read_private_shop_coupons')) { throw new WC_API_Exception('woocommerce_api_user_cannot_read_coupons_count', __('You do not have permission to read the coupons count', 'woocommerce'), 401); } $query = $this->query_coupons($filter); return array('count' => (int) $query->found_posts); } catch (WC_API_Exception $e) { return new WP_Error($e->getErrorCode(), $e->getMessage(), array('status' => $e->getCode())); } } public function get_coupon_by_code($code, $fields = null) { global $wpdb; try { $id = $wpdb->get_var($wpdb->prepare("SELECT id FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'shop_coupon' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 1;", $code)); if (is_null($id)) { throw new WC_API_Exception('woocommerce_api_invalid_coupon_code', __('Invalid coupon code', 'woocommerce'), 404); } return $this->get_coupon($id, $fields); } catch (WC_API_Exception $e) { return new WP_Error($e->getErrorCode(), $e->getMessage(), array('status' => $e->getCode())); } } public function create_coupon($data) { global $wpdb; try { if (!isset($data['coupon'])) { throw new WC_API_Exception('woocommerce_api_missing_coupon_data', sprintf(__('No %1$s data specified to create %1$s', 'woocommerce'), 'coupon'), 400); } $data = $data['coupon']; if (!current_user_can('publish_shop_coupons')) { throw new WC_API_Exception('woocommerce_api_user_cannot_create_coupon', __('You do not have permission to create coupons', 'woocommerce'), 401); } $data = apply_filters('woocommerce_api_create_coupon_data', $data, $this); if (!isset($data['code'])) { throw new WC_API_Exception('woocommerce_api_missing_coupon_code', sprintf(__('Missing parameter %s', 'woocommerce'), 'code'), 400); } $coupon_code = wc_format_coupon_code($data['code']); $id_from_code = wc_get_coupon_id_by_code($coupon_code); if ($id_from_code) { throw new WC_API_Exception('woocommerce_api_coupon_code_already_exists', __('The coupon code already exists', 'woocommerce'), 400); } $defaults = array('type' => 'fixed_cart', 'amount' => 0, 'individual_use' => false, 'product_ids' => array(), 'exclude_product_ids' => array(), 'usage_limit' => '', 'usage_limit_per_user' => '', 'limit_usage_to_x_items' => '', 'usage_count' => '', 'expiry_date' => '', 'enable_free_shipping' => false, 'product_category_ids' => array(), 'exclude_product_category_ids' => array(), 'exclude_sale_items' => false, 'minimum_amount' => '', 'maximum_amount' => '', 'customer_emails' => array(), 'description' => ''); $coupon_data = wp_parse_args($data, $defaults); if (!in_array(wc_clean($coupon_data['type']), array_keys(wc_get_coupon_types()))) { throw new WC_API_Exception('woocommerce_api_invalid_coupon_type', sprintf(__('Invalid coupon type - the coupon type must be any of these: %s', 'woocommerce'), implode(', ', array_keys(wc_get_coupon_types()))), 400); } $new_coupon = array('post_title' => $coupon_code, 'post_content' => '', 'post_status' => 'publish', 'post_author' => get_current_user_id(), 'post_type' => 'shop_coupon', 'post_excerpt' => $coupon_data['description']); $id = wp_insert_post($new_coupon, true); if (is_wp_error($id)) { throw new WC_API_Exception('woocommerce_api_cannot_create_coupon', $id->get_error_message(), 400); } update_post_meta($id, 'discount_type', $coupon_data['type']); update_post_meta($id, 'coupon_amount', wc_format_decimal($coupon_data['amount'])); update_post_meta($id, 'individual_use', true === $coupon_data['individual_use'] ? 'yes' : 'no'); update_post_meta($id, 'product_ids', implode(',', array_filter(array_map('intval', $coupon_data['product_ids'])))); update_post_meta($id, 'exclude_product_ids', implode(',', array_filter(array_map('intval', $coupon_data['exclude_product_ids'])))); update_post_meta($id, 'usage_limit', absint($coupon_data['usage_limit'])); update_post_meta($id, 'usage_limit_per_user', absint($coupon_data['usage_limit_per_user'])); update_post_meta($id, 'limit_usage_to_x_items', absint($coupon_data['limit_usage_to_x_items'])); update_post_meta($id, 'usage_count', absint($coupon_data['usage_count'])); update_post_meta($id, 'expiry_date', $this->get_coupon_expiry_date(wc_clean($coupon_data['expiry_date']))); update_post_meta($id, 'date_expires', $this->get_coupon_expiry_date(wc_clean($coupon_data['expiry_date']), true)); update_post_meta($id, 'free_shipping', true === $coupon_data['enable_free_shipping'] ? 'yes' : 'no'); update_post_meta($id, 'product_categories', array_filter(array_map('intval', $coupon_data['product_category_ids']))); update_post_meta($id, 'exclude_product_categories', array_filter(array_map('intval', $coupon_data['exclude_product_category_ids']))); update_post_meta($id, 'exclude_sale_items', true === $coupon_data['exclude_sale_items'] ? 'yes' : 'no'); update_post_meta($id, 'minimum_amount', wc_format_decimal($coupon_data['minimum_amount'])); update_post_meta($id, 'maximum_amount', wc_format_decimal($coupon_data['maximum_amount'])); update_post_meta($id, 'customer_email', array_filter(array_map('sanitize_email', $coupon_data['customer_emails']))); do_action('woocommerce_api_create_coupon', $id, $data); do_action('woocommerce_new_coupon', $id); $this->server->send_status(201); return $this->get_coupon($id); } catch (WC_API_Exception $e) { return new WP_Error($e->getErrorCode(), $e->getMessage(), array('status' => $e->getCode())); } } public function edit_coupon($id, $data) { try { if (!isset($data['coupon'])) { throw new WC_API_Exception('woocommerce_api_missing_coupon_data', sprintf(__('No %1$s data specified to edit %1$s', 'woocommerce'), 'coupon'), 400); } $data = $data['coupon']; $id = $this->validate_request($id, 'shop_coupon', 'edit'); if (is_wp_error($id)) { return $id; } $data = apply_filters('woocommerce_api_edit_coupon_data', $data, $id, $this); if (isset($data['code'])) { global $wpdb; $coupon_code = wc_format_coupon_code($data['code']); $id_from_code = wc_get_coupon_id_by_code($coupon_code, $id); if ($id_from_code) { throw new WC_API_Exception('woocommerce_api_coupon_code_already_exists', __('The coupon code already exists', 'woocommerce'), 400); } $updated = wp_update_post(array('ID' => intval($id), 'post_title' => $coupon_code)); if (0 === $updated) { throw new WC_API_Exception('woocommerce_api_cannot_update_coupon', __('Failed to update coupon', 'woocommerce'), 400); } } if (isset($data['description'])) { $updated = wp_update_post(array('ID' => intval($id), 'post_excerpt' => $data['description'])); if (0 === $updated) { throw new WC_API_Exception('woocommerce_api_cannot_update_coupon', __('Failed to update coupon', 'woocommerce'), 400); } } if (isset($data['type'])) { if (!in_array(wc_clean($data['type']), array_keys(wc_get_coupon_types()))) { throw new WC_API_Exception('woocommerce_api_invalid_coupon_type', sprintf(__('Invalid coupon type - the coupon type must be any of these: %s', 'woocommerce'), implode(', ', array_keys(wc_get_coupon_types()))), 400); } update_post_meta($id, 'discount_type', $data['type']); } if (isset($data['amount'])) { update_post_meta($id, 'coupon_amount', wc_format_decimal($data['amount'])); } if (isset($data['individual_use'])) { update_post_meta($id, 'individual_use', true === $data['individual_use'] ? 'yes' : 'no'); } if (isset($data['product_ids'])) { update_post_meta($id, 'product_ids', implode(',', array_filter(array_map('intval', $data['product_ids'])))); } if (isset($data['exclude_product_ids'])) { update_post_meta($id, 'exclude_product_ids', implode(',', array_filter(array_map('intval', $data['exclude_product_ids'])))); } if (isset($data['usage_limit'])) { update_post_meta($id, 'usage_limit', absint($data['usage_limit'])); } if (isset($data['usage_limit_per_user'])) { update_post_meta($id, 'usage_limit_per_user', absint($data['usage_limit_per_user'])); } if (isset($data['limit_usage_to_x_items'])) { update_post_meta($id, 'limit_usage_to_x_items', absint($data['limit_usage_to_x_items'])); } if (isset($data['usage_count'])) { update_post_meta($id, 'usage_count', absint($data['usage_count'])); } if (isset($data['expiry_date'])) { update_post_meta($id, 'expiry_date', $this->get_coupon_expiry_date(wc_clean($data['expiry_date']))); update_post_meta($id, 'date_expires', $this->get_coupon_expiry_date(wc_clean($data['expiry_date']), true)); } if (isset($data['enable_free_shipping'])) { update_post_meta($id, 'free_shipping', true === $data['enable_free_shipping'] ? 'yes' : 'no'); } if (isset($data['product_category_ids'])) { update_post_meta($id, 'product_categories', array_filter(array_map('intval', $data['product_category_ids']))); } if (isset($data['exclude_product_category_ids'])) { update_post_meta($id, 'exclude_product_categories', array_filter(array_map('intval', $data['exclude_product_category_ids']))); } if (isset($data['exclude_sale_items'])) { update_post_meta($id, 'exclude_sale_items', true === $data['exclude_sale_items'] ? 'yes' : 'no'); } if (isset($data['minimum_amount'])) { update_post_meta($id, 'minimum_amount', wc_format_decimal($data['minimum_amount'])); } if (isset($data['maximum_amount'])) { update_post_meta($id, 'maximum_amount', wc_format_decimal($data['maximum_amount'])); } if (isset($data['customer_emails'])) { update_post_meta($id, 'customer_email', array_filter(array_map('sanitize_email', $data['customer_emails']))); } do_action('woocommerce_api_edit_coupon', $id, $data); do_action('woocommerce_update_coupon', $id); return $this->get_coupon($id); } catch (WC_API_Exception $e) { return new WP_Error($e->getErrorCode(), $e->getMessage(), array('status' => $e->getCode())); } } public function delete_coupon($id, $force = false) { $id = $this->validate_request($id, 'shop_coupon', 'delete'); if (is_wp_error($id)) { return $id; } do_action('woocommerce_api_delete_coupon', $id, $this); return $this->delete($id, 'shop_coupon', 'true' === $force); } protected function get_coupon_expiry_date($expiry_date, $as_timestamp = false) { if ('' != $expiry_date) { if ($as_timestamp) { return strtotime($expiry_date); } return date('Y-m-d', strtotime($expiry_date)); } return ''; } private function query_coupons($args) { $query_args = array('fields' => 'ids', 'post_type' => 'shop_coupon', 'post_status' => 'publish'); $query_args = $this->merge_query_args($query_args, $args); return new WP_Query($query_args); } public function bulk($data) { try { if (!isset($data['coupons'])) { throw new WC_API_Exception('woocommerce_api_missing_coupons_data', sprintf(__('No %1$s data specified to create/edit %1$s', 'woocommerce'), 'coupons'), 400); } $data = $data['coupons']; $limit = apply_filters('woocommerce_api_bulk_limit', 100, 'coupons'); if (count($data) > $limit) { throw new WC_API_Exception('woocommerce_api_coupons_request_entity_too_large', sprintf(__('Unable to accept more than %s items for this request.', 'woocommerce'), $limit), 413); } $coupons = array(); foreach ($data as $_coupon) { $coupon_id = 0; if (isset($_coupon['id'])) { $coupon_id = intval($_coupon['id']); } if ($coupon_id) { $edit = $this->edit_coupon($coupon_id, array('coupon' => $_coupon)); if (is_wp_error($edit)) { $coupons[] = array('id' => $coupon_id, 'error' => array('code' => $edit->get_error_code(), 'message' => $edit->get_error_message())); } else { $coupons[] = $edit['coupon']; } } else { $new = $this->create_coupon(array('coupon' => $_coupon)); if (is_wp_error($new)) { $coupons[] = array('id' => $coupon_id, 'error' => array('code' => $new->get_error_code(), 'message' => $new->get_error_message())); } else { $coupons[] = $new['coupon']; } } } return array('coupons' => apply_filters('woocommerce_api_coupons_bulk_response', $coupons, $this)); } catch (WC_API_Exception $e) { return new WP_Error($e->getErrorCode(), $e->getMessage(), array('status' => $e->getCode())); } } }