cart_object)){ $this->cart_object = new WOOAPP_Cart(); WC()->cart = $this->cart_object; if(!$this->shipping_calculated) { $data = WC()->session->get('wc_shipping_calculate_details'); if (!empty($data)) { $_POST = array_merge($_POST, $data); $this->calculate_shipping($data['calc_shipping_country'], $data['calc_shipping_state'], false); $this->set_shipping_method(); }else{ WC()->customer->set_to_base(); WC()->customer->set_shipping_to_base(); $this->set_shipping_method(); } } // WC()->customer->set_shipping_to_base(); } global $woocommerce; $woocommerce->cart = $this->cart_object; return $this->cart_object; } /** * Register the routes for this class * * @param array $routes * @return array */ public function register_routes( $routes ) { $routes[ $this->base ] = array( array( array( $this, 'get_cart_items' ), WOOAPP_API_Server::READABLE ), ); $routes[ $this->base . '/count'] = array( array( array( $this, 'get_cart_count' ), WOOAPP_API_Server::READABLE ), ); $routes[ $this->base . '/add'] = array( array( array( $this, 'add_to_cart' ), WOOAPP_API_Server::EDITABLE |WOOAPP_API_Server::ACCEPT_DATA ), ); $routes[ $this->base . '/meta'] = array( array( array( $this, 'cart_meta' ), WOOAPP_API_Server::METHOD_GET), ); $routes[ $this->base . '/set_quantity' ] = array( array( array( $this, 'update_quantity' ), WOOAPP_API_Server::EDITABLE), ); $routes[ $this->base . '/update_quantity' ] = array( array( array( $this, 'update_bulk_quantity' ), WOOAPP_API_Server::EDITABLE), ); $routes[ $this->base . '/coupon/add' ] = array( array( array( $this, 'add_coupon' ), WOOAPP_API_Server::METHOD_POST), ); $routes[ $this->base . '/coupon/remove' ] = array( array( array( $this, 'remove_coupon' ), WOOAPP_API_Server::METHOD_POST), ); $routes[ $this->base . '/calculate_shipping' ] = array( array( array( $this, 'calculate_shipping' ), WOOAPP_API_Server::METHOD_POST), ); return $routes; } public function get_cart_meta(){ $this->cart()->calculate_totals(); $coupon_discount_amounts = array(); foreach($this->cart()->coupon_discount_amounts as $coupon=>$price){ $coupon_discount_amounts[]=array("coupon"=>$coupon,"discount"=>$price); } $return = array( "coupons_applied"=>$this->cart()->get_applied_coupons(), "coupon_discounted"=>$coupon_discount_amounts, "count"=>$this->cart()->get_cart_contents_count(), "shipping_fee" =>!empty($this->cart()->shipping_total)?$this->cart()->shipping_total:0, "tax"=>$this->cart()->get_cart_tax(), "fees"=>$this->cart()->get_fees(), "currency" =>get_woocommerce_currency(), "currency_symbol"=>get_woocommerce_currency_symbol(), "total"=>$this->cart()->subtotal, "cart_total"=>$this->cart()->cart_contents_total, "order_total"=>$this->cart()->total, "price_format"=>get_woocommerce_price_format(), 'timezone' => wc_timezone_string(), 'tax_included' => ( 'yes' === get_option( 'woocommerce_prices_include_tax' ) ), 'weight_unit' => get_option( 'woocommerce_weight_unit' ), 'dimension_unit' => get_option( 'woocommerce_dimension_unit' ), "can_proceed" => true, "error_message" => "", ); return apply_filters("appilder_woocommerce_cart_meta_response",$return); } public function cart_meta(){ $cart = $this->cart()->get_cart_api(); // get_user_meta(get_current_user_id(), '_woocommerce_persistent_cart',true); $return['cart'] = array(); if(!empty($cart)){ $return = $this->get_cart_meta(); $return['status'] =1; }else{ $return = WOOAPP_API_Error::setError($return,"empty_cart","Cart is empty"); } wc_clear_notices(); return $return; } /** * @param bool|array $shipping_methods */ public function set_shipping_method($shipping_methods=false){ if(empty($shipping_methods) && isset($_POST['shipping_methods'])) $shipping_methods = $_POST['shipping_methods']; elseif(empty($shipping_methods) && isset($_GET['shipping_methods'])) $shipping_methods = $_GET['shipping_methods']; if(empty($shipping_methods)) $shipping_methods = WC()->session->get( 'wc_chosen_shipping_methods', $shipping_methods ); $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' ); if ( isset($shipping_methods) && is_array( $shipping_methods) && !empty($shipping_methods)) { foreach ($shipping_methods as $i => $value) { $chosen_shipping_methods[$i] = wc_clean($value); } WC()->session->set( 'wc_chosen_shipping_methods', $shipping_methods ); WC()->session->set( 'chosen_shipping_methods', $chosen_shipping_methods ); } } /** * Get all orders * * @since 2.1 * @internal param string $fields * @internal param array $filter * @internal param string $status * @internal param int $page * @internal param WC_Cart $cart * @param array $shipping_methods * @return array */ public function get_cart_items($shipping_methods=array()){ $this->set_shipping_method($shipping_methods); $this->cart()->calculate_totals(); $cart = $this->cart()->get_cart_api(); // get_user_meta(get_current_user_id(), '_woocommerce_persistent_cart',true); $return['cart'] = array(); if(!empty($cart)){ $return['status'] =1; $return['cart'] = $cart; $this->cart()->calculate_totals(); $return = array_merge($return,$this->get_cart_meta()); }else{ $return = WOOAPP_API_Error::setError($return,"empty_cart","Cart is empty"); } if(is_wooapp_api_error($return)) return $return; $return = array_merge($return,$this->get_shipping_methods()); wc_clear_notices(); return apply_filters("appilder_woocommerce_cart_response",$return); } public function get_shipping_methods(){ $return = array(); if($this->cart()->needs_shipping() && $this->cart()->show_shipping()){ $return['show_shipping'] = 1; $this->cart()->calculate_shipping(); $packages = WC()->shipping()->get_packages(); foreach ( $packages as $i => $package ) { $chosen_method = isset( WC()->session->chosen_shipping_methods[ $i ] ) ? WC()->session->chosen_shipping_methods[ $i ] : ''; $return['shipping'][] = array('methods'=>$this->getMethodsInArray($package['rates']), 'chosen'=>$chosen_method,'index'=>$i ); } }else{ $return['show_shipping'] = 0; $return['shipping'] = array(); } if(empty($return['shipping']) || is_null($return['shipping']) || !is_array($return['shipping'])) { $return['show_shipping'] = 0; $return['shipping'] = array(); } return $return; } private function getMethodsInArray($methods){ $return = array(); foreach($methods as $method){ $return[]=array( 'id'=>$method->id, 'label'=> html_entity_decode($method->label,ENT_QUOTES, 'UTF-8'), 'cost'=>$method->cost, 'taxes'=>$method->taxes, 'method_id'=>$method->method_id, ); } return $return; } public function is_readable($cart){ } public function get_wp_notices_error(){ $notices = WC()->session->get( 'wc_notices', array() ); if(!empty($notices['error'])){ $return = array(); foreach($notices['error'] as $key=>$error){ $return = WOOAPP_API_Error::setError($return,'cart_add_error_'.$key, html_entity_decode($error)); } wc_clear_notices(); return $return; }else{ return false; } } /** * @param $product_id * @param $quantity * @param null $variation_id * @param string $variation * @internal param $id * @return mixed */ public function add_to_cart($product_id,$quantity,$variation_id=null,$variation=''){ $this->cart(); $_POST['add-to-cart'] = $_REQUEST['add-to-cart'] = $product_id; add_filter('option_woocommerce_cart_redirect_after_add' , array(self::name(),'returnNo'),9999); add_filter('woocommerce_add_to_cart_redirect' , array(self::name(),'returnFalse'),9999); WC_Form_Handler::add_to_cart_action(false); $return = $this->get_wp_notices_error(); if($return !== false){ if(!is_wooapp_api_error($return)) $return = WOOAPP_API_Error::setError($return,"error_add","Cannot add item to cart"); }else{ $return = $this->get_cart_items(); } return $return; } public static function returnNo ($value){ return 'no'; } public static function returnFalse ($value){ return false; } /** * Get the total number of cart * @return array */ public function get_cart_count( ) { return array( 'count' => (int)$this->cart()->get_cart_contents_count() ); } /** * Update cart item quantity * * @since 2.1 * @param $key * @param $quantity * @param bool $refresh_totals * @param bool $return_item * @internal param int $id the order ID * @internal param array $data * @return array */ public function update_quantity($key, $quantity,$refresh_totals = true,$return_item = true ) { $product = $this->cart()->get_cart_item($key); if (!$product['data']->has_enough_stock( $product['quantity'] + $quantity ) ) { return WOOAPP_API_Error::setError(false,"cannot_add",sprintf( __( 'You cannot add that amount to the cart — we have %s in stock and you already have %s in your cart.', 'woocommerce' ), $product['data']->get_stock_quantity(),$product['quantity'])); } $this->cart()->set_quantity( $key, $quantity, $refresh_totals); $this->cart()->check_cart_items(); $this->cart()->persistent_cart_update(); if($return_item) { $return = $this->get_cart_items(); return $return; }else return true; } /** * Update cart item quantity * * @since 2.1 * @param $bulk * @internal param $quantity * @return array */ public function update_bulk_quantity($bulk) { foreach($bulk as $key=>$qty){ $this->update_quantity($key,$qty,true,false); } $return = $this->get_cart_items(); return $return; } public function add_coupon($coupon_code){ $added = $this->cart()->add_discount($coupon_code); if(!$added){ $return = $this->get_wp_notices_error(); if(!is_wooapp_api_error($return)) $return = WOOAPP_API_Error::setError($return,"invalid_coupon","Invalid coupon"); }else{ $this->cart()->persistent_cart_update(); $return = $this->get_cart_items(); } return $return; } public function remove_coupon($coupon_code){ $added = $this->cart()->remove_coupon($coupon_code); if(!$added){ $return = $this->get_wp_notices_error(); if(!is_wooapp_api_error($return)) $return = WOOAPP_API_Error::setError($return,"invalid_coupon","Cannot remove coupon"); }else{ $this->cart()->persistent_cart_update(); $return = $this->get_cart_items(); } return $return; } public function calculate_shipping($calc_shipping_country=false,$calc_shipping_state='',$has_to_return = true){ $return = array(); $data = array('calc_shipping_country'=>wc_clean($calc_shipping_country),'calc_shipping_state'=>wc_clean($calc_shipping_state)); try { /* if(apply_filters( 'woocommerce_shipping_calculator_enable_postcode', true ) && !isset($_POST['calc_shipping_postcode'])){ $return = WOOAPP_API_Error::setError($return,"missing_parameter","Missing parameter calc_shipping_postcode"); }elseif(apply_filters( 'woocommerce_shipping_calculator_enable_postcode', true ) && isset($_POST['calc_shipping_postcode'])) $data['calc_shipping_postcode'] = wc_clean($_POST['calc_shipping_postcode']); else $data['calc_shipping_postcode'] = ''; if(apply_filters( 'woocommerce_shipping_calculator_enable_city', false) && !isset($_POST['calc_shipping_city'])){ $return = WOOAPP_API_Error::setError($return,"missing_parameter","Missing parameter calc_shipping_city"); }elseif(apply_filters( 'woocommerce_shipping_calculator_enable_city', false) && isset($_POST['calc_shipping_city'])) $data['calc_shipping_city'] = wc_clean($_POST['calc_shipping_city']); else $data['calc_shipping_city'] = ''; */ if(apply_filters( 'woocommerce_shipping_calculator_enable_postcode', true ) && isset($_POST['calc_shipping_postcode']) && !empty($_POST['calc_shipping_postcode']) && $_POST['calc_shipping_postcode'] != 'null' ) $data['calc_shipping_postcode'] = wc_clean($_POST['calc_shipping_postcode']); else $data['calc_shipping_postcode'] = ''; if(apply_filters( 'woocommerce_shipping_calculator_enable_city', true) && isset($_POST['calc_shipping_city']) && !empty($_POST['calc_shipping_city']) && $_POST['calc_shipping_city'] != 'null' ) $data['calc_shipping_city'] = wc_clean($_POST['calc_shipping_city']); else $data['calc_shipping_city'] = ''; if(empty($data['calc_shipping_country']) || $data['calc_shipping_country'] == 'null' ){ $data['calc_shipping_country'] = false; } if(empty($data['calc_shipping_state']) || $data['calc_shipping_state'] == 'null' ){ $data['calc_shipping_state'] = ''; } if(!is_wooapp_api_error($return)){ WC()->shipping->reset_shipping(); $country = $data['calc_shipping_country']; $state = $data['calc_shipping_state']; $postcode = $data['calc_shipping_postcode']; $city = $data['calc_shipping_city']; if ( !empty($postcode) && ! WC_Validation::is_postcode( $postcode, $country ) ) { throw new Exception( __( 'Please enter a valid postcode/ZIP.', 'woocommerce' ) ); } elseif ( !empty($postcode) ) { $postcode = wc_format_postcode( $postcode, $country ); } if ( $country ) { WC()->customer->set_location( $country, $state, $postcode, $city ); WC()->customer->set_shipping_location( $country, $state, $postcode, $city ); } else { WC()->customer->set_to_base(); WC()->customer->set_shipping_to_base(); } WC()->customer->calculated_shipping( true ); $this->shipping_calculated = true; do_action( 'woocommerce_calculated_shipping' ); } }catch (Exception $e){ $return = WOOAPP_API_Error::setError("unable_to_process","Unable to process"); } if($this->get_wp_notices_error() !== false){ $return = $this->get_wp_notices_error(); } if(!is_wooapp_api_error($return) && $has_to_return){ WC()->session->set('wc_shipping_calculate_details',$data); $return= $this->get_cart_items(); $return['status'] =1; } if($has_to_return) return $return; else return true; } public function __destruct(){ wc_clear_notices(); } }