2013-07-26 14:36:28 +00:00
< ? php
/**
* WooCommerce Tax Settings
*
2014-08-31 08:22:03 +00:00
* @ author WooThemes
* @ category Admin
* @ package WooCommerce / Admin
2013-07-26 14:36:28 +00:00
* @ version 2.1 . 0
*/
2014-09-20 19:55:47 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
2014-11-20 14:46:19 +00:00
exit ;
2014-09-20 19:55:47 +00:00
}
2013-07-26 14:36:28 +00:00
if ( ! class_exists ( 'WC_Settings_Tax' ) ) :
/**
* WC_Settings_Tax
*/
class WC_Settings_Tax extends WC_Settings_Page {
2014-11-20 14:46:19 +00:00
protected $id = 'tax' ;
2013-07-26 14:36:28 +00:00
/**
* Constructor .
*/
public function __construct () {
$this -> label = __ ( 'Tax' , 'woocommerce' );
2014-11-20 14:46:19 +00:00
parent :: __construct ();
2013-07-26 14:36:28 +00:00
}
/**
* Get sections
*
* @ return array
*/
public function get_sections () {
$sections = array (
'' => __ ( 'Tax Options' , 'woocommerce' ),
'standard' => __ ( 'Standard Rates' , 'woocommerce' )
);
// Get tax classes and display as links
2014-11-21 13:06:30 +00:00
$tax_classes = WC_Tax :: get_tax_classes ();
2013-07-26 14:36:28 +00:00
2014-11-20 14:46:19 +00:00
foreach ( $tax_classes as $class ) {
$sections [ sanitize_title ( $class ) ] = sprintf ( __ ( '%s Rates' , 'woocommerce' ), $class );
2014-08-31 08:22:03 +00:00
}
2013-07-26 14:36:28 +00:00
2014-02-17 14:30:37 +00:00
return apply_filters ( 'woocommerce_get_sections_' . $this -> id , $sections );
2013-07-26 14:36:28 +00:00
}
/**
* Get settings array
*
* @ return array
*/
public function get_settings () {
2014-11-21 13:06:30 +00:00
$tax_classes = WC_Tax :: get_tax_classes ();
2013-07-26 14:36:28 +00:00
$classes_options = array ();
2014-11-20 14:46:19 +00:00
foreach ( $tax_classes as $class ) {
$classes_options [ sanitize_title ( $class ) ] = esc_html ( $class );
}
2014-09-12 11:20:06 +00:00
2015-01-08 18:34:30 +00:00
return apply_filters ( 'woocommerce_get_settings_' . $this -> id , include ( 'views/settings-tax.php' ) );
2013-07-26 14:36:28 +00:00
}
/**
* Output the settings
*/
public function output () {
global $current_section ;
2014-11-21 13:06:30 +00:00
$tax_classes = WC_Tax :: get_tax_classes ();
2013-07-26 14:36:28 +00:00
if ( $current_section == 'standard' || in_array ( $current_section , array_map ( 'sanitize_title' , $tax_classes ) ) ) {
2014-08-31 08:22:03 +00:00
$this -> output_tax_rates ();
} else {
2013-07-26 14:36:28 +00:00
$settings = $this -> get_settings ();
WC_Admin_Settings :: output_fields ( $settings );
}
}
/**
* Save settings
*/
public function save () {
2014-01-20 16:00:15 +00:00
global $current_section , $wpdb ;
2013-07-26 14:36:28 +00:00
if ( ! $current_section ) {
$settings = $this -> get_settings ();
WC_Admin_Settings :: save_fields ( $settings );
2014-11-20 15:46:07 +00:00
} elseif ( ! empty ( $_POST [ 'tax_rate_country' ] ) ) {
2013-07-26 14:36:28 +00:00
$this -> save_tax_rates ();
}
2014-01-20 16:00:15 +00:00
$wpdb -> query ( " DELETE FROM ` $wpdb->options ` WHERE `option_name` LIKE ('_transient_wc_tax_rates_%') OR `option_name` LIKE ('_transient_timeout_wc_tax_rates_%') " );
2013-07-26 14:36:28 +00:00
}
/**
* Output tax rate tables
*/
public function output_tax_rates () {
2015-08-12 18:18:49 +00:00
global $wpdb ,
$current_section ;
2013-07-26 14:36:28 +00:00
2014-11-20 00:51:01 +00:00
$current_class = $this -> get_current_tax_class ();
2013-07-26 14:36:28 +00:00
2015-08-07 21:28:44 +00:00
// Get all the rates and locations. Snagging all at once should significantly cut down on the number of queries.
$rates = $wpdb -> get_results ( $wpdb -> prepare ( " SELECT * FROM ` { $wpdb -> prefix } woocommerce_tax_rates` WHERE `tax_rate_class` = %s ORDER BY `tax_rate_order`; " , sanitize_title ( $current_class ) ) );
$locations = $wpdb -> get_results ( " SELECT * FROM ` { $wpdb -> prefix } woocommerce_tax_rate_locations` " );
// Set the rates keys equal to their ids.
$rates = array_combine ( wp_list_pluck ( $rates , 'tax_rate_id' ), $rates );
// Drop the locations into the rates array.
foreach ( $locations as $location ) {
// Don't set them for unexistent rates.
if ( ! isset ( $rates [ $location -> tax_rate_id ] ) ) {
continue ;
}
// If the rate exists, initialize the array before appending to it.
if ( ! isset ( $rates [ $location -> tax_rate_id ] -> { $location -> location_type } ) ) {
$rates [ $location -> tax_rate_id ] -> { $location -> location_type } = array ();
}
$rates [ $location -> tax_rate_id ] -> { $location -> location_type }[] = $location -> location_code ;
}
$countries = array ();
foreach ( WC () -> countries -> get_allowed_countries () as $value => $label ) {
$countries [] = array (
'label' => $label ,
'value' => $value ,
);
}
$states = array ();
foreach ( WC () -> countries -> get_allowed_country_states () as $label ) {
foreach ( $label as $code => $state ) {
$states [] = array (
'label' => $state ,
'value' => $code ,
);
}
}
2015-08-12 18:18:49 +00:00
$base_url = admin_url ( add_query_arg ( array (
'page' => 'wc-settings' ,
'tab' => 'tax' ,
'section' => $current_section ,
), 'admin.php' ) );
2015-08-07 21:28:44 +00:00
// Localize and enqueue our js.
wp_localize_script ( 'wc-settings-tax' , 'htmlSettingsTaxLocalizeScript' , array (
'current_class' => $current_class ,
2015-08-12 18:18:49 +00:00
'base_url' => $base_url ,
2015-08-12 21:17:39 +00:00
'rates' => array_values ( $rates ),
2015-08-07 21:28:44 +00:00
'page' => ! empty ( $_GET [ 'p' ] ) ? absint ( $_GET [ 'p' ] ) : 1 ,
'limit' => 100 ,
'countries' => $countries ,
'states' => $states ,
'strings' => array (
'no_rows_selected' => __ ( 'No row(s) selected' , 'woocommerce' ),
2015-08-10 14:29:11 +00:00
'unload_confirmation_msg' => __ ( 'Your changed data will be lost if you leave this page without saving.' , 'woocommerce' ),
2015-08-07 21:28:44 +00:00
'csv_data_cols' => array (
__ ( 'Country Code' , 'woocommerce' ),
__ ( 'State Code' , 'woocommerce' ),
__ ( 'ZIP/Postcode' , 'woocommerce' ),
__ ( 'City' , 'woocommerce' ),
__ ( 'Rate %' , 'woocommerce' ),
__ ( 'Tax Name' , 'woocommerce' ),
__ ( 'Priority' , 'woocommerce' ),
__ ( 'Compound' , 'woocommerce' ),
__ ( 'Shipping' , 'woocommerce' ),
__ ( 'Tax Class' , 'woocommerce' ),
),
),
) );
wp_enqueue_script ( 'wc-settings-tax' );
2015-01-08 18:34:30 +00:00
include ( 'views/html-settings-tax.php' );
2014-11-20 14:46:19 +00:00
}
2013-07-26 14:36:28 +00:00
/**
2014-11-20 00:51:01 +00:00
* Get tax class being edited
* @ return string
2013-07-26 14:36:28 +00:00
*/
2014-11-20 00:51:01 +00:00
private function get_current_tax_class () {
global $current_section ;
2013-07-26 14:36:28 +00:00
2014-11-21 13:06:30 +00:00
$tax_classes = WC_Tax :: get_tax_classes ();
2013-07-26 14:36:28 +00:00
$current_class = '' ;
2014-08-31 08:22:03 +00:00
foreach ( $tax_classes as $class ) {
if ( sanitize_title ( $class ) == $current_section ) {
2013-07-26 14:36:28 +00:00
$current_class = $class ;
2014-08-31 08:22:03 +00:00
}
}
2013-07-26 14:36:28 +00:00
2014-11-20 00:51:01 +00:00
return $current_class ;
}
2013-07-26 14:36:28 +00:00
2014-11-20 00:51:01 +00:00
/**
2014-11-20 11:11:04 +00:00
* Get a posted tax rate
* @ param string $key Key of tax rate in the post data array
* @ param int $order Position / order of rate
* @ param string $class Tax class for rate
* @ return array
2014-11-20 00:51:01 +00:00
*/
2014-11-20 11:11:04 +00:00
private function get_posted_tax_rate ( $key , $order , $class ) {
2014-11-20 18:41:51 +00:00
$tax_rate = array ();
2014-11-20 00:51:01 +00:00
$tax_rate_keys = array (
'tax_rate_country' ,
'tax_rate_state' ,
'tax_rate' ,
'tax_rate_name' ,
'tax_rate_priority'
);
2013-07-26 14:36:28 +00:00
2014-11-20 11:11:04 +00:00
foreach ( $tax_rate_keys as $tax_rate_key ) {
if ( isset ( $_POST [ $tax_rate_key ] ) && isset ( $_POST [ $tax_rate_key ][ $key ] ) ) {
2014-11-20 18:41:51 +00:00
$tax_rate [ $tax_rate_key ] = wc_clean ( $_POST [ $tax_rate_key ][ $key ] );
2014-11-20 00:51:01 +00:00
}
2014-11-20 11:11:04 +00:00
}
2013-07-26 14:36:28 +00:00
2014-11-20 18:41:51 +00:00
$tax_rate [ 'tax_rate_compound' ] = isset ( $_POST [ 'tax_rate_compound' ][ $key ] ) ? 1 : 0 ;
$tax_rate [ 'tax_rate_shipping' ] = isset ( $_POST [ 'tax_rate_shipping' ][ $key ] ) ? 1 : 0 ;
$tax_rate [ 'tax_rate_order' ] = $order ;
$tax_rate [ 'tax_rate_class' ] = $class ;
2013-07-26 14:36:28 +00:00
2014-11-20 18:41:51 +00:00
return $tax_rate ;
2014-11-20 11:11:04 +00:00
}
2013-07-26 14:36:28 +00:00
2014-11-20 11:11:04 +00:00
/**
* Save tax rates
*/
public function save_tax_rates () {
2015-02-19 06:52:34 +00:00
global $wpdb ;
2014-11-20 11:11:04 +00:00
$current_class = sanitize_title ( $this -> get_current_tax_class () );
2015-02-19 06:52:34 +00:00
// get the tax rate id of the first submited row
$first_tax_rate_id = key ( $_POST [ 'tax_rate_country' ] );
// get the order position of the first tax rate id
$tax_rate_order = absint ( $wpdb -> get_var ( $wpdb -> prepare ( " SELECT tax_rate_order FROM { $wpdb -> prefix } woocommerce_tax_rates WHERE tax_rate_id = %s " , $first_tax_rate_id ) ) );
2015-03-13 12:44:04 +00:00
2015-02-19 06:52:34 +00:00
$index = isset ( $tax_rate_order ) ? $tax_rate_order : 0 ;
2014-11-20 00:51:01 +00:00
2014-11-20 11:11:04 +00:00
// Loop posted fields
foreach ( $_POST [ 'tax_rate_country' ] as $key => $value ) {
2015-03-13 12:44:04 +00:00
$mode = 0 === strpos ( $key , 'new-' ) ? 'insert' : 'update' ;
$tax_rate = $this -> get_posted_tax_rate ( $key , $index ++ , $current_class );
2014-11-20 00:51:01 +00:00
2014-11-20 11:11:04 +00:00
if ( 'insert' === $mode ) {
2014-11-20 18:41:51 +00:00
$tax_rate_id = WC_Tax :: _insert_tax_rate ( $tax_rate );
2014-11-20 15:46:07 +00:00
} elseif ( 1 == $_POST [ 'remove_tax_rate' ][ $key ] ) {
2015-03-13 12:44:04 +00:00
$tax_rate_id = absint ( $key );
WC_Tax :: _delete_tax_rate ( $tax_rate_id );
2014-11-20 15:46:07 +00:00
continue ;
2014-11-20 11:11:04 +00:00
} else {
2015-03-13 12:44:04 +00:00
$tax_rate_id = absint ( $key );
2014-11-20 18:41:51 +00:00
WC_Tax :: _update_tax_rate ( $tax_rate_id , $tax_rate );
2014-11-20 00:51:01 +00:00
}
if ( isset ( $_POST [ 'tax_rate_postcode' ][ $key ] ) ) {
2014-11-20 18:41:51 +00:00
WC_Tax :: _update_tax_rate_postcodes ( $tax_rate_id , wc_clean ( $_POST [ 'tax_rate_postcode' ][ $key ] ) );
2014-11-20 00:51:01 +00:00
}
if ( isset ( $_POST [ 'tax_rate_city' ][ $key ] ) ) {
2014-11-20 18:41:51 +00:00
WC_Tax :: _update_tax_rate_cities ( $tax_rate_id , wc_clean ( $_POST [ 'tax_rate_city' ][ $key ] ) );
2013-07-26 14:36:28 +00:00
}
}
}
}
endif ;
2014-05-19 05:49:35 +00:00
return new WC_Settings_Tax ();