/** * Sets a cookie when the cart has something in it. Can be used by hosts to prevent caching if set. * * @access public * @param mixed $set * @return void */ public function cart_has_contents_cookie($set) { if (!headers_sent()) { if ($set) { setcookie("woocommerce_items_in_cart", "1", 0, COOKIEPATH, COOKIE_DOMAIN, false); setcookie("woocommerce_cart_hash", md5(json_encode($this->cart->get_cart())), 0, COOKIEPATH, COOKIE_DOMAIN, false); } else { setcookie("woocommerce_items_in_cart", "0", time() - 3600, COOKIEPATH, COOKIE_DOMAIN, false); setcookie("woocommerce_cart_hash", "0", time() - 3600, COOKIEPATH, COOKIE_DOMAIN, false); } } }
/** * Prepare recurring amounts, taxes etc for subscription items * * @access public * @param int $order_id * @return void */ public function new_order($order_id) { global $woocommerce; // Iterate over real cart and work with subscription products (if any) foreach ($woocommerce->cart->cart_contents as $cart_item_key => $cart_item) { $id = !empty($cart_item['variation_id']) ? $cart_item['variation_id'] : $cart_item['product_id']; if (Subscriptio_Subscription_Product::is_subscription($id)) { $product = new WC_Product($id); // Store all required renewal order fields here $renewal_order = array( 'taxes' => array(), 'shipping' => array(), ); // Create fake cart to mimic renewal order $renewal_cart = new WC_Cart(); // Add product to cart $renewal_cart->add_to_cart( $cart_item['product_id'], $cart_item['quantity'], (isset($cart_item['variation_id']) ? $cart_item['variation_id'] : ''), (isset($cart_item['variation']) ? $cart_item['variation'] : '') ); // Get fake cart item key $renewal_cart_item_keys = array_keys($renewal_cart->cart_contents); $renewal_cart_item_key = array_shift($renewal_cart_item_keys); // Set renewal price $renewal_cart->cart_contents[$renewal_cart_item_key]['data']->price = Subscriptio_Subscription_Product::get_recurring_price($id); // Add shipping if ($product->needs_shipping() && $renewal_cart->needs_shipping()) { // Get instance of checkout object to retrieve shipping options $wc_checkout = WC_Checkout::instance(); // Iterate over shipping packages foreach ($woocommerce->shipping->get_packages() as $package_key => $package) { // Check if this rate was selected if (isset($package['rates'][$wc_checkout->shipping_methods[$package_key]])) { // Check if it contains current subscription if (isset($package['contents'][$cart_item_key])) { // Save shipping details for further calculation $shipping_details = array( 'shipping_method' => $wc_checkout->shipping_methods[$package_key], 'destination' => $package['destination'], ); // Save shipping address $renewal_order['shipping_address'] = array( // First three lines may need to be changed to make this compatible with shipping extensions that allow multiple shipping addresses '_shipping_first_name' => $wc_checkout->posted['ship_to_different_address'] ? $wc_checkout->posted['shipping_first_name'] : $wc_checkout->posted['billing_first_name'], '_shipping_last_name' => $wc_checkout->posted['ship_to_different_address'] ? $wc_checkout->posted['shipping_last_name'] : $wc_checkout->posted['billing_last_name'], '_shipping_company' => $wc_checkout->posted['ship_to_different_address'] ? $wc_checkout->posted['shipping_company'] : $wc_checkout->posted['billing_company'], '_shipping_address_1' => $shipping_details['destination']['address'], '_shipping_address_2' => $shipping_details['destination']['address_2'], '_shipping_city' => $shipping_details['destination']['city'], '_shipping_state' => $shipping_details['destination']['state'], '_shipping_postcode' => $shipping_details['destination']['postcode'], '_shipping_country' => $shipping_details['destination']['country'], ); break; } } } // Got the shipping method and address for the package that contains current subscription? if (!isset($shipping_details)) { continue; } // Get packages based on renewal order details $packages = apply_filters('woocommerce_cart_shipping_packages', array( 0 => array( 'contents' => $renewal_cart->get_cart(), 'contents_cost' => isset($renewal_cart->cart_contents[$renewal_cart_item_key]['line_total']) ? $renewal_cart->cart_contents[$renewal_cart_item_key]['line_total'] : 0, 'applied_coupons' => $renewal_cart->applied_coupons, 'destination' => $shipping_details['destination'], ), )); // Now we need to calculate shipping costs but this requires overwriting session variables // In order not to affect real cart, we will overwrite them but then set them back to original values $original_session = array( 'chosen_shipping_methods' => $woocommerce->session->get('chosen_shipping_methods'), 'shipping_method_counts' => $woocommerce->session->get('shipping_method_counts'), ); // Set fake renewal values $woocommerce->session->set('chosen_shipping_methods', array($shipping_details['shipping_method'])); $woocommerce->session->set('shipping_method_counts', array(1)); // Override chosen shipping method in case there's a mismatch in shipping_method_counts (more than one available) add_filter('woocommerce_shipping_chosen_method', array($this, 'set_shipping_chosen_method')); $this->temp_shipping_chosen_method = $shipping_details['shipping_method']; // Calculate shipping for fake renewal order now $woocommerce->shipping->calculate_shipping($packages); // Remove filter remove_filter('woocommerce_shipping_chosen_method', array($this, 'set_shipping_chosen_method')); $this->temp_shipping_chosen_method = null; } // Recalculate totals $renewal_cart->calculate_totals(); // Get taxes foreach ($renewal_cart->get_tax_totals() as $rate_key => $rate) { $renewal_order['taxes'][] = array( 'name' => $rate_key, 'rate_id' => $rate->tax_rate_id, 'label' => $rate->label, 'compound' => absint($rate->is_compound ? 1 : 0), 'tax_amount' => wc_format_decimal(isset($renewal_cart->taxes[$rate->tax_rate_id]) ? $renewal_cart->taxes[$rate->tax_rate_id] : 0), 'shipping_tax_amount' => wc_format_decimal(isset($renewal_cart->shipping_taxes[$rate->tax_rate_id]) ? $renewal_cart->shipping_taxes[$rate->tax_rate_id] : 0), ); } // Get renewal_order_shipping $renewal_order['renewal_order_shipping'] = wc_format_decimal($renewal_cart->shipping_total); // Get renewal_order_shipping_tax $renewal_order['renewal_order_shipping_tax'] = wc_format_decimal($renewal_cart->shipping_tax_total); // Get renewal_cart_discount $renewal_order['renewal_cart_discount'] = wc_format_decimal($renewal_cart->get_cart_discount_total()); // Get renewal_order_discount $renewal_order['renewal_order_discount'] = wc_format_decimal($renewal_cart->get_order_discount_total()); // Get renewal_order_tax $renewal_order['renewal_order_tax'] = wc_format_decimal($renewal_cart->tax_total); // Get renewal_order_total $renewal_order['renewal_order_total'] = wc_format_decimal($renewal_cart->total, get_option('woocommerce_price_num_decimals')); // Get renewal_line_subtotal $renewal_order['renewal_line_subtotal'] = wc_format_decimal($renewal_cart->cart_contents[$renewal_cart_item_key]['line_subtotal']); // Get renewal_line_subtotal_tax $renewal_order['renewal_line_subtotal_tax'] = wc_format_decimal($renewal_cart->cart_contents[$renewal_cart_item_key]['line_subtotal_tax']); // Get renewal_line_total $renewal_order['renewal_line_total'] = wc_format_decimal($renewal_cart->cart_contents[$renewal_cart_item_key]['line_total']); // Get renewal_line_tax $renewal_order['renewal_line_tax'] = wc_format_decimal($renewal_cart->cart_contents[$renewal_cart_item_key]['line_tax']); // Get shipping details if ($product->needs_shipping()) { if (isset($woocommerce->shipping->packages[0]['rates'][$shipping_details['shipping_method']])) { $method = $woocommerce->shipping->packages[0]['rates'][$shipping_details['shipping_method']]; $renewal_order['shipping'] = array( 'name' => $method->label, 'method_id' => $method->id, 'cost' => wc_format_decimal( $method->cost ), ); } // Set session variables to original values and recalculate shipping for original order which is being processed now $woocommerce->session->set('chosen_shipping_methods', $original_session['chosen_shipping_methods']); $woocommerce->session->set('shipping_method_counts', $original_session['shipping_method_counts']); $woocommerce->shipping->calculate_shipping($packages); } // Save to object property so it can be accessed from another method $this->renewal_orders['by_cart_item_key'][$cart_item_key] = $renewal_order; } } }
function save_addresses() { global $woocommerce; require_once $woocommerce->plugin_path() . '/classes/class-wc-cart.php'; require_once $woocommerce->plugin_path() . '/classes/class-wc-checkout.php'; $cart = new WC_Cart(); $woocommerce->checkout = new WC_Checkout(); $checkout = $woocommerce->checkout; //$fields = apply_filters( 'woocommerce_shipping_fields', array() ); $fields = $woocommerce->countries->get_address_fields($woocommerce->countries->get_base_country(), 'shipping_'); $cart->get_cart_from_session(); $cart_items = $cart->get_cart(); if (isset($_POST['shipping_address_action']) && $_POST['shipping_address_action'] == 'save') { $data = array(); $rel = array(); $address_ids = $_POST['addresses']; foreach ($address_ids as $a_id) { if (!isset($_POST['items_' . $a_id]) || empty($_POST['items_' . $a_id])) { continue; } $i = 1; if (isset($rel[$a_id]) && !empty($rel[$a_id])) { continue; } ///echo '<pre>'. print_r($_POST, true); exit; foreach ($_POST['items_' . $a_id] as $x => $cart_key) { $pid = $cart_items[$cart_key]['product_id']; $rel[$a_id][] = $cart_key; $item_key = $cart_key; $sig = $item_key . '_' . $pid . '_'; while (isset($data['shipping_first_name_' . $sig . $i])) { $i++; } $sig .= $i; //echo '<pre>'. print_r($fields, true); exit; if ($fields) { foreach ($fields as $key => $field) { $data[$key . '_' . $sig] = $_POST[$key . '_' . $a_id]; } } $cart_address_ids_session = wcms_session_get('cart_address_ids'); if (!wcms_session_isset('cart_address_ids') || !in_array($sig, $cart_address_ids_session)) { $cart_address_sigs_session = wcms_session_get('cart_address_sigs'); $cart_address_sigs_session[$sig] = $a_id; wcms_session_set('cart_address_sigs', $cart_address_sigs_session); } } } //echo '<pre>'. print_r($_POST, true) .'</pre>'; //echo '<pre>'. print_r($data, true); exit; wcms_session_set('cart_item_addresses', $data); wcms_session_set('address_relationships', $rel); // redirect to the checkout page $checkout_url = $woocommerce->cart->get_checkout_url(); wp_redirect($checkout_url); exit; } elseif (isset($_POST['shipping_account_address_action']) && $_POST['shipping_account_address_action'] == 'save') { unset($_POST['shipping_account_address_action'], $_POST['set_addresses']); $addresses = array(); foreach ($_POST as $key => $values) { foreach ($values as $idx => $val) { $addresses[$idx][$key] = $val; } } $user = wp_get_current_user(); update_user_meta($user->ID, 'wc_other_addresses', $addresses); $woocommerce->add_message(__('Addresses have been saved', 'wc_shipping_multiple_address')); $page_id = woocommerce_get_page_id('myaccount'); wp_redirect(get_permalink($page_id)); exit; } }