2012-05-26 16:25:07 +00:00
< ? php
/**
* Local Delivery Shipping Method
2012-08-14 22:43:48 +00:00
*
2012-05-26 16:25:07 +00:00
* A simple shipping method allowing local delivery as a shipping method
*
* @ class WC_Local_Delivery
2012-08-14 22:43:48 +00:00
* @ version 1.6 . 4
* @ package WooCommerce / Classes / Shipping
* @ author WooThemes
*/
2012-10-15 10:57:58 +00:00
if ( ! defined ( 'ABSPATH' ) ) exit ; // Exit if accessed directly
2012-05-26 16:25:07 +00:00
class WC_Local_Delivery extends WC_Shipping_Method {
2012-08-14 22:43:48 +00:00
/**
* __construct function .
*
* @ access public
* @ return void
*/
function __construct () {
2012-05-26 16:25:07 +00:00
$this -> id = 'local_delivery' ;
2012-10-16 09:45:33 +00:00
$this -> method_title = __ ( 'Local Delivery' , 'woocommerce' );
2012-05-26 16:25:07 +00:00
$this -> init ();
2012-08-14 22:43:48 +00:00
}
/**
* init function .
*
* @ access public
* @ return void
*/
2012-05-26 16:25:07 +00:00
function init () {
// Load the form fields.
$this -> init_form_fields ();
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
// Load the settings.
$this -> init_settings ();
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
// Define user set variables
$this -> enabled = empty ( $this -> settings [ 'enabled' ] ) ? 'no' : $this -> settings [ 'enabled' ];
$this -> title = empty ( $this -> settings [ 'title' ] ) ? '' : $this -> settings [ 'title' ];
$this -> type = $this -> settings [ 'type' ];
$this -> fee = empty ( $this -> settings [ 'fee' ] ) ? '' : $this -> settings [ 'fee' ];
2012-08-14 22:43:48 +00:00
$this -> type = empty ( $this -> settings [ 'type' ] ) ? '' : $this -> settings [ 'type' ];
$this -> codes = empty ( $this -> settings [ 'codes' ] ) ? '' : $this -> settings [ 'codes' ];
2012-05-26 16:25:07 +00:00
$this -> availability = empty ( $this -> settings [ 'availability' ] ) ? '' : $this -> settings [ 'availability' ];
$this -> countries = empty ( $this -> settings [ 'countries' ] ) ? '' : $this -> settings [ 'countries' ];
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
add_action ( 'woocommerce_update_options_shipping_' . $this -> id , array ( & $this , 'process_admin_options' ));
}
2012-08-14 22:43:48 +00:00
/**
* calculate_shipping function .
*
* @ access public
* @ param array $package ( default : array ())
* @ return void
*/
2012-05-26 16:25:07 +00:00
function calculate_shipping ( $package = array () ) {
global $woocommerce ;
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
$shipping_total = 0 ;
$fee = ( trim ( $this -> fee ) == '' ) ? 0 : $this -> fee ;
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
if ( $this -> type == 'fixed' ) $shipping_total = $this -> fee ;
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
if ( $this -> type == 'percent' ) $shipping_total = $package [ 'contents_cost' ] * ( $this -> fee / 100 );
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
if ( $this -> type == 'product' ) {
foreach ( $woocommerce -> cart -> get_cart () as $item_id => $values ) {
$_product = $values [ 'data' ];
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
if ( $values [ 'quantity' ] > 0 && $_product -> needs_shipping () )
$shipping_total += $this -> fee * $values [ 'quantity' ];
}
}
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
$rate = array (
'id' => $this -> id ,
'label' => $this -> title ,
'cost' => $shipping_total
);
2012-08-14 22:43:48 +00:00
$this -> add_rate ( $rate );
2012-05-26 16:25:07 +00:00
}
2012-08-14 22:43:48 +00:00
/**
* init_form_fields function .
*
* @ access public
* @ return void
*/
2012-05-26 16:25:07 +00:00
function init_form_fields () {
global $woocommerce ;
$this -> form_fields = array (
'enabled' => array (
2012-08-14 22:43:48 +00:00
'title' => __ ( 'Enable' , 'woocommerce' ),
'type' => 'checkbox' ,
'label' => __ ( 'Enable local delivery' , 'woocommerce' ),
2012-05-26 16:25:07 +00:00
'default' => 'no'
2012-08-14 22:43:48 +00:00
),
2012-05-26 16:25:07 +00:00
'title' => array (
2012-08-14 22:43:48 +00:00
'title' => __ ( 'Title' , 'woocommerce' ),
'type' => 'text' ,
'description' => __ ( 'This controls the title which the user sees during checkout.' , 'woocommerce' ),
2012-05-26 16:25:07 +00:00
'default' => __ ( 'Local Delivery' , 'woocommerce' )
),
'type' => array (
2012-08-14 22:43:48 +00:00
'title' => __ ( 'Fee Type' , 'woocommerce' ),
'type' => 'select' ,
'description' => __ ( 'How to calculate delivery charges' , 'woocommerce' ),
2012-05-26 16:25:07 +00:00
'default' => 'fixed' ,
'options' => array (
2012-10-16 09:45:33 +00:00
'fixed' => __ ( 'Fixed amount' , 'woocommerce' ),
'percent' => __ ( 'Percentage of cart total' , 'woocommerce' ),
'product' => __ ( 'Fixed amount per product' , 'woocommerce' ),
2012-05-26 16:25:07 +00:00
),
),
'fee' => array (
2012-08-14 22:43:48 +00:00
'title' => __ ( 'Delivery Fee' , 'woocommerce' ),
'type' => 'text' ,
'description' => __ ( 'What fee do you want to charge for local delivery, disregarded if you choose free. Leave blank to disable.' , 'woocommerce' ),
2012-05-26 16:25:07 +00:00
'default' => ''
),
'codes' => array (
2012-08-14 22:43:48 +00:00
'title' => __ ( 'Zip/Post Codes' , 'woocommerce' ),
'type' => 'textarea' ,
2012-09-06 22:49:56 +00:00
'description' => __ ( 'What zip/post codes would you like to offer delivery to? Separate codes with a comma. Accepts wildcards, e.g. P* will match a postcode of PE30.' , 'woocommerce' ),
2012-05-26 16:25:07 +00:00
'default' => ''
),
'availability' => array (
2012-08-14 22:43:48 +00:00
'title' => __ ( 'Method availability' , 'woocommerce' ),
'type' => 'select' ,
2012-05-26 16:25:07 +00:00
'default' => 'all' ,
'class' => 'availability' ,
'options' => array (
2012-10-16 09:45:33 +00:00
'all' => __ ( 'All allowed countries' , 'woocommerce' ),
'specific' => __ ( 'Specific Countries' , 'woocommerce' )
2012-05-26 16:25:07 +00:00
)
),
'countries' => array (
2012-08-14 22:43:48 +00:00
'title' => __ ( 'Specific Countries' , 'woocommerce' ),
'type' => 'multiselect' ,
2012-05-26 16:25:07 +00:00
'class' => 'chosen_select' ,
'css' => 'width: 450px;' ,
'default' => '' ,
'options' => $woocommerce -> countries -> countries
2012-08-14 22:43:48 +00:00
)
2012-05-26 16:25:07 +00:00
);
}
2012-08-14 22:43:48 +00:00
/**
* admin_options function .
*
* @ access public
* @ return void
*/
2012-05-26 16:25:07 +00:00
function admin_options () {
global $woocommerce ; ?>
< h3 >< ? php echo $this -> method_title ; ?> </h3>
2012-10-16 09:45:33 +00:00
< p >< ? php _e ( 'Local delivery is a simple shipping method for delivering orders locally.' , 'woocommerce' ); ?> </p>
2012-05-26 16:25:07 +00:00
< table class = " form-table " >
< ? php $this -> generate_settings_html (); ?>
</ table > < ? php
}
2012-08-14 22:43:48 +00:00
/**
* is_available function .
*
* @ access public
* @ param array $package
* @ return bool
*/
2012-05-26 16:25:07 +00:00
function is_available ( $package ) {
global $woocommerce ;
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
if ( $this -> enabled == " no " ) return false ;
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
// If post codes are listed, let's use them.
$codes = '' ;
2012-09-06 22:49:56 +00:00
if ( $this -> codes != '' ) {
foreach ( explode ( ',' , $this -> codes ) as $code ) {
$codes [] = $this -> clean ( $code );
2012-05-26 16:25:07 +00:00
}
}
2012-09-06 22:49:56 +00:00
if ( is_array ( $codes ) ) {
$found_match = false ;
if ( in_array ( $this -> clean ( $package [ 'destination' ][ 'postcode' ] ), $codes ) )
$found_match = true ;
// Wildcard search
if ( ! $found_match ) {
$customer_postcode = $this -> clean ( $package [ 'destination' ][ 'postcode' ] );
$customer_postcode_length = strlen ( $customer_postcode );
for ( $i = 0 ; $i <= $customer_postcode_length ; $i ++ ) {
if ( in_array ( $customer_postcode , $codes ) )
$found_match = true ;
$customer_postcode = substr ( $customer_postcode , 0 , - 2 ) . '*' ;
}
}
if ( ! $found_match )
2012-05-26 16:25:07 +00:00
return false ;
2012-09-06 22:49:56 +00:00
}
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
// Either post codes not setup, or post codes are in array... so lefts check countries for backwards compatability.
$ship_to_countries = '' ;
if ( $this -> availability == 'specific' ) :
$ship_to_countries = $this -> countries ;
else :
if ( get_option ( 'woocommerce_allowed_countries' ) == 'specific' ) :
$ship_to_countries = get_option ( 'woocommerce_specific_allowed_countries' );
endif ;
2012-08-14 22:43:48 +00:00
endif ;
2012-05-26 16:25:07 +00:00
if ( is_array ( $ship_to_countries ))
if ( ! in_array ( $package [ 'destination' ][ 'country' ] , $ship_to_countries ))
return false ;
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
// Yay! We passed!
return apply_filters ( 'woocommerce_shipping_' . $this -> id . '_is_available' , true );
2012-08-14 22:43:48 +00:00
}
/**
* clean function .
*
* @ access public
* @ param mixed $code
* @ return string
*/
2012-09-06 22:49:56 +00:00
function clean ( $code ) {
return str_replace ( '-' , '' , sanitize_title ( $code ) ) . ( strstr ( $code , '*' ) ? '*' : '' );
2012-05-26 16:25:07 +00:00
}
2012-08-14 22:43:48 +00:00
}
/**
* add_local_delivery_method function .
*
2012-08-15 18:15:06 +00:00
* @ package WooCommerce / Classes / Shipping
2012-08-14 22:43:48 +00:00
* @ access public
* @ param array $methods
* @ return array
*/
function add_local_delivery_method ( $methods ) {
$methods [] = 'WC_Local_Delivery' ;
return $methods ;
2012-05-26 16:25:07 +00:00
}
2012-01-14 19:36:26 +00:00
add_filter ( 'woocommerce_shipping_methods' , 'add_local_delivery_method' );