File "class-wc-api-coupons.php"

Full path: /home/kosmetik/public_html/wp-content/plugins/woocommerce/includes/legacy/api/v3/class-wc-api-coupons.php
File size: 18.19 B
MIME-type: text/x-php
Charset: utf-8

Download   Open   Edit   Advanced Editor   Back

<?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()));
        }
    }
}