2012-05-26 16:25:07 +00:00
< ? php
2013-02-20 17:14:46 +00:00
if ( ! defined ( 'ABSPATH' ) ) exit ; // Exit if accessed directly
2012-05-26 16:25:07 +00:00
/**
* Local Pickup Shipping Method
2012-08-14 22:43:48 +00:00
*
2012-05-26 16:25:07 +00:00
* A simple shipping method allowing free pickup as a shipping method
*
2012-12-31 18:25:09 +00:00
* @ class WC_Shipping_Local_Pickup
* @ version 2.0 . 0
2012-08-14 22:43:48 +00:00
* @ package WooCommerce / Classes / Shipping
* @ author WooThemes
*/
2012-12-31 18:25:09 +00:00
class WC_Shipping_Local_Pickup extends WC_Shipping_Method {
2012-05-26 16:25:07 +00:00
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_pickup' ;
2012-10-16 09:45:33 +00:00
$this -> method_title = __ ( 'Local Pickup' , 'woocommerce' );
2012-05-26 16:25:07 +00:00
$this -> init ();
2012-08-14 22:43:48 +00:00
}
2013-08-12 21:09:04 +00:00
/**
* init function .
*
* @ access public
* @ return void
*/
function init () {
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
// Load the settings.
2013-01-02 13:38:33 +00:00
$this -> init_form_fields ();
2012-05-26 16:25:07 +00:00
$this -> init_settings ();
2012-08-14 22:43:48 +00:00
2012-05-26 16:25:07 +00:00
// Define user set variables
2012-12-31 12:07:43 +00:00
$this -> enabled = $this -> get_option ( 'enabled' );
$this -> title = $this -> get_option ( 'title' );
$this -> codes = $this -> get_option ( 'codes' );
$this -> availability = $this -> get_option ( 'availability' );
$this -> countries = $this -> get_option ( 'countries' );
2012-08-14 22:43:48 +00:00
2012-10-01 09:45:07 +00:00
// Actions
2012-12-15 11:53:32 +00:00
add_action ( 'woocommerce_update_options_shipping_' . $this -> id , array ( $this , 'process_admin_options' ) );
2012-05-26 16:25:07 +00:00
}
2012-08-14 22:43:48 +00:00
/**
* calculate_shipping function .
*
* @ access public
* @ return void
*/
function calculate_shipping () {
2012-05-26 16:25:07 +00:00
$rate = array (
'id' => $this -> id ,
'label' => $this -> title ,
);
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 () {
2013-08-12 21:09:04 +00:00
$this -> form_fields = array (
2012-05-26 16:25:07 +00:00
'enabled' => array (
2013-08-12 21:09:04 +00:00
'title' => __ ( 'Enable' , 'woocommerce' ),
'type' => 'checkbox' ,
'label' => __ ( 'Enable local pickup' , 'woocommerce' ),
'default' => 'no'
2012-08-14 22:43:48 +00:00
),
2012-05-26 16:25:07 +00:00
'title' => array (
2013-08-12 21:09:04 +00:00
'title' => __ ( 'Title' , 'woocommerce' ),
'type' => 'text' ,
'description' => __ ( 'This controls the title which the user sees during checkout.' , 'woocommerce' ),
2013-01-18 12:10:19 +00:00
'default' => __ ( 'Local Pickup' , 'woocommerce' ),
2013-08-12 21:09:04 +00:00
'desc_tip' => true ,
2012-05-26 16:25:07 +00:00
),
2012-11-27 11:25:21 +00:00
'codes' => array (
2013-08-12 21:09:04 +00:00
'title' => __ ( 'Zip/Post Codes' , 'woocommerce' ),
2012-11-27 11:25:21 +00:00
'type' => 'textarea' ,
2013-11-08 13:10:43 +00:00
'description' => __ ( 'What zip/post codes are available for local pickup? Separate codes with a comma. Accepts wildcards, e.g. P* will match a postcode of PE30.' , 'woocommerce' ),
2013-01-18 12:10:19 +00:00
'default' => '' ,
2013-08-12 21:09:04 +00:00
'desc_tip' => true ,
2013-01-18 12:10:19 +00:00
'placeholder' => '12345, 56789 etc'
2012-11-27 11:25:21 +00:00
),
2012-05-26 16:25:07 +00:00
'availability' => array (
2013-08-12 21:09:04 +00:00
'title' => __ ( 'Method availability' , 'woocommerce' ),
'type' => 'select' ,
'default' => 'all' ,
2012-10-01 09:45:07 +00:00
'class' => 'availability' ,
'options' => array (
2013-08-12 21:09:04 +00:00
'all' => __ ( 'All allowed countries' , 'woocommerce' ),
'specific' => __ ( 'Specific Countries' , 'woocommerce' )
2012-10-01 09:45:07 +00:00
)
),
2012-05-26 16:25:07 +00:00
'countries' => array (
2013-08-12 21:09:04 +00:00
'title' => __ ( 'Specific Countries' , 'woocommerce' ),
'type' => 'multiselect' ,
2012-10-01 09:45:07 +00:00
'class' => 'chosen_select' ,
'css' => 'width: 450px;' ,
2013-08-12 21:09:04 +00:00
'default' => '' ,
2013-11-25 14:01:32 +00:00
'options' => WC () -> countries -> get_shipping_countries (),
2013-10-11 14:27:04 +00:00
'custom_attributes' => array (
2013-10-11 14:30:10 +00:00
'data-placeholder' => __ ( 'Select some countries' , 'woocommerce' )
2013-10-11 14:27:04 +00:00
)
2013-09-03 15:26:02 +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 () {
2014-06-08 20:33:11 +00:00
?>
2012-05-26 16:25:07 +00:00
< h3 >< ? php echo $this -> method_title ; ?> </h3>
2012-10-16 09:45:33 +00:00
< p >< ? php _e ( 'Local pickup is a simple method which allows the customer to pick up their order themselves.' , 'woocommerce' ); ?> </p>
2012-05-26 16:25:07 +00:00
< table class = " form-table " >
2013-08-12 21:09:04 +00:00
< ? php $this -> generate_settings_html (); ?>
</ table > < ? php
2012-05-26 16:25:07 +00:00
}
2012-08-14 22:43:48 +00:00
/**
* is_available function .
*
* @ access public
* @ param array $package
* @ return bool
*/
2012-06-05 07:48:46 +00:00
function is_available ( $package ) {
2012-11-27 16:22:47 +00:00
2012-06-05 07:48:46 +00:00
$is_available = true ;
2012-11-27 16:22:47 +00:00
2013-08-12 21:09:04 +00:00
if ( $this -> enabled == " no " ) {
2012-11-27 16:22:47 +00:00
2013-08-12 21:09:04 +00:00
$is_available = false ;
2012-11-27 16:22:47 +00:00
2013-08-12 21:09:04 +00:00
} else {
2012-06-05 07:48:46 +00:00
2012-11-27 11:25:21 +00:00
// If post codes are listed, let's use them.
2014-04-07 14:46:40 +00:00
$codes = array ();
2012-11-27 11:25:21 +00:00
if ( $this -> codes != '' ) {
foreach ( explode ( ',' , $this -> codes ) as $code ) {
2014-04-07 14:46:40 +00:00
$codes [] = strtoupper ( trim ( $code ) );
2012-11-27 11:25:21 +00:00
}
2012-06-05 07:48:46 +00:00
}
2012-11-27 16:22:47 +00:00
2014-04-07 14:46:40 +00:00
if ( ! empty ( $codes ) ) {
2012-11-27 16:22:47 +00:00
2014-04-07 14:46:40 +00:00
$found_match = false ;
$postcode = $this -> clean ( $package [ 'destination' ][ 'postcode' ] );
$formatted_postcode = wc_format_postcode ( $postcode , $package [ 'destination' ][ 'country' ] );
2012-11-27 16:22:47 +00:00
2014-04-07 14:46:40 +00:00
if ( in_array ( $postcode , $codes ) || in_array ( $formatted_postcode , $codes ) ) {
2012-11-27 11:25:21 +00:00
$found_match = true ;
2014-04-07 14:46:40 +00:00
}
2012-11-27 16:22:47 +00:00
2012-11-27 11:25:21 +00:00
// Wildcard search
if ( ! $found_match ) {
2014-04-07 14:46:40 +00:00
$customer_postcode = $formatted_postcode ;
2012-11-27 11:25:21 +00:00
$customer_postcode_length = strlen ( $customer_postcode );
2012-11-27 16:22:47 +00:00
2012-11-27 11:25:21 +00:00
for ( $i = 0 ; $i <= $customer_postcode_length ; $i ++ ) {
2014-04-07 14:46:40 +00:00
if ( in_array ( $customer_postcode , $codes ) ) {
2012-11-27 11:25:21 +00:00
$found_match = true ;
2014-04-07 14:46:40 +00:00
break ;
}
2012-11-27 11:25:21 +00:00
$customer_postcode = substr ( $customer_postcode , 0 , - 2 ) . '*' ;
}
}
2012-11-27 16:22:47 +00:00
2012-11-27 11:25:21 +00:00
if ( ! $found_match ) {
2012-11-27 16:22:47 +00:00
2012-11-27 11:25:21 +00:00
$is_available = false ;
2012-11-27 16:22:47 +00:00
2012-11-27 11:25:21 +00:00
} else {
2012-11-27 16:22:47 +00:00
2014-04-07 14:46:40 +00:00
if ( $this -> availability === 'specific' ) {
2012-11-27 11:25:21 +00:00
$ship_to_countries = $this -> countries ;
2014-04-07 14:46:40 +00:00
} else {
2013-11-25 14:01:32 +00:00
$ship_to_countries = array_keys ( WC () -> countries -> get_shipping_countries () );
2014-04-07 14:46:40 +00:00
}
2012-11-27 16:22:47 +00:00
2012-11-27 11:25:21 +00:00
if ( is_array ( $ship_to_countries ) && ! in_array ( $package [ 'destination' ][ 'country' ], $ship_to_countries ) ) {
$is_available = false ;
}
2012-11-27 16:22:47 +00:00
2012-11-27 11:25:21 +00:00
}
2013-04-15 11:10:12 +00:00
} else {
2014-04-07 14:46:40 +00:00
if ( $this -> availability === 'specific' ) {
2013-04-15 11:10:12 +00:00
$ship_to_countries = $this -> countries ;
2014-04-07 14:46:40 +00:00
} else {
2013-11-25 14:01:32 +00:00
$ship_to_countries = array_keys ( WC () -> countries -> get_shipping_countries () );
2014-04-07 14:46:40 +00:00
}
2013-04-15 11:10:12 +00:00
if ( is_array ( $ship_to_countries ) && ! in_array ( $package [ 'destination' ][ 'country' ], $ship_to_countries ) ) {
$is_available = false ;
}
2012-06-05 07:48:46 +00:00
}
}
2012-06-05 08:13:25 +00:00
return apply_filters ( 'woocommerce_shipping_' . $this -> id . '_is_available' , $is_available , $package );
2012-06-05 07:48:46 +00:00
}
2012-11-27 16:22:47 +00:00
2013-08-12 21:09:04 +00:00
/**
* clean function .
*
* @ access public
* @ param mixed $code
* @ return string
*/
function clean ( $code ) {
return str_replace ( '-' , '' , sanitize_title ( $code ) ) . ( strstr ( $code , '*' ) ? '*' : '' );
}
2012-11-27 16:22:47 +00:00
2012-12-31 18:25:09 +00:00
}