2012-05-26 16:25:07 +00:00
< ? php
2014-09-20 19:44:32 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
2015-12-16 16:09:52 +00:00
exit ;
2014-09-20 19:44:32 +00:00
}
2013-02-20 17:14:46 +00:00
2012-05-26 16:25:07 +00:00
/**
2015-11-03 13:31:20 +00:00
* Local Pickup Shipping Method .
2012-08-14 22:43:48 +00:00
*
2015-11-03 13:31:20 +00:00
* A simple shipping method allowing free pickup as a shipping method .
2012-05-26 16:25:07 +00:00
*
2012-12-31 18:25:09 +00:00
* @ class WC_Shipping_Local_Pickup
2015-12-16 16:09:52 +00:00
* @ version 2.6 . 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
/**
2015-11-03 13:31:20 +00:00
* Constructor .
2012-08-14 22:43:48 +00:00
*/
2015-12-16 16:09:52 +00:00
public function __construct ( $instance_id = 0 ) {
$this -> id = 'local_pickup' ;
$this -> instance_id = absint ( $instance_id );
$this -> method_title = __ ( 'Local Pickup' , 'woocommerce' );
$this -> method_description = __ ( 'Allow customers to pick up orders themselves. By default, when using local pickup store base taxes will apply regardless of customer address.' , 'woocommerce' );
$this -> supports = array (
'shipping-zones' ,
2016-03-24 18:31:39 +00:00
'instance-settings' ,
'instance-settings-modal' ,
2015-12-16 16:09:52 +00:00
);
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
/**
2016-01-06 19:15:45 +00:00
* Initialize local pickup .
2013-08-12 21:09:04 +00:00
*/
2014-11-11 15:46:54 +00:00
public 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 -> 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 .
2016-01-06 19:15:45 +00:00
* Calculate local pickup shipping .
2012-08-14 22:43:48 +00:00
*/
2015-12-18 17:10:58 +00:00
public function calculate_shipping ( $package = array () ) {
2015-12-16 16:09:52 +00:00
$this -> add_rate ( array (
'id' => $this -> id . $this -> instance_id ,
2012-05-26 16:25:07 +00:00
'label' => $this -> title ,
2015-12-16 16:09:52 +00:00
) );
2012-05-26 16:25:07 +00:00
}
2012-08-14 22:43:48 +00:00
/**
2016-01-06 19:15:45 +00:00
* Init form fields .
2012-08-14 22:43:48 +00:00
*/
2014-11-11 15:46:54 +00:00
public function init_form_fields () {
2015-12-16 16:09:52 +00:00
$this -> instance_form_fields = array (
2012-05-26 16:25:07 +00:00
'title' => array (
2014-11-11 15:46:54 +00:00
'title' => __ ( 'Title' , 'woocommerce' ),
'type' => 'text' ,
'description' => __ ( 'This controls the title which the user sees during checkout.' , 'woocommerce' ),
'default' => __ ( 'Local Pickup' , 'woocommerce' ),
'desc_tip' => true ,
2013-09-03 15:26:02 +00:00
)
2012-05-26 16:25:07 +00:00
);
}
2012-08-14 22:43:48 +00:00
/**
2015-11-03 13:31:20 +00:00
* Get postcodes for this method .
2014-11-11 15:46:54 +00:00
* @ return array
2012-08-14 22:43:48 +00:00
*/
2014-11-11 15:46:54 +00:00
public function get_valid_postcodes () {
$codes = array ();
if ( $this -> codes != '' ) {
foreach ( explode ( ',' , $this -> codes ) as $code ) {
$codes [] = strtoupper ( trim ( $code ) );
}
}
return $codes ;
2012-05-26 16:25:07 +00:00
}
2012-08-14 22:43:48 +00:00
/**
2015-11-03 13:31:20 +00:00
* See if a given postcode matches valid postcodes .
2014-11-11 15:46:54 +00:00
* @ param string postcode
* @ param string country code
* @ return boolean
2012-08-14 22:43:48 +00:00
*/
2014-11-11 15:46:54 +00:00
public function is_valid_postcode ( $postcode , $country ) {
$codes = $this -> get_valid_postcodes ();
$postcode = $this -> clean ( $postcode );
$formatted_postcode = wc_format_postcode ( $postcode , $country );
2012-11-27 16:22:47 +00:00
2014-11-11 15:46:54 +00:00
if ( in_array ( $postcode , $codes ) || in_array ( $formatted_postcode , $codes ) ) {
return true ;
}
2014-04-07 14:46:40 +00:00
2014-11-11 15:46:54 +00:00
// Pattern matching
foreach ( $codes as $c ) {
2015-02-12 10:53:53 +00:00
$pattern = '/^' . str_replace ( '_' , '[0-9a-zA-Z]' , preg_quote ( $c ) ) . '$/i' ;
2014-11-11 15:46:54 +00:00
if ( preg_match ( $pattern , $postcode ) ) {
return true ;
2012-06-05 07:48:46 +00:00
}
2014-11-11 15:46:54 +00:00
}
2012-11-27 16:22:47 +00:00
2014-11-11 15:46:54 +00:00
// Wildcard search
$wildcard_postcode = $formatted_postcode . '*' ;
$postcode_length = strlen ( $formatted_postcode );
2012-11-27 16:22:47 +00:00
2014-11-11 15:46:54 +00:00
for ( $i = 0 ; $i < $postcode_length ; $i ++ ) {
if ( in_array ( $wildcard_postcode , $codes ) ) {
return true ;
}
$wildcard_postcode = substr ( $wildcard_postcode , 0 , - 2 ) . '*' ;
}
2012-11-27 16:22:47 +00:00
2014-11-11 15:46:54 +00:00
return false ;
}
2012-11-27 16:22:47 +00:00
2014-11-11 15:46:54 +00:00
/**
* See if the method is available .
*
* @ param array $package
* @ return bool
*/
public function is_available ( $package ) {
2016-03-15 17:23:06 +00:00
$is_available = true ;
2012-11-27 16:22:47 +00:00
2014-11-11 15:46:54 +00:00
if ( $is_available && $this -> get_valid_postcodes () ) {
$is_available = $this -> is_valid_postcode ( $package [ 'destination' ][ 'postcode' ], $package [ 'destination' ][ 'country' ] );
}
2012-11-27 16:22:47 +00:00
2015-02-11 18:02:44 +00:00
if ( $is_available ) {
2014-11-11 15:46:54 +00:00
if ( $this -> availability === 'specific' ) {
$ship_to_countries = $this -> countries ;
2013-04-15 11:10:12 +00:00
} else {
2014-11-11 15:46:54 +00:00
$ship_to_countries = array_keys ( WC () -> countries -> get_shipping_countries () );
}
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
/**
2016-01-06 19:15:45 +00:00
* Clean code string .
2013-08-12 21:09:04 +00:00
*
* @ access public
* @ param mixed $code
* @ return string
*/
2014-11-11 15:46:54 +00:00
public function clean ( $code ) {
2013-08-12 21:09:04 +00:00
return str_replace ( '-' , '' , sanitize_title ( $code ) ) . ( strstr ( $code , '*' ) ? '*' : '' );
}
2014-09-20 19:44:32 +00:00
}