woocommerce/includes/class-wc-customer.php

674 lines
15 KiB
PHP
Raw Normal View History

2011-08-09 15:16:18 +00:00
<?php
/**
* Customer
2012-08-14 19:42:38 +00:00
*
* The WooCommerce customer class handles storage of the current customer's data, such as location.
2011-08-09 15:16:18 +00:00
*
2012-01-27 16:38:39 +00:00
* @class WC_Customer
2012-08-14 19:42:38 +00:00
* @version 1.6.4
2012-08-14 22:43:48 +00:00
* @package WooCommerce/Classes
2013-02-20 17:14:46 +00:00
* @category Class
2012-08-14 19:42:38 +00:00
* @author WooThemes
2011-08-09 15:16:18 +00:00
*/
2012-01-27 16:38:39 +00:00
class WC_Customer {
2012-11-27 16:22:47 +00:00
2012-09-07 18:28:27 +00:00
/** Stores customer data as an array */
2012-09-23 16:16:39 +00:00
protected $_data;
2012-11-27 16:22:47 +00:00
/** Stores bool when data is changed */
private $_changed = false;
2012-08-14 19:42:38 +00:00
/**
2012-09-07 18:28:27 +00:00
* Constructor for the customer class loads the customer data.
2012-08-14 19:42:38 +00:00
*
* @access public
* @return void
*/
public function __construct() {
2012-11-27 16:22:47 +00:00
2013-11-25 14:01:32 +00:00
if ( empty( WC()->session->customer ) ) {
2012-08-14 19:42:38 +00:00
2012-09-07 18:28:27 +00:00
$default = apply_filters( 'woocommerce_customer_default_location', get_option( 'woocommerce_default_country' ) );
2012-08-14 19:42:38 +00:00
if ( strstr( $default, ':' ) ) {
2012-09-07 18:28:27 +00:00
list( $country, $state ) = explode( ':', $default );
2012-08-14 19:42:38 +00:00
} else {
2011-08-09 15:16:18 +00:00
$country = $default;
$state = '';
2012-08-14 19:42:38 +00:00
}
2012-09-23 16:16:39 +00:00
$this->_data = array(
2012-10-18 10:33:47 +00:00
'country' => esc_html( $country ),
2012-09-07 18:28:27 +00:00
'state' => '',
'postcode' => '',
2012-09-23 16:16:39 +00:00
'city' => '',
'address' => '',
'address_2' => '',
2012-10-18 10:33:47 +00:00
'shipping_country' => esc_html( $country ),
2012-09-07 18:28:27 +00:00
'shipping_state' => '',
'shipping_postcode' => '',
2012-09-23 16:16:39 +00:00
'shipping_city' => '',
'shipping_address' => '',
'shipping_address_2' => '',
2012-09-07 18:28:27 +00:00
'is_vat_exempt' => false,
'calculated_shipping' => false
2012-08-14 19:42:38 +00:00
);
2012-11-27 16:22:47 +00:00
2012-09-07 18:28:27 +00:00
} else {
2013-11-25 14:01:32 +00:00
$this->_data = WC()->session->customer;
2012-08-14 19:42:38 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-07 18:28:27 +00:00
// When leaving or ending page load, store data
add_action( 'shutdown', array( $this, 'save_data' ), 10 );
2012-09-07 18:28:27 +00:00
}
2012-09-23 16:16:39 +00:00
/**
* save_data function.
*
* @access public
* @return void
*/
public function save_data() {
if ( $this->_changed )
$GLOBALS['woocommerce']->session->customer = $this->_data;
}
/**
* __set function.
* @access public
* @param mixed $property
* @return bool
*/
public function __isset( $property ) {
return isset( $this->_data[ $property ] );
}
2012-09-23 16:16:39 +00:00
/**
* __get function.
2012-11-27 16:22:47 +00:00
*
2012-09-23 16:16:39 +00:00
* @access public
* @param mixed $property
* @return mixed|null
2012-09-23 16:16:39 +00:00
*/
public function __get( $property ) {
return isset( $this->_data[ $property ] ) ? $this->_data[ $property ] : null;
}
2012-11-27 16:22:47 +00:00
2012-09-23 16:16:39 +00:00
/**
* __set function.
2012-11-27 16:22:47 +00:00
*
2012-09-23 16:16:39 +00:00
* @access public
* @param mixed $property
* @param mixed $value
* @return void
*/
public function __set( $property, $value ) {
$this->_data[ $property ] = $value;
$this->_changed = true;
2012-09-23 16:16:39 +00:00
}
2012-11-27 16:22:47 +00:00
/**
* has_calculated_shipping function.
2012-08-14 19:42:38 +00:00
*
* @access public
* @return bool
*/
public function has_calculated_shipping() {
return ( ! empty( $this->calculated_shipping ) ) ? true : false;
}
2012-08-14 19:42:38 +00:00
/**
* Set customer address to match shop base address.
*
* @access public
* @return void
*/
public function set_to_base() {
2012-08-31 17:40:58 +00:00
$default = apply_filters( 'woocommerce_customer_default_location', get_option('woocommerce_default_country') );
2012-09-07 18:28:27 +00:00
if ( strstr( $default, ':' ) ) {
list( $country, $state ) = explode( ':', $default );
} else {
$country = $default;
$state = '';
2012-09-07 18:28:27 +00:00
}
$this->country = $country;
$this->state = $state;
$this->postcode = '';
$this->city = '';
}
2012-08-14 19:42:38 +00:00
/**
* Set customer shipping address to base address.
*
* @access public
* @return void
*/
public function set_shipping_to_base() {
$default = get_option('woocommerce_default_country');
2012-09-07 18:28:27 +00:00
if ( strstr( $default, ':' ) ) {
list( $country, $state ) = explode( ':', $default );
} else {
$country = $default;
$state = '';
2012-09-07 18:28:27 +00:00
}
$this->shipping_country = $country;
$this->shipping_state = $state;
$this->shipping_postcode = '';
$this->shipping_city = '';
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Is customer outside base country (for tax purposes)?
2012-08-14 19:42:38 +00:00
*
* @access public
* @return bool
*/
public function is_customer_outside_base() {
list( $country, $state, $postcode, $city ) = $this->get_taxable_address();
2012-11-27 16:22:47 +00:00
if ( $country ) {
2012-08-14 19:42:38 +00:00
2011-08-10 17:11:11 +00:00
$default = get_option('woocommerce_default_country');
2012-11-27 16:22:47 +00:00
2012-09-07 18:28:27 +00:00
if ( strstr( $default, ':' ) ) {
list( $default_country, $default_state ) = explode( ':', $default );
2012-09-07 18:28:27 +00:00
} else {
$default_country = $default;
$default_state = '';
2012-09-07 18:28:27 +00:00
}
2012-08-14 19:42:38 +00:00
if ( $default_country !== $country ) return true;
if ( $default_state && $default_state !== $state ) return true;
2012-08-14 19:42:38 +00:00
2012-09-23 16:16:39 +00:00
}
2011-08-09 15:16:18 +00:00
return false;
}
2012-08-14 19:42:38 +00:00
/**
* Is customer VAT exempt?
*
* @access public
* @return bool
*/
public function is_vat_exempt() {
return ( ! empty( $this->is_vat_exempt ) ) ? true : false;
}
2012-08-14 19:42:38 +00:00
/**
* Gets the state from the current session.
*
* @access public
* @return string
*/
public function get_state() {
if ( isset( $this->state ) ) return $this->state;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Gets the country from the current session
*
* @access public
* @return string
*/
public function get_country() {
if ( isset( $this->country ) ) return $this->country;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Gets the postcode from the current session.
*
* @access public
* @return string
*/
public function get_postcode() {
if ( isset( $this->postcode ) && $this->postcode !== false )
return wc_format_postcode( $this->postcode, $this->get_country() );
2012-09-23 16:16:39 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-23 16:16:39 +00:00
/**
* Get the city from the current session.
2012-11-27 16:22:47 +00:00
*
2012-09-23 16:16:39 +00:00
* @access public
* @return string
2012-09-23 16:16:39 +00:00
*/
public function get_city() {
if ( isset( $this->city ) ) return $this->city;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Gets the address from the current session.
2012-11-27 16:22:47 +00:00
*
* @access public
* @return string
*/
public function get_address() {
if ( isset( $this->address ) ) return $this->address;
}
2012-11-27 16:22:47 +00:00
/**
* Gets the address_2 from the current session.
2012-11-27 16:22:47 +00:00
*
* @access public
* @return string
*/
public function get_address_2() {
if ( isset( $this->address_2 ) ) return $this->address_2;
}
2012-08-14 19:42:38 +00:00
/**
* Gets the state from the current session.
*
* @access public
* @return string
*/
public function get_shipping_state() {
if ( isset( $this->shipping_state ) ) return $this->shipping_state;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Gets the country from the current session.
*
* @access public
* @return string
*/
public function get_shipping_country() {
if ( isset( $this->shipping_country ) ) return $this->shipping_country;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Gets the postcode from the current session.
*
* @access public
* @return string
*/
public function get_shipping_postcode() {
if ( isset( $this->shipping_postcode ) )
return wc_format_postcode( $this->shipping_postcode, $this->get_shipping_country() );
2012-09-23 16:16:39 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-23 16:16:39 +00:00
/**
* Gets the city from the current session.
2012-11-27 16:22:47 +00:00
*
2012-09-23 16:16:39 +00:00
* @access public
* @return string
2012-09-23 16:16:39 +00:00
*/
public function get_shipping_city() {
if ( isset( $this->shipping_city ) ) return $this->shipping_city;
2011-08-09 15:16:18 +00:00
}
2012-11-27 16:22:47 +00:00
/**
* Gets the address from the current session.
2012-11-27 16:22:47 +00:00
*
* @access public
* @return string
*/
public function get_shipping_address() {
if ( isset( $this->shipping_address ) ) return $this->shipping_address;
}
2012-11-27 16:22:47 +00:00
/**
* Gets the address_2 from the current session.
2012-11-27 16:22:47 +00:00
*
* @access public
* @return string
*/
public function get_shipping_address_2() {
if ( isset( $this->shipping_address_2 ) ) return $this->shipping_address_2;
}
2012-11-27 16:22:47 +00:00
/**
* get_taxable_address function.
2012-11-27 16:22:47 +00:00
*
* @access public
* @return array
*/
public function get_taxable_address() {
2012-12-03 15:13:59 +00:00
$tax_based_on = get_option( 'woocommerce_tax_based_on' );
// Check shipping method at this point to see if we need special handling
if ( apply_filters( 'woocommerce_apply_base_tax_for_local_pickup', true ) == true && sizeof( array_intersect( WC()->session->get( 'chosen_shipping_methods', array( get_option( 'woocommerce_default_shipping_method' ) ) ), apply_filters( 'woocommerce_local_pickup_methods', array( 'local_pickup' ) ) ) ) > 0 ) {
$tax_based_on = 'base';
}
2012-12-03 15:13:59 +00:00
if ( $tax_based_on == 'base' ) {
$default = get_option( 'woocommerce_default_country' );
if ( strstr( $default, ':' ) ) {
list( $country, $state ) = explode( ':', $default );
} else {
$country = $default;
$state = '';
}
$postcode = '';
$city = '';
} elseif ( $tax_based_on == 'billing' ) {
$country = $this->get_country();
$state = $this->get_state();
$postcode = $this->get_postcode();
$city = $this->get_city();
2012-12-03 15:13:59 +00:00
} else {
$country = $this->get_shipping_country();
$state = $this->get_shipping_state();
$postcode = $this->get_shipping_postcode();
$city = $this->get_shipping_city();
}
2012-12-03 15:13:59 +00:00
return apply_filters( 'woocommerce_customer_taxable_address', array( $country, $state, $postcode, $city ) );
}
2012-08-14 19:42:38 +00:00
2012-11-27 16:22:47 +00:00
2012-08-14 19:42:38 +00:00
/**
* Sets session data for the location.
2012-11-27 16:22:47 +00:00
*
2012-08-14 19:42:38 +00:00
* @access public
* @param mixed $country
* @param mixed $state
* @param string $postcode (default: '')
2012-09-23 16:16:39 +00:00
* @param string $city (default: '')
2012-08-14 19:42:38 +00:00
* @return void
*/
public function set_location( $country, $state, $postcode = '', $city = '' ) {
$this->country = $country;
$this->state = $state;
$this->postcode = $postcode;
$this->city = $city;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Sets session data for the country.
*
* @access public
* @param mixed $country
* @return void
*/
public function set_country( $country ) {
$this->country = $country;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Sets session data for the state.
*
* @access public
* @param mixed $state
* @return void
*/
public function set_state( $state ) {
$this->state = $state;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Sets session data for the postcode.
*
* @access public
* @param mixed $postcode
* @return void
*/
public function set_postcode( $postcode ) {
$this->postcode = $postcode;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
2012-09-23 16:16:39 +00:00
/**
* Sets session data for the city.
*
* @access public
* @param mixed $postcode
* @return void
*/
public function set_city( $city ) {
$this->city = $city;
2012-09-23 16:16:39 +00:00
}
/**
* Sets session data for the address.
*
* @access public
* @param mixed $address
* @return void
*/
public function set_address( $address ) {
$this->address = $address;
}
/**
* Sets session data for the address_2.
*
* @access public
* @param mixed $address_2
* @return void
*/
public function set_address_2( $address_2 ) {
$this->address_2 = $address_2;
}
2012-08-14 19:42:38 +00:00
/**
* Sets session data for the location.
*
* @access public
* @param mixed $country
* @param string $state (default: '')
* @param string $postcode (default: '')
2012-11-27 16:22:47 +00:00
* @param string $city (default: '')
2012-08-14 19:42:38 +00:00
* @return void
*/
public function set_shipping_location( $country, $state = '', $postcode = '', $city = '' ) {
$this->shipping_country = $country;
$this->shipping_state = $state;
$this->shipping_postcode = $postcode;
$this->shipping_city = $city;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Sets session data for the country.
*
* @access public
* @param mixed $country
* @return void
*/
public function set_shipping_country( $country ) {
$this->shipping_country = $country;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Sets session data for the state.
*
* @access public
* @param mixed $state
* @return void
*/
public function set_shipping_state( $state ) {
$this->shipping_state = $state;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Sets session data for the postcode.
*
* @access public
* @param mixed $postcode
* @return void
*/
public function set_shipping_postcode( $postcode ) {
$this->shipping_postcode = $postcode;
2012-09-23 16:16:39 +00:00
}
/**
* Sets session data for the city.
*
* @access public
* @param mixed $postcode
* @return void
*/
public function set_shipping_city( $city ) {
$this->shipping_city = $city;
2011-08-09 15:16:18 +00:00
}
2012-08-14 19:42:38 +00:00
/**
* Sets session data for the address.
*
* @access public
* @param mixed $address
* @return void
*/
public function set_shipping_address( $address ) {
$this->shipping_address = $address;
}
/**
* Sets session data for the address_2.
*
* @access public
* @param mixed $address_2
* @return void
*/
public function set_shipping_address_2( $address_2 ) {
$this->shipping_address_2 = $address_2;
}
2012-08-14 19:42:38 +00:00
/**
* Sets session data for the tax exemption.
*
* @access public
* @param mixed $is_vat_exempt
* @return void
*/
public function set_is_vat_exempt( $is_vat_exempt ) {
$this->is_vat_exempt = $is_vat_exempt;
}
2012-08-14 19:42:38 +00:00
2012-09-07 18:28:27 +00:00
/**
* calculated_shipping function.
2012-11-27 16:22:47 +00:00
*
2012-09-07 18:28:27 +00:00
* @access public
* @param mixed $calculated
* @return void
*/
public function calculated_shipping( $calculated = true ) {
$this->calculated_shipping = $calculated;
2012-09-07 18:28:27 +00:00
}
2012-11-27 16:22:47 +00:00
2012-09-07 18:28:27 +00:00
2011-08-09 15:16:18 +00:00
/**
2012-08-14 19:42:38 +00:00
* Gets a user's downloadable products if they are logged in.
2011-08-09 15:16:18 +00:00
*
2012-08-14 19:42:38 +00:00
* @access public
* @return array Array of downloadable products
2011-08-09 15:16:18 +00:00
*/
public function get_downloadable_products() {
global $wpdb;
$downloads = array();
$_product = null;
$order = null;
$file_number = 0;
if ( is_user_logged_in() ) {
// Get results from valid orders only
$results = $wpdb->get_results( $wpdb->prepare( "
SELECT permissions.*
FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions as permissions
LEFT JOIN {$wpdb->posts} as posts ON permissions.order_id = posts.ID
WHERE user_id = %s
AND permissions.order_id > 0
AND posts.post_status = 'publish'
AND
(
permissions.downloads_remaining > 0
OR
permissions.downloads_remaining = ''
)
GROUP BY permissions.download_id
ORDER BY permissions.order_id, permissions.product_id, permissions.download_id;
", get_current_user_id() ) );
if ( $results ) {
foreach ( $results as $result ) {
if ( ! $order || $order->id != $result->order_id ) {
// new order
$order = new WC_Order( $result->order_id );
$_product = null;
}
2012-08-14 19:42:38 +00:00
// Downloads permitted?
if ( ! $order->is_download_permitted() ) {
continue;
}
2012-08-14 19:42:38 +00:00
if ( ! $_product || $_product->id != $result->product_id ) {
// new product
$file_number = 0;
$_product = get_product( $result->product_id );
}
2012-11-27 16:22:47 +00:00
// Check product exists and has the file
if ( ! $_product || ! $_product->exists() || ! $_product->has_file( $result->download_id ) ) {
continue;
}
// Download name will be 'Product Name' for products with a single downloadable file, and 'Product Name - File X' for products with multiple files
$download_name = apply_filters(
'woocommerce_downloadable_product_name',
$_product->get_title() . ( $file_number > 0 ? ' &mdash; ' . sprintf( __( 'File %d', 'woocommerce' ), $file_number + 1 ) : '' ),
$_product,
$result->download_id,
$file_number
);
// Rename previous download with file number if there are multiple files only
if ( $file_number == 1 ) {
$previous_result = $downloads[ count( $downloads ) - 1 ];
$previous_result['download_name'] = apply_filters(
'woocommerce_downloadable_product_name',
$previous_result['download_name'] . ' &mdash; ' . sprintf( __('File %d', 'woocommerce' ), $file_number ),
$_product,
$previous_result['download_id'],
0
);
}
2012-08-14 19:42:38 +00:00
$downloads[] = array(
'download_url' => add_query_arg( array( 'download_file' => $result->product_id, 'order' => $result->order_key, 'email' => $result->user_email, 'key' => $result->download_id ), home_url( '/', 'http' ) ),
'download_id' => $result->download_id,
'product_id' => $result->product_id,
'download_name' => $download_name,
'order_id' => $order->id,
'order_key' => $order->order_key,
'downloads_remaining' => $result->downloads_remaining
);
2012-08-14 19:42:38 +00:00
$file_number++;
}
}
}
return apply_filters( 'woocommerce_customer_get_downloadable_products', $downloads );
2012-08-14 19:42:38 +00:00
}
2011-08-09 15:16:18 +00:00
}