2011-08-10 17:11:11 +00:00
< ? php
/**
* Free Shipping Method
*
* A simple shipping method for free shipping
*
2012-01-27 16:38:39 +00:00
* @ class WC_Free_Shipping
2011-08-10 17:11:11 +00:00
* @ package WooCommerce
* @ category Shipping
* @ author WooThemes
*/
2012-01-27 16:38:39 +00:00
class WC_Free_Shipping extends WC_Shipping_Method {
2011-08-10 17:11:11 +00:00
2011-09-06 11:18:22 +00:00
function __construct () {
2011-08-10 17:11:11 +00:00
$this -> id = 'free_shipping' ;
2012-01-05 11:31:22 +00:00
$this -> method_title = __ ( 'Free shipping' , 'woocommerce' );
2012-02-06 11:16:06 +00:00
$this -> init ();
}
function init () {
2011-11-28 15:50:19 +00:00
// Load the form fields.
$this -> init_form_fields ();
// Load the settings.
$this -> init_settings ();
// Define user set variables
$this -> enabled = $this -> settings [ 'enabled' ];
$this -> title = $this -> settings [ 'title' ];
$this -> min_amount = $this -> settings [ 'min_amount' ];
$this -> availability = $this -> settings [ 'availability' ];
$this -> countries = $this -> settings [ 'countries' ];
2011-11-28 16:10:31 +00:00
$this -> requires_coupon = $this -> settings [ 'requires_coupon' ];
2011-08-10 17:11:11 +00:00
2011-11-28 15:50:19 +00:00
// Actions
2012-04-11 09:01:22 +00:00
add_action ( 'woocommerce_update_options_shipping_free_shipping' , array ( & $this , 'process_admin_options' ));
2012-02-06 11:16:06 +00:00
}
2011-11-28 15:50:19 +00:00
/**
* Initialise Gateway Settings Form Fields
*/
function init_form_fields () {
global $woocommerce ;
2011-08-10 17:11:11 +00:00
2011-11-28 15:50:19 +00:00
$this -> form_fields = array (
'enabled' => array (
2012-01-05 11:31:22 +00:00
'title' => __ ( 'Enable/Disable' , 'woocommerce' ),
2011-11-28 15:50:19 +00:00
'type' => 'checkbox' ,
2012-01-05 11:31:22 +00:00
'label' => __ ( 'Enable Free Shipping' , 'woocommerce' ),
2011-11-28 15:50:19 +00:00
'default' => 'yes'
),
'title' => array (
2012-01-05 11:31:22 +00:00
'title' => __ ( 'Method Title' , 'woocommerce' ),
2011-11-28 15:50:19 +00:00
'type' => 'text' ,
2012-01-05 11:31:22 +00:00
'description' => __ ( 'This controls the title which the user sees during checkout.' , 'woocommerce' ),
'default' => __ ( 'Free Shipping' , 'woocommerce' )
2011-11-28 15:50:19 +00:00
),
'min_amount' => array (
2012-01-05 11:31:22 +00:00
'title' => __ ( 'Minimum Order Amount' , 'woocommerce' ),
2011-11-28 15:50:19 +00:00
'type' => 'text' ,
2012-01-05 11:31:22 +00:00
'description' => __ ( 'Users will need to spend this amount to get free shipping. Leave blank to disable.' , 'woocommerce' ),
2011-11-28 15:50:19 +00:00
'default' => ''
),
2011-11-28 16:10:31 +00:00
'requires_coupon' => array (
2012-01-05 11:31:22 +00:00
'title' => __ ( 'Coupon' , 'woocommerce' ),
2011-11-28 16:10:31 +00:00
'type' => 'checkbox' ,
2012-01-05 11:31:22 +00:00
'label' => __ ( 'Free shipping requires a free shipping coupon' , 'woocommerce' ),
2012-01-06 11:36:19 +00:00
'description' => __ ( 'Users will need to enter a valid free shipping coupon code to use this method. If a coupon is used, the minimum order amount will be ignored.' , 'woocommerce' ),
2011-11-28 16:10:31 +00:00
'default' => 'no'
),
2011-11-28 15:50:19 +00:00
'availability' => array (
2012-01-05 11:31:22 +00:00
'title' => __ ( 'Method availability' , 'woocommerce' ),
2011-11-28 15:50:19 +00:00
'type' => 'select' ,
'default' => 'all' ,
'class' => 'availability' ,
'options' => array (
2012-01-05 11:31:22 +00:00
'all' => __ ( 'All allowed countries' , 'woocommerce' ),
'specific' => __ ( 'Specific Countries' , 'woocommerce' )
2011-11-28 15:50:19 +00:00
)
),
'countries' => array (
2012-01-05 11:31:22 +00:00
'title' => __ ( 'Specific Countries' , 'woocommerce' ),
2011-11-28 15:50:19 +00:00
'type' => 'multiselect' ,
'class' => 'chosen_select' ,
2011-12-07 19:45:29 +00:00
'css' => 'width: 450px;' ,
2011-11-28 15:50:19 +00:00
'default' => '' ,
'options' => $woocommerce -> countries -> countries
)
);
2011-08-10 17:11:11 +00:00
2011-11-28 15:50:19 +00:00
} // End init_form_fields()
/**
* Admin Panel Options
* - Options for bits like 'title' and availability on a country - by - country basis
*
* @ since 1.0 . 0
*/
public function admin_options () {
2011-08-10 17:11:11 +00:00
?>
2012-01-05 11:31:22 +00:00
< h3 >< ? php _e ( 'Free Shipping' , 'woocommerce' ); ?> </h3>
< p >< ? php _e ( 'Free Shipping - does what it says on the tin.' , 'woocommerce' ); ?> </p>
2011-08-13 13:57:48 +00:00
< table class = " form-table " >
2011-08-10 17:11:11 +00:00
< ? php
2011-11-28 15:50:19 +00:00
// Generate the HTML For the settings form.
$this -> generate_settings_html ();
?>
</ table ><!--/. form - table -->
< ? php
} // End admin_options()
2011-08-10 17:11:11 +00:00
2011-11-28 16:10:31 +00:00
2012-04-13 11:35:14 +00:00
function is_available ( $package ) {
2011-11-28 16:10:31 +00:00
global $woocommerce ;
2012-05-03 13:00:45 +00:00
if ( $this -> enabled == " no " ) return false ;
2011-11-28 16:10:31 +00:00
$ship_to_countries = '' ;
2012-05-03 13:00:45 +00:00
if ( $this -> availability == 'specific' ) {
2011-11-28 16:10:31 +00:00
$ship_to_countries = $this -> countries ;
2012-05-03 13:00:45 +00:00
} else {
if ( get_option ( 'woocommerce_allowed_countries' ) == 'specific' )
2011-11-28 16:10:31 +00:00
$ship_to_countries = get_option ( 'woocommerce_specific_allowed_countries' );
2012-05-03 13:00:45 +00:00
}
2011-11-28 16:10:31 +00:00
2012-05-03 13:00:45 +00:00
if ( is_array ( $ship_to_countries ) )
if ( ! in_array ( $package [ 'destination' ][ 'country' ], $ship_to_countries ) )
return false ;
// Enabled logic
$is_available = true ;
2012-01-06 11:36:19 +00:00
2012-05-03 13:00:45 +00:00
if ( $this -> requires_coupon == " yes " ) {
2012-01-02 12:48:56 +00:00
2012-05-03 13:00:45 +00:00
if ( $woocommerce -> cart -> applied_coupons ) {
foreach ( $woocommerce -> cart -> applied_coupons as $code ) {
$coupon = new WC_Coupon ( $code );
2011-11-28 16:10:31 +00:00
2012-05-03 13:00:45 +00:00
if ( $coupon -> enable_free_shipping () )
return true ;
}
}
2011-11-28 16:10:31 +00:00
2012-05-03 13:00:45 +00:00
// No coupon found, as it stands, free shipping is disabled
$is_available = false ;
2011-11-28 16:10:31 +00:00
2012-05-03 13:00:45 +00:00
}
2012-01-06 11:36:19 +00:00
2012-05-03 13:00:45 +00:00
if ( isset ( $woocommerce -> cart -> cart_contents_total ) && ! empty ( $this -> min_amount ) ) {
2012-01-06 11:36:19 +00:00
2012-05-03 13:00:45 +00:00
if ( $woocommerce -> cart -> prices_include_tax )
2012-01-06 11:36:19 +00:00
$total = $woocommerce -> cart -> tax_total + $woocommerce -> cart -> cart_contents_total ;
2012-05-03 13:00:45 +00:00
else
2012-01-06 11:36:19 +00:00
$total = $woocommerce -> cart -> cart_contents_total ;
2012-05-03 13:00:45 +00:00
if ( $this -> min_amount > $total )
$is_available = false ;
else
$is_available = true ;
2012-01-06 11:36:19 +00:00
2012-05-03 13:00:45 +00:00
}
2011-11-28 16:10:31 +00:00
2012-05-03 13:00:45 +00:00
return apply_filters ( 'woocommerce_shipping_' . $this -> id . '_is_available' , $is_available );
2011-11-28 16:10:31 +00:00
}
2011-11-28 15:50:19 +00:00
function calculate_shipping () {
2012-01-03 19:07:32 +00:00
$args = array (
2012-01-13 12:40:24 +00:00
'id' => $this -> id ,
2012-01-03 19:07:32 +00:00
'label' => $this -> title ,
2012-01-04 16:24:26 +00:00
'cost' => 0 ,
'taxes' => false
2012-01-03 19:07:32 +00:00
);
$this -> add_rate ( $args );
2011-08-10 17:11:11 +00:00
}
}
function add_free_shipping_method ( $methods ) {
2012-01-27 16:38:39 +00:00
$methods [] = 'WC_Free_Shipping' ; return $methods ;
2011-08-10 17:11:11 +00:00
}
add_filter ( 'woocommerce_shipping_methods' , 'add_free_shipping_method' );