2012-09-10 11:26:26 +00:00
< ? php
/**
* Tax Rates importer - import tax rates and local tax rates into WooCommerce .
*
* @ author WooThemes
* @ category Admin
* @ package WooCommerce / Admin / Importers
2012-12-03 19:19:58 +00:00
* @ version 2.0 . 0
2012-09-10 11:26:26 +00:00
*/
2012-11-27 16:22:47 +00:00
2012-10-15 10:32:24 +00:00
if ( ! defined ( 'ABSPATH' ) ) exit ; // Exit if accessed directly
2012-09-10 11:26:26 +00:00
if ( class_exists ( 'WP_Importer' ) ) {
2013-07-24 18:55:02 +00:00
class WC_Tax_Rate_Importer extends WP_Importer {
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
var $id ;
var $file_url ;
var $import_page ;
var $delimiter ;
var $posts = array ();
var $imported ;
var $skipped ;
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
/**
* __construct function .
2012-11-27 16:22:47 +00:00
*
2012-09-10 11:26:26 +00:00
* @ access public
* @ return void
*/
public function __construct () {
$this -> import_page = 'woocommerce_tax_rate_csv' ;
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
/**
* Registered callback function for the WordPress Importer
*
* Manages the three separate stages of the CSV import process
*/
function dispatch () {
$this -> header ();
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
if ( ! empty ( $_POST [ 'delimiter' ] ) )
$this -> delimiter = stripslashes ( trim ( $_POST [ 'delimiter' ] ) );
2012-11-27 16:22:47 +00:00
if ( ! $this -> delimiter )
2012-09-10 11:26:26 +00:00
$this -> delimiter = ',' ;
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
$step = empty ( $_GET [ 'step' ] ) ? 0 : ( int ) $_GET [ 'step' ];
switch ( $step ) {
case 0 :
$this -> greet ();
break ;
case 1 :
check_admin_referer ( 'import-upload' );
if ( $this -> handle_upload () ) {
if ( $this -> id )
$file = get_attached_file ( $this -> id );
else
$file = ABSPATH . $this -> file_url ;
2012-11-27 16:22:47 +00:00
2012-12-15 11:53:32 +00:00
add_filter ( 'http_request_timeout' , array ( $this , 'bump_request_timeout' ) );
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
if ( function_exists ( 'gc_enable' ) )
gc_enable ();
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
@ set_time_limit ( 0 );
@ ob_flush ();
@ flush ();
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
$this -> import ( $file );
}
break ;
}
$this -> footer ();
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
/**
* format_data_from_csv function .
2012-11-27 16:22:47 +00:00
*
2012-09-10 11:26:26 +00:00
* @ access public
* @ param mixed $data
2013-11-27 09:03:47 +00:00
* @ param string $enc
* @ return string
2012-09-10 11:26:26 +00:00
*/
function format_data_from_csv ( $data , $enc ) {
return ( $enc == 'UTF-8' ) ? $data : utf8_encode ( $data );
}
/**
* import function .
2012-11-27 16:22:47 +00:00
*
2012-09-10 11:26:26 +00:00
* @ access public
* @ param mixed $file
* @ return void
*/
function import ( $file ) {
global $woocommerce , $wpdb ;
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
$this -> imported = $this -> skipped = 0 ;
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
if ( ! is_file ( $file ) ) {
echo '<p><strong>' . __ ( 'Sorry, there has been an error.' , 'woocommerce' ) . '</strong><br />' ;
echo __ ( 'The file does not exist, please try again.' , 'woocommerce' ) . '</p>' ;
$this -> footer ();
die ();
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
$new_rates = array ();
2012-11-27 16:22:47 +00:00
2013-04-22 08:43:25 +00:00
ini_set ( 'auto_detect_line_endings' , '1' );
2012-09-10 11:26:26 +00:00
if ( ( $handle = fopen ( $file , " r " ) ) !== FALSE ) {
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
$header = fgetcsv ( $handle , 0 , $this -> delimiter );
2012-11-27 16:22:47 +00:00
2012-12-03 10:57:36 +00:00
if ( sizeof ( $header ) == 10 ) {
2012-11-27 16:22:47 +00:00
2012-12-03 10:57:36 +00:00
$loop = 0 ;
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
while ( ( $row = fgetcsv ( $handle , 0 , $this -> delimiter ) ) !== FALSE ) {
2012-11-27 16:22:47 +00:00
2012-12-03 10:57:36 +00:00
list ( $country , $state , $postcode , $city , $rate , $name , $priority , $compound , $shipping , $class ) = $row ;
$country = trim ( strtoupper ( $country ) );
$state = trim ( strtoupper ( $state ) );
if ( $country == '*' )
$country = '' ;
if ( $state == '*' )
$state = '' ;
2013-09-23 15:16:33 +00:00
if ( $class == 'standard' )
$class = '' ;
2012-12-03 10:57:36 +00:00
$wpdb -> insert (
$wpdb -> prefix . " woocommerce_tax_rates " ,
array (
'tax_rate_country' => $country ,
'tax_rate_state' => $state ,
2013-11-25 13:34:21 +00:00
'tax_rate' => wc_format_decimal ( $rate , 4 ),
2012-12-03 10:57:36 +00:00
'tax_rate_name' => trim ( $name ),
'tax_rate_priority' => absint ( $priority ),
'tax_rate_compound' => $compound ? 1 : 0 ,
'tax_rate_shipping' => $shipping ? 1 : 0 ,
'tax_rate_order' => $loop ,
'tax_rate_class' => sanitize_title ( $class )
)
);
$tax_rate_id = $wpdb -> insert_id ;
2013-11-25 13:34:21 +00:00
$postcode = wc_clean ( $postcode );
2012-12-03 10:57:36 +00:00
$postcodes = explode ( ';' , $postcode );
2013-11-25 13:34:21 +00:00
$postcodes = array_map ( 'strtoupper' , array_map ( 'wc_clean' , $postcodes ) );
2012-12-03 10:57:36 +00:00
foreach ( $postcodes as $postcode ) {
2012-12-28 19:37:56 +00:00
if ( ! empty ( $postcode ) && $postcode != '*' ) {
$wpdb -> insert (
$wpdb -> prefix . " woocommerce_tax_rate_locations " ,
array (
'location_code' => $postcode ,
'tax_rate_id' => $tax_rate_id ,
'location_type' => 'postcode' ,
)
);
}
2012-09-10 11:26:26 +00:00
}
2012-11-27 16:22:47 +00:00
2013-11-25 13:34:21 +00:00
$city = wc_clean ( $city );
2012-12-03 10:57:36 +00:00
$cities = explode ( ';' , $city );
2013-11-25 13:34:21 +00:00
$cities = array_map ( 'strtoupper' , array_map ( 'wc_clean' , $cities ) );
2012-12-03 10:57:36 +00:00
foreach ( $cities as $city ) {
2012-12-28 19:37:56 +00:00
if ( ! empty ( $city ) && $city != '*' ) {
$wpdb -> insert (
$wpdb -> prefix . " woocommerce_tax_rate_locations " ,
array (
'location_code' => $city ,
'tax_rate_id' => $tax_rate_id ,
'location_type' => 'city' ,
)
);
}
2012-09-10 11:26:26 +00:00
}
2012-11-27 16:22:47 +00:00
2012-12-03 10:57:36 +00:00
$loop ++ ;
2012-09-10 11:26:26 +00:00
$this -> imported ++ ;
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
} else {
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
echo '<p><strong>' . __ ( 'Sorry, there has been an error.' , 'woocommerce' ) . '</strong><br />' ;
echo __ ( 'The CSV is invalid.' , 'woocommerce' ) . '</p>' ;
$this -> footer ();
die ();
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
fclose ( $handle );
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
// Show Result
echo ' < div class = " updated settings-error below-h2 " >< p >
2012-10-16 09:45:33 +00:00
'.sprintf( __( ' Import complete - imported < strong >% s </ strong > tax rates and skipped < strong >% s </ strong >. ', ' woocommerce ' ), $this->imported, $this->skipped ).'
2012-09-10 11:26:26 +00:00
</ p ></ div > ' ;
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
$this -> import_end ();
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
/**
* Performs post - import cleanup of files and the cache
*/
function import_end () {
2013-10-22 16:26:18 +00:00
echo '<p>' . __ ( 'All done!' , 'woocommerce' ) . ' <a href="' . admin_url ( 'admin.php?page=wc-settings&tab=tax' ) . '">' . __ ( 'View Tax Rates' , 'woocommerce' ) . '</a>' . '</p>' ;
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
do_action ( 'import_end' );
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
/**
* Handles the CSV upload and initial parsing of the file to prepare for
* displaying author import options
*
* @ return bool False if error uploading or invalid file , true otherwise
*/
function handle_upload () {
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
if ( empty ( $_POST [ 'file_url' ] ) ) {
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
$file = wp_import_handle_upload ();
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
if ( isset ( $file [ 'error' ] ) ) {
echo '<p><strong>' . __ ( 'Sorry, there has been an error.' , 'woocommerce' ) . '</strong><br />' ;
echo esc_html ( $file [ 'error' ] ) . '</p>' ;
return false ;
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
$this -> id = ( int ) $file [ 'id' ];
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
} else {
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
if ( file_exists ( ABSPATH . $_POST [ 'file_url' ] ) ) {
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
$this -> file_url = esc_attr ( $_POST [ 'file_url' ] );
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
} else {
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
echo '<p><strong>' . __ ( 'Sorry, there has been an error.' , 'woocommerce' ) . '</strong></p>' ;
return false ;
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
return true ;
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
/**
* header function .
2012-11-27 16:22:47 +00:00
*
2012-09-10 11:26:26 +00:00
* @ access public
* @ return void
*/
function header () {
2012-12-03 16:39:46 +00:00
echo '<div class="wrap"><div class="icon32 icon32-woocommerce-importer" id="icon-woocommerce"><br></div>' ;
2012-09-10 11:26:26 +00:00
echo '<h2>' . __ ( 'Import Tax Rates' , 'woocommerce' ) . '</h2>' ;
}
/**
* footer function .
2012-11-27 16:22:47 +00:00
*
2012-09-10 11:26:26 +00:00
* @ access public
* @ return void
*/
function footer () {
echo '</div>' ;
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
/**
* greet function .
2012-11-27 16:22:47 +00:00
*
2012-09-10 11:26:26 +00:00
* @ access public
* @ return void
*/
function greet () {
2013-11-25 14:01:32 +00:00
2012-09-10 11:26:26 +00:00
echo '<div class="narrow">' ;
echo '<p>' . __ ( 'Hi there! Upload a CSV file containing tax rates to import the contents into your shop. Choose a .csv file to upload, then click "Upload file and import".' , 'woocommerce' ) . '</p>' ;
2012-11-27 16:22:47 +00:00
2013-12-03 13:45:10 +00:00
echo '<p>' . sprintf ( __ ( 'Tax rates need to be defined with columns in a specific order (10 columns). <a href="%s">Click here to download a sample</a>.' , 'woocommerce' ), WC () -> plugin_url () . '/dummy-data/sample_tax_rates.csv' ) . '</p>' ;
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
$action = 'admin.php?import=woocommerce_tax_rate_csv&step=1' ;
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
$bytes = apply_filters ( 'import_upload_size_limit' , wp_max_upload_size () );
2013-05-14 09:33:19 +00:00
$size = size_format ( $bytes );
2012-09-10 11:26:26 +00:00
$upload_dir = wp_upload_dir ();
if ( ! empty ( $upload_dir [ 'error' ] ) ) :
?> <div class="error"><p><?php _e('Before you can upload your import file, you will need to fix the following error:'); ?></p>
< p >< strong >< ? php echo $upload_dir [ 'error' ]; ?> </strong></p></div><?php
else :
?>
< form enctype = " multipart/form-data " id = " import-upload-form " method = " post " action = " <?php echo esc_attr(wp_nonce_url( $action , 'import-upload')); ?> " >
< table class = " form-table " >
< tbody >
< tr >
< th >
< label for = " upload " >< ? php _e ( 'Choose a file from your computer:' ); ?> </label>
</ th >
< td >
< input type = " file " id = " upload " name = " import " size = " 25 " />
< input type = " hidden " name = " action " value = " save " />
< input type = " hidden " name = " max_file_size " value = " <?php echo $bytes ; ?> " />
< small >< ? php printf ( __ ( 'Maximum size: %s' ), $size ); ?> </small>
</ td >
</ tr >
< tr >
< th >
< label for = " file_url " >< ? php _e ( 'OR enter path to file:' , 'woocommerce' ); ?> </label>
</ th >
< td >
< ? php echo ' ' . ABSPATH . ' ' ; ?> <input type="text" id="file_url" name="file_url" size="25" />
</ td >
</ tr >
< tr >
< th >< label >< ? php _e ( 'Delimiter' , 'woocommerce' ); ?> </label><br/></th>
< td >< input type = " text " name = " delimiter " placeholder = " , " size = " 2 " /></ td >
</ tr >
</ tbody >
</ table >
< p class = " submit " >
< input type = " submit " class = " button " value = " <?php esc_attr_e( 'Upload file and import' ); ?> " />
</ p >
</ form >
< ? php
endif ;
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
echo '</div>' ;
}
2012-11-27 16:22:47 +00:00
2012-09-10 11:26:26 +00:00
/**
* Added to http_request_timeout filter to force timeout at 60 seconds during import
2013-10-01 09:04:07 +00:00
* @ param int $val
2012-09-10 11:26:26 +00:00
* @ return int 60
*/
2013-10-01 09:04:07 +00:00
function bump_request_timeout ( $val ) {
2012-09-10 11:26:26 +00:00
return 60 ;
}
}
2013-05-14 09:33:19 +00:00
}