2015-12-18 14:24:34 +00:00
< ? php
if ( ! defined ( 'ABSPATH' ) ) {
exit ; // Exit if accessed directly
}
/**
* Free Shipping Method .
*
2017-07-17 10:10:52 +00:00
* This class is here for backwards compatibility for methods existing before zones existed .
2015-12-18 14:24:34 +00:00
*
* @ deprecated 2.6 . 0
* @ version 2.4 . 0
* @ package WooCommerce / Classes / Shipping
* @ author WooThemes
*/
class WC_Shipping_Legacy_Free_Shipping extends WC_Shipping_Method {
/** @var float Min amount to be valid */
public $min_amount ;
/** @var string Requires option */
public $requires ;
/**
* Constructor .
*/
public function __construct () {
$this -> id = 'legacy_free_shipping' ;
2016-10-12 10:16:30 +00:00
$this -> method_title = __ ( 'Free shipping (legacy)' , 'woocommerce' );
2016-10-24 23:56:38 +00:00
$this -> method_description = '<strong>' . sprintf ( __ ( 'This method is deprecated in 2.6.0 and will be removed in future versions - we recommend disabling it and instead setting up a new rate within your <a href="%s">Shipping zones</a>.' , 'woocommerce' ), admin_url ( 'admin.php?page=wc-settings&tab=shipping' ) ) . '</strong>' ;
2015-12-18 14:24:34 +00:00
$this -> init ();
}
2016-04-28 11:36:49 +00:00
/**
* Process and redirect if disabled .
*/
public function process_admin_options () {
parent :: process_admin_options ();
2016-08-27 03:23:21 +00:00
if ( 'no' === $this -> settings [ 'enabled' ] ) {
2016-04-28 11:36:49 +00:00
wp_redirect ( admin_url ( 'admin.php?page=wc-settings&tab=shipping§ion=options' ) );
exit ;
}
}
2016-08-27 04:01:22 +00:00
2015-12-18 14:24:34 +00:00
/**
* Return the name of the option in the WP DB .
* @ since 2.6 . 0
* @ return string
*/
public function get_option_key () {
return $this -> plugin_id . 'free_shipping' . '_settings' ;
}
/**
* init function .
*/
public function init () {
// Load the settings.
$this -> init_form_fields ();
$this -> init_settings ();
// Define user set variables
$this -> enabled = $this -> get_option ( 'enabled' );
$this -> title = $this -> get_option ( 'title' );
$this -> min_amount = $this -> get_option ( 'min_amount' , 0 );
$this -> availability = $this -> get_option ( 'availability' );
$this -> countries = $this -> get_option ( 'countries' );
$this -> requires = $this -> get_option ( 'requires' );
// Actions
add_action ( 'woocommerce_update_options_shipping_' . $this -> id , array ( $this , 'process_admin_options' ) );
}
/**
* Initialise Gateway Settings Form Fields .
*/
public function init_form_fields () {
$this -> form_fields = array (
'enabled' => array (
'title' => __ ( 'Enable/Disable' , 'woocommerce' ),
'type' => 'checkbox' ,
2016-01-08 12:01:01 +00:00
'label' => __ ( 'Once disabled, this legacy method will no longer be available.' , 'woocommerce' ),
2016-08-27 01:46:45 +00:00
'default' => 'no' ,
2015-12-18 14:24:34 +00:00
),
'title' => array (
2016-10-12 10:16:30 +00:00
'title' => __ ( 'Method title' , 'woocommerce' ),
2015-12-18 14:24:34 +00:00
'type' => 'text' ,
'description' => __ ( 'This controls the title which the user sees during checkout.' , 'woocommerce' ),
'default' => __ ( 'Free Shipping' , 'woocommerce' ),
'desc_tip' => true ,
),
'availability' => array (
'title' => __ ( 'Method availability' , 'woocommerce' ),
'type' => 'select' ,
'default' => 'all' ,
'class' => 'availability wc-enhanced-select' ,
'options' => array (
'all' => __ ( 'All allowed countries' , 'woocommerce' ),
2016-08-27 01:46:45 +00:00
'specific' => __ ( 'Specific Countries' , 'woocommerce' ),
),
2015-12-18 14:24:34 +00:00
),
'countries' => array (
2016-10-12 10:16:30 +00:00
'title' => __ ( 'Specific countries' , 'woocommerce' ),
2015-12-18 14:24:34 +00:00
'type' => 'multiselect' ,
'class' => 'wc-enhanced-select' ,
2016-12-21 11:36:48 +00:00
'css' => 'width: 400px;' ,
2015-12-18 14:24:34 +00:00
'default' => '' ,
'options' => WC () -> countries -> get_shipping_countries (),
'custom_attributes' => array (
2016-08-27 01:46:45 +00:00
'data-placeholder' => __ ( 'Select some countries' , 'woocommerce' ),
),
2015-12-18 14:24:34 +00:00
),
'requires' => array (
2016-10-12 10:16:30 +00:00
'title' => __ ( 'Free shipping requires...' , 'woocommerce' ),
2015-12-18 14:24:34 +00:00
'type' => 'select' ,
'class' => 'wc-enhanced-select' ,
'default' => '' ,
'options' => array (
'' => __ ( 'N/A' , 'woocommerce' ),
'coupon' => __ ( 'A valid free shipping coupon' , 'woocommerce' ),
2016-10-11 01:39:13 +00:00
'min_amount' => __ ( 'A minimum order amount' , 'woocommerce' ),
2015-12-18 14:24:34 +00:00
'either' => __ ( 'A minimum order amount OR a coupon' , 'woocommerce' ),
'both' => __ ( 'A minimum order amount AND a coupon' , 'woocommerce' ),
2016-08-27 01:46:45 +00:00
),
2015-12-18 14:24:34 +00:00
),
'min_amount' => array (
2016-10-12 10:16:30 +00:00
'title' => __ ( 'Minimum order amount' , 'woocommerce' ),
2015-12-18 14:24:34 +00:00
'type' => 'price' ,
'placeholder' => wc_format_localized_price ( 0 ),
'description' => __ ( 'Users will need to spend this amount to get free shipping (if enabled above).' , 'woocommerce' ),
'default' => '0' ,
2016-08-27 01:46:45 +00:00
'desc_tip' => true ,
),
2015-12-18 14:24:34 +00:00
);
}
/**
* is_available function .
* @ param array $package
* @ return bool
*/
public function is_available ( $package ) {
if ( 'no' == $this -> enabled ) {
return false ;
}
if ( 'specific' == $this -> availability ) {
$ship_to_countries = $this -> countries ;
} else {
$ship_to_countries = array_keys ( WC () -> countries -> get_shipping_countries () );
}
if ( is_array ( $ship_to_countries ) && ! in_array ( $package [ 'destination' ][ 'country' ], $ship_to_countries ) ) {
return false ;
}
// Enabled logic
$is_available = false ;
$has_coupon = false ;
$has_met_min_amount = false ;
if ( in_array ( $this -> requires , array ( 'coupon' , 'either' , 'both' ) ) ) {
if ( $coupons = WC () -> cart -> get_coupons () ) {
foreach ( $coupons as $code => $coupon ) {
2016-02-25 16:36:39 +00:00
if ( $coupon -> is_valid () && $coupon -> get_free_shipping () ) {
2015-12-18 14:24:34 +00:00
$has_coupon = true ;
}
}
}
}
2017-08-21 12:01:20 +00:00
if ( in_array ( $this -> requires , array ( 'min_amount' , 'either' , 'both' ) ) ) {
$total = WC () -> cart -> get_displayed_subtotal ();
2017-12-15 13:39:35 +00:00
if ( WC () -> cart -> display_prices_including_tax () ) {
2017-08-21 12:01:20 +00:00
$total = round ( $total - ( WC () -> cart -> get_discount_total () + WC () -> cart -> get_discount_tax () ), wc_get_price_decimals () );
2015-12-18 14:24:34 +00:00
} else {
2017-08-21 12:01:20 +00:00
$total = round ( $total - WC () -> cart -> get_discount_total (), wc_get_price_decimals () );
2015-12-18 14:24:34 +00:00
}
if ( $total >= $this -> min_amount ) {
$has_met_min_amount = true ;
}
}
switch ( $this -> requires ) {
case 'min_amount' :
if ( $has_met_min_amount ) {
$is_available = true ;
}
break ;
case 'coupon' :
if ( $has_coupon ) {
$is_available = true ;
}
break ;
case 'both' :
if ( $has_met_min_amount && $has_coupon ) {
$is_available = true ;
}
break ;
case 'either' :
if ( $has_met_min_amount || $has_coupon ) {
$is_available = true ;
}
break ;
default :
$is_available = true ;
break ;
}
2017-08-11 20:36:18 +00:00
return apply_filters ( 'woocommerce_shipping_' . $this -> id . '_is_available' , $is_available , $package , $this );
2015-12-18 14:24:34 +00:00
}
/**
* calculate_shipping function .
*/
2015-12-18 17:10:58 +00:00
public function calculate_shipping ( $package = array () ) {
2015-12-18 14:24:34 +00:00
$args = array (
2016-04-20 14:03:10 +00:00
'id' => $this -> id ,
'label' => $this -> title ,
'cost' => 0 ,
'taxes' => false ,
'package' => $package ,
2015-12-18 14:24:34 +00:00
);
$this -> add_rate ( $args );
}
}