public static is_postcode ( $postcode, $country ) : boolean | ||
return | boolean |
public static function is_postcode($postcode, $country)
{
if (strlen(trim(preg_replace('/[\\s\\-A-Za-z0-9]/', '', $postcode))) > 0) {
return false;
}
switch ($country) {
case 'AT':
$valid = (bool) preg_match('/^([0-9]{4})$/', $postcode);
break;
case 'BR':
$valid = (bool) preg_match('/^([0-9]{5})([-])?([0-9]{3})$/', $postcode);
break;
case 'CH':
$valid = (bool) preg_match('/^([0-9]{4})$/i', $postcode);
break;
case 'DE':
$valid = (bool) preg_match('/^([0]{1}[1-9]{1}|[1-9]{1}[0-9]{1})[0-9]{3}$/', $postcode);
break;
case 'ES':
$valid = (bool) preg_match('/^([0-9]{5})$/i', $postcode);
break;
case 'GB':
$valid = self::is_GB_postcode($postcode);
break;
case 'JP':
$valid = (bool) preg_match('/^([0-9]{3})([-])([0-9]{4})$/', $postcode);
break;
case 'PT':
$valid = (bool) preg_match('/^([0-9]{4})([-])([0-9]{3})$/', $postcode);
break;
case 'US':
$valid = (bool) preg_match('/^([0-9]{5})(-[0-9]{4})?$/i', $postcode);
break;
case 'CA':
// CA Postal codes cannot contain D,F,I,O,Q,U and cannot start with W or Z. https://en.wikipedia.org/wiki/Postal_codes_in_Canada#Number_of_possible_postal_codes
$valid = (bool) preg_match('/^([ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJKLMNPRSTVWXYZ])([\\ ])?(\\d[ABCEGHJKLMNPRSTVWXYZ]\\d)$/i', $postcode);
break;
case 'PL':
$valid = (bool) preg_match('/^([0-9]{2})([-])([0-9]{3})$/', $postcode);
break;
default:
$valid = true;
break;
}
return apply_filters('woocommerce_validate_postcode', $valid, $postcode, $country);
}
/** * Calculate shipping for the cart */ public static function calculate_shipping() { try { WC()->shipping->reset_shipping(); $country = wc_clean($_POST['calc_shipping_country']); $state = wc_clean(isset($_POST['calc_shipping_state']) ? $_POST['calc_shipping_state'] : ''); $postcode = apply_filters('woocommerce_shipping_calculator_enable_postcode', true) ? wc_clean($_POST['calc_shipping_postcode']) : ''; $city = apply_filters('woocommerce_shipping_calculator_enable_city', false) ? wc_clean($_POST['calc_shipping_city']) : ''; if ($postcode && !WC_Validation::is_postcode($postcode, $country)) { throw new Exception(__('Please enter a valid postcode/ZIP.', 'woocommerce')); } elseif ($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); 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'); } } }