2012-09-10 11:26:26 +00:00
< ? php
2017-11-06 13:05:13 +00:00
/**
* Tax importer class file
*
* @ version 2.3 . 0
* @ category Admin
* @ package WooCommerce / Admin
* @ author WooCommerce
*/
2014-11-20 18:41:51 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
exit ;
}
if ( ! class_exists ( 'WP_Importer' ) ) {
return ;
}
2012-09-10 11:26:26 +00:00
/**
* Tax Rates importer - import tax rates and local tax rates into WooCommerce .
*
2014-08-31 07:17:58 +00:00
* @ author WooThemes
* @ category Admin
* @ package WooCommerce / Admin / Importers
2014-11-20 18:41:51 +00:00
* @ version 2.3 . 0
2012-09-10 11:26:26 +00:00
*/
2014-11-20 18:41:51 +00:00
class WC_Tax_Rate_Importer extends WP_Importer {
2016-01-04 16:07:23 +00:00
/**
* The current file id .
*
* @ var int
*/
2014-11-20 18:41:51 +00:00
public $id ;
2016-01-04 16:07:23 +00:00
/**
* The current file url .
*
* @ var string
*/
2014-11-20 18:41:51 +00:00
public $file_url ;
2016-01-04 16:07:23 +00:00
/**
* The current import page .
*
* @ var string
*/
2014-11-20 18:41:51 +00:00
public $import_page ;
2016-01-04 16:07:23 +00:00
/**
* The current delimiter .
*
* @ var string
*/
2014-11-20 18:41:51 +00:00
public $delimiter ;
/**
2015-11-03 12:28:01 +00:00
* Constructor .
2014-11-20 18:41:51 +00:00
*/
public function __construct () {
$this -> import_page = 'woocommerce_tax_rate_csv' ;
2017-11-06 13:05:13 +00:00
// @codingStandardsIgnoreLine
2016-06-07 10:22:36 +00:00
$this -> delimiter = empty ( $_POST [ 'delimiter' ] ) ? ',' : ( string ) wc_clean ( $_POST [ 'delimiter' ] );
2014-11-20 18:41:51 +00:00
}
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
/**
2015-11-03 12:28:01 +00:00
* Registered callback function for the WordPress Importer .
2014-11-20 18:41:51 +00:00
*
2015-11-03 12:28:01 +00:00
* Manages the three separate stages of the CSV import process .
2014-11-20 18:41:51 +00:00
*/
public function dispatch () {
2014-08-31 07:17:58 +00:00
2014-11-20 18:41:51 +00:00
$this -> header ();
2014-08-31 07:17:58 +00:00
2014-11-20 18:41:51 +00:00
$step = empty ( $_GET [ 'step' ] ) ? 0 : ( int ) $_GET [ 'step' ];
2012-09-10 11:26:26 +00:00
2014-11-20 18:41:51 +00:00
switch ( $step ) {
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
case 0 :
$this -> greet ();
break ;
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
case 1 :
check_admin_referer ( 'import-upload' );
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
if ( $this -> handle_upload () ) {
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
if ( $this -> id ) {
$file = get_attached_file ( $this -> id );
} else {
$file = ABSPATH . $this -> file_url ;
2012-09-10 11:26:26 +00:00
}
2014-08-31 07:17:58 +00:00
2014-11-20 18:41:51 +00:00
add_filter ( 'http_request_timeout' , array ( $this , 'bump_request_timeout' ) );
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
$this -> import ( $file );
}
break ;
2012-09-10 11:26:26 +00:00
}
2014-11-20 18:41:51 +00:00
$this -> footer ();
}
2012-12-03 10:57:36 +00:00
2014-11-20 18:41:51 +00:00
/**
2015-11-03 12:28:01 +00:00
* Import is starting .
2014-11-20 18:41:51 +00:00
*/
private function import_start () {
if ( function_exists ( 'gc_enable' ) ) {
gc_enable ();
}
2016-06-06 15:55:27 +00:00
wc_set_time_limit ( 0 );
2014-11-20 18:41:51 +00:00
@ ob_flush ();
@ flush ();
@ ini_set ( 'auto_detect_line_endings' , '1' );
}
2012-12-03 10:57:36 +00:00
2014-11-20 18:41:51 +00:00
/**
2016-01-04 16:07:23 +00:00
* UTF - 8 encode the data if `$enc` value isn ' t UTF - 8.
2014-11-20 18:41:51 +00:00
*
2017-11-06 13:05:13 +00:00
* @ param mixed $data Data .
* @ param string $enc Encoding .
2014-11-20 18:41:51 +00:00
* @ return string
*/
public function format_data_from_csv ( $data , $enc ) {
2016-09-09 00:14:28 +00:00
return ( 'UTF-8' === $enc ) ? $data : utf8_encode ( $data );
2014-11-20 18:41:51 +00:00
}
2012-12-03 10:57:36 +00:00
2014-11-20 18:41:51 +00:00
/**
2016-01-04 16:07:23 +00:00
* Import the file if it exists and is valid .
2014-11-20 18:41:51 +00:00
*
2017-11-06 13:05:13 +00:00
* @ param mixed $file File .
2014-11-20 18:41:51 +00:00
*/
public function import ( $file ) {
if ( ! is_file ( $file ) ) {
$this -> import_error ( __ ( 'The file does not exist, please try again.' , 'woocommerce' ) );
}
2014-08-31 07:17:58 +00:00
2014-11-20 18:41:51 +00:00
$this -> import_start ();
2012-11-27 16:22:47 +00:00
2015-01-15 15:29:14 +00:00
$loop = 0 ;
2017-11-06 13:05:13 +00:00
if ( ( $handle = fopen ( $file , 'r' ) ) !== false ) {
2014-10-10 14:18:47 +00:00
2014-11-20 18:41:51 +00:00
$header = fgetcsv ( $handle , 0 , $this -> delimiter );
2014-11-20 17:08:17 +00:00
2017-11-06 13:05:13 +00:00
if ( 10 === count ( $header ) ) {
2014-11-20 17:08:17 +00:00
2015-02-18 17:34:03 +00:00
while ( ( $row = fgetcsv ( $handle , 0 , $this -> delimiter ) ) !== false ) {
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
list ( $country , $state , $postcode , $city , $rate , $name , $priority , $compound , $shipping , $class ) = $row ;
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
$tax_rate = array (
'tax_rate_country' => $country ,
'tax_rate_state' => $state ,
'tax_rate' => $rate ,
'tax_rate_name' => $name ,
'tax_rate_priority' => $priority ,
'tax_rate_compound' => $compound ? 1 : 0 ,
'tax_rate_shipping' => $shipping ? 1 : 0 ,
'tax_rate_order' => $loop ++ ,
2016-08-27 01:46:45 +00:00
'tax_rate_class' => $class ,
2014-11-20 18:41:51 +00:00
);
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
$tax_rate_id = WC_Tax :: _insert_tax_rate ( $tax_rate );
WC_Tax :: _update_tax_rate_postcodes ( $tax_rate_id , wc_clean ( $postcode ) );
WC_Tax :: _update_tax_rate_cities ( $tax_rate_id , wc_clean ( $city ) );
2012-09-10 11:26:26 +00:00
}
2014-11-20 18:41:51 +00:00
} else {
$this -> import_error ( __ ( 'The CSV is invalid.' , 'woocommerce' ) );
2012-09-10 11:26:26 +00:00
}
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
fclose ( $handle );
2012-09-10 11:26:26 +00:00
}
2012-11-27 16:22:47 +00:00
2017-11-06 13:05:13 +00:00
// Show Result.
2016-10-29 10:16:03 +00:00
echo '<div class="updated settings-error"><p>' ;
/* translators: %s: tax rates count */
printf (
2017-11-06 13:05:13 +00:00
esc_html__ ( 'Import complete - imported %s tax rates.' , 'woocommerce' ),
'<strong>' . absint ( $loop ) . '</strong>'
2016-10-29 10:16:03 +00:00
);
echo '</p></div>' ;
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
$this -> import_end ();
}
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
/**
2015-11-03 12:28:01 +00:00
* Performs post - import cleanup of files and the cache .
2014-11-20 18:41:51 +00:00
*/
public function import_end () {
2017-11-06 13:05:13 +00:00
echo '<p>' . esc_html__ ( 'All done!' , 'woocommerce' ) . ' <a href="' . esc_url ( admin_url ( 'admin.php?page=wc-settings&tab=tax' ) ) . '">' . esc_html__ ( 'View tax rates' , 'woocommerce' ) . '</a></p>' ;
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
do_action ( 'import_end' );
}
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
/**
2015-11-03 12:28:01 +00:00
* Handles the CSV upload and initial parsing of the file to prepare for .
* displaying author import options .
2014-11-20 18:41:51 +00:00
*
* @ return bool False if error uploading or invalid file , true otherwise
*/
public function handle_upload () {
2017-11-06 13:05:13 +00:00
// @codingStandardsIgnoreLine
2014-11-20 18:41:51 +00:00
if ( empty ( $_POST [ 'file_url' ] ) ) {
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
$file = wp_import_handle_upload ();
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
if ( isset ( $file [ 'error' ] ) ) {
$this -> import_error ( $file [ 'error' ] );
}
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
$this -> id = absint ( $file [ 'id' ] );
2017-11-06 13:05:13 +00:00
// @codingStandardsIgnoreLine
2014-11-20 18:41:51 +00:00
} elseif ( file_exists ( ABSPATH . $_POST [ 'file_url' ] ) ) {
2017-11-06 13:05:13 +00:00
// @codingStandardsIgnoreLine
2014-11-20 18:41:51 +00:00
$this -> file_url = esc_attr ( $_POST [ 'file_url' ] );
} else {
$this -> import_error ();
}
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
return true ;
}
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
/**
2016-01-04 16:07:23 +00:00
* Output header html .
2014-11-20 18:41:51 +00:00
*/
public function header () {
2016-10-12 13:57:24 +00:00
echo '<div class="wrap">' ;
2017-11-06 13:05:13 +00:00
echo '<h1>' . esc_html__ ( 'Import tax rates' , 'woocommerce' ) . '</h1>' ;
2014-11-20 18:41:51 +00:00
}
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
/**
2016-01-04 16:07:23 +00:00
* Output footer html .
2014-11-20 18:41:51 +00:00
*/
public function footer () {
echo '</div>' ;
}
2012-09-10 11:26:26 +00:00
2014-11-20 18:41:51 +00:00
/**
2016-01-04 16:07:23 +00:00
* Output information about the uploading process .
2014-11-20 18:41:51 +00:00
*/
public function greet () {
echo '<div class="narrow">' ;
2017-11-06 13:05:13 +00:00
echo '<p>' . esc_html__ ( '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>' ;
2014-11-20 18:41:51 +00:00
2017-11-06 13:05:13 +00:00
echo '<p>' . sprintf ( esc_html__ ( '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' ), esc_url ( WC () -> plugin_url () ) . '/dummy-data/sample_tax_rates.csv' ) . '</p>' ;
2014-11-20 18:41:51 +00:00
$action = 'admin.php?import=woocommerce_tax_rate_csv&step=1' ;
$bytes = apply_filters ( 'import_upload_size_limit' , wp_max_upload_size () );
$size = size_format ( $bytes );
$upload_dir = wp_upload_dir ();
if ( ! empty ( $upload_dir [ 'error' ] ) ) :
2017-11-06 13:05:13 +00:00
?> <div class="error"><p><?php esc_html_e( 'Before you can upload your import file, you will need to fix the following error:', 'woocommerce' ); ?></p>
< p >< strong >< ? php echo esc_html ( $upload_dir [ 'error' ] ); ?> </strong></p></div><?php
2014-11-20 18:41:51 +00:00
else :
?>
2016-09-02 01:51:31 +00:00
< form enctype = " multipart/form-data " id = " import-upload-form " method = " post " action = " <?php echo esc_attr( wp_nonce_url( $action , 'import-upload' ) ); ?> " >
2014-11-20 18:41:51 +00:00
< table class = " form-table " >
< tbody >
< tr >
< th >
2017-11-06 13:05:13 +00:00
< label for = " upload " >< ? php esc_html_e ( 'Choose a file from your computer:' , 'woocommerce' ); ?> </label>
2014-11-20 18:41:51 +00:00
</ th >
< td >
< input type = " file " id = " upload " name = " import " size = " 25 " />
< input type = " hidden " name = " action " value = " save " />
2017-11-06 13:05:13 +00:00
< input type = " hidden " name = " max_file_size " value = " <?php echo absint( $bytes ); ?> " />
< small >
< ? php
2016-10-29 10:16:03 +00:00
/* translators: %s: maximum upload size */
printf (
2017-11-06 13:05:13 +00:00
esc_html__ ( 'Maximum size: %s' , 'woocommerce' ),
esc_attr ( $size )
2016-10-29 10:16:03 +00:00
);
2017-11-06 13:05:13 +00:00
?>
</ small >
2014-11-20 18:41:51 +00:00
</ td >
</ tr >
< tr >
< th >
2017-11-06 13:05:13 +00:00
< label for = " file_url " >< ? php esc_html_e ( 'OR enter path to file:' , 'woocommerce' ); ?> </label>
2014-11-20 18:41:51 +00:00
</ th >
< td >
2017-11-06 13:05:13 +00:00
< ? php echo ' ' . esc_html ( ABSPATH ) . ' ' ; ?> <input type="text" id="file_url" name="file_url" size="25" />
2014-11-20 18:41:51 +00:00
</ td >
</ tr >
< tr >
2017-11-06 13:05:13 +00:00
< th >< label >< ? php esc_html_e ( 'Delimiter' , 'woocommerce' ); ?> </label><br/></th>
2014-11-20 18:41:51 +00:00
< td >< input type = " text " name = " delimiter " placeholder = " , " size = " 2 " /></ td >
</ tr >
</ tbody >
</ table >
< p class = " submit " >
2017-11-06 13:06:15 +00:00
< button type = " submit " class = " button " value = " <?php esc_attr_e( 'Upload file and import', 'woocommerce' ); ?> " >< ? php esc_html_e ( 'Upload file and import' , 'woocommerce' ); ?> </button>
2014-11-20 18:41:51 +00:00
</ p >
</ form >
< ? php
endif ;
echo '</div>' ;
}
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
/**
2015-11-03 12:28:01 +00:00
* Show import error and quit .
2017-11-06 13:05:13 +00:00
*
* @ param string $message Error messag .
2014-11-20 18:41:51 +00:00
*/
private function import_error ( $message = '' ) {
2017-11-06 13:05:13 +00:00
echo '<p><strong>' . esc_html__ ( 'Sorry, there has been an error.' , 'woocommerce' ) . '</strong><br />' ;
2014-11-20 18:41:51 +00:00
if ( $message ) {
echo esc_html ( $message );
2012-09-10 11:26:26 +00:00
}
2014-11-20 18:41:51 +00:00
echo '</p>' ;
$this -> footer ();
die ();
}
2012-11-27 16:22:47 +00:00
2014-11-20 18:41:51 +00:00
/**
2015-11-03 12:28:01 +00:00
* Added to http_request_timeout filter to force timeout at 60 seconds during import .
2014-11-20 18:41:51 +00:00
*
2017-11-06 13:05:13 +00:00
* @ param int $val Value .
2014-11-20 18:41:51 +00:00
* @ return int 60
*/
public function bump_request_timeout ( $val ) {
return 60 ;
2012-09-10 11:26:26 +00:00
}
2013-05-14 09:33:19 +00:00
}