/** * Test coupon saving. * @since 2.7.0 */ function test_coupon_save() { $coupon = WC_Helper_Coupon::create_coupon(); $coupon_id = $coupon->get_id(); $coupon->set_code('dummycoupon2'); $coupon->save(); $coupon->read($coupon_id); // Read from DB to retest $this->assertEquals('dummycoupon2', $coupon->get_code()); $this->assertEquals($coupon_id, $coupon->get_id()); $new_coupon = new WC_Coupon(); $new_coupon->set_code('dummycoupon3'); $new_coupon->save(); $new_coupon_id = $new_coupon->get_id(); $this->assertEquals('dummycoupon3', $new_coupon->get_code()); $this->assertNotEquals(0, $new_coupon_id); }
/** * Prepare a single coupon for create or update. * * @param WP_REST_Request $request Request object. * @return WP_Error|stdClass $data Post object. */ protected function prepare_item_for_database($request) { global $wpdb; $id = isset($request['id']) ? absint($request['id']) : 0; $coupon = new WC_Coupon($id); $schema = $this->get_item_schema(); $data_keys = array_keys(array_filter($schema['properties'], array($this, 'filter_writable_props'))); // BW compat if ($request['exclude_product_ids']) { $request['excluded_product_ids'] = $request['exclude_product_ids']; } if ($request['expiry_date']) { $request['date_expires'] = $request['expiry_date']; } // Validate required POST fields. if ('POST' === $request->get_method() && 0 === $coupon->get_id()) { if (empty($request['code'])) { return new WP_Error('woocommerce_rest_empty_coupon_code', sprintf(__('The coupon code cannot be empty.', 'woocommerce'), 'code'), array('status' => 400)); } } // Handle all writable props foreach ($data_keys as $key) { $value = $request[$key]; if (!is_null($value)) { switch ($key) { case 'code': $coupon_code = apply_filters('woocommerce_coupon_code', $value); $id = $coupon->get_id() ? $coupon->get_id() : 0; $id_from_code = wc_get_coupon_id_by_code($coupon_code, $id); if ($id_from_code) { return new WP_Error('woocommerce_rest_coupon_code_already_exists', __('The coupon code already exists', 'woocommerce'), array('status' => 400)); } $coupon->set_code($coupon_code); break; case 'meta_data': if (is_array($value)) { foreach ($value as $meta) { $coupon->update_meta_data($meta['key'], $meta['value'], $meta['id']); } } break; case 'description': $coupon->set_description(wp_filter_post_kses($value)); break; default: if (is_callable(array($coupon, "set_{$key}"))) { $coupon->{"set_{$key}"}($value); } break; } } } /** * Filter the query_vars used in `get_items` for the constructed query. * * The dynamic portion of the hook name, $this->post_type, refers to post_type of the post being * prepared for insertion. * * @param WC_Coupon $coupon The coupon object. * @param WP_REST_Request $request Request object. */ return apply_filters("woocommerce_rest_pre_insert_{$this->post_type}", $coupon, $request); }
/** * Prepare a single coupon for create or update. * * @param WP_REST_Request $request Request object. * @return WP_Error|stdClass $data Post object. */ protected function prepare_item_for_database($request) { global $wpdb; // ID. if (isset($request['id'])) { $code = $wpdb->get_var($wpdb->prepare("SELECT post_title FROM {$wpdb->posts} WHERE id = %d AND post_type = 'shop_coupon' AND post_status = 'publish'", $request['id'])); $coupon = new WC_Coupon($code); } else { $coupon = new WC_Coupon(); } $schema = $this->get_item_schema(); // Validate required POST fields. if ('POST' === $request->get_method() && 0 === $coupon->get_id()) { if (empty($request['code'])) { return new WP_Error('woocommerce_rest_empty_coupon_code', sprintf(__('The coupon code cannot be empty.', 'woocommerce'), 'code'), array('status' => 400)); } } // Code. if (!empty($schema['properties']['code']) && !empty($request['code'])) { $coupon_code = apply_filters('woocommerce_coupon_code', $request['code']); $id = $coupon->get_id() ? $coupon->get_id() : 0; // Check for duplicate coupon codes. $coupon_found = $wpdb->get_var($wpdb->prepare("\n\t\t\t\tSELECT {$wpdb->posts}.ID\n\t\t\t\tFROM {$wpdb->posts}\n\t\t\t\tWHERE {$wpdb->posts}.post_type = 'shop_coupon'\n\t\t\t\tAND {$wpdb->posts}.post_status = 'publish'\n\t\t\t\tAND {$wpdb->posts}.post_title = '%s'\n\t\t\t\tAND {$wpdb->posts}.ID != %s\n\t\t\t ", $coupon_code, $id)); if ($coupon_found) { return new WP_Error('woocommerce_rest_coupon_code_already_exists', __('The coupon code already exists', 'woocommerce'), array('status' => 400)); } $coupon->set_code($coupon_code); } // Coupon description (excerpt). if (!empty($schema['properties']['description']) && isset($request['description'])) { $coupon->set_description(wp_filter_post_kses($request['description'])); } /** * Filter the query_vars used in `get_items` for the constructed query. * * The dynamic portion of the hook name, $this->post_type, refers to post_type of the post being * prepared for insertion. * * @param stdClass $data An object representing a single item prepared * for inserting or updating the database. * @param WP_REST_Request $request Request object. */ return apply_filters("woocommerce_rest_pre_insert_{$this->post_type}", $coupon, $request); }