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 () {
2014-11-20 00:51:01 +00:00
global $wpdb ;
2013-07-26 14:36:28 +00:00
2013-08-13 11:18:20 +00:00
$page = ! empty ( $_GET [ 'p' ] ) ? absint ( $_GET [ 'p' ] ) : 1 ;
$limit = 100 ;
2014-11-20 00:51:01 +00:00
$current_class = $this -> get_current_tax_class ();
2013-07-26 14:36:28 +00:00
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 ();