<?php
defined('ABSPATH') || exit;
class WC_Shortcode_Cart
{
public static function calculate_shipping()
{
try {
WC()->shipping()->reset_shipping();
$address = array();
$address['country'] = isset($_POST['calc_shipping_country']) ? wc_clean(wp_unslash($_POST['calc_shipping_country'])) : '';
$address['state'] = isset($_POST['calc_shipping_state']) ? wc_clean(wp_unslash($_POST['calc_shipping_state'])) : '';
$address['postcode'] = isset($_POST['calc_shipping_postcode']) ? wc_clean(wp_unslash($_POST['calc_shipping_postcode'])) : '';
$address['city'] = isset($_POST['calc_shipping_city']) ? wc_clean(wp_unslash($_POST['calc_shipping_city'])) : '';
$address = apply_filters('woocommerce_cart_calculate_shipping_address', $address);
if ($address['postcode'] && !WC_Validation::is_postcode($address['postcode'], $address['country'])) {
throw new Exception(__('Please enter a valid postcode / ZIP.', 'woocommerce'));
} elseif ($address['postcode']) {
$address['postcode'] = wc_format_postcode($address['postcode'], $address['country']);
}
if ($address['country']) {
if (!WC()->customer->get_billing_first_name()) {
WC()->customer->set_billing_location($address['country'], $address['state'], $address['postcode'], $address['city']);
}
WC()->customer->set_shipping_location($address['country'], $address['state'], $address['postcode'], $address['city']);
} else {
WC()->customer->set_billing_address_to_base();
WC()->customer->set_shipping_address_to_base();
}
WC()->customer->set_calculated_shipping(true);
WC()->customer->save();
wc_add_notice(__('Shipping costs updated.', 'woocommerce'), 'notice');
do_action('woocommerce_calculated_shipping');
} catch (Exception $e) {
if (!empty($e)) {
wc_add_notice($e->getMessage(), 'error');
}
}
}
public static function output($atts)
{
if (!apply_filters('woocommerce_output_cart_shortcode_content', true)) {
return;
}
wc_maybe_define_constant('WOOCOMMERCE_CART', true);
$atts = shortcode_atts(array(), $atts, 'woocommerce_cart');
$nonce_value = wc_get_var($_REQUEST['woocommerce-shipping-calculator-nonce'], wc_get_var($_REQUEST['_wpnonce'], ''));
if (!empty($_POST['calc_shipping']) && (wp_verify_nonce($nonce_value, 'woocommerce-shipping-calculator') || wp_verify_nonce($nonce_value, 'woocommerce-cart'))) {
self::calculate_shipping();
WC()->cart->calculate_totals();
}
do_action('woocommerce_check_cart_items');
WC()->cart->calculate_totals();
if (WC()->cart->is_empty()) {
wc_get_template('cart/cart-empty.php');
} else {
wc_get_template('cart/cart.php');
}
}
}