2011-08-09 15:16:18 +00:00
< ? php
/**
* Checkout
*
2011-08-10 17:11:11 +00:00
* The WooCommerce checkout class handles the checkout process , collecting user data and processing the payment .
2011-08-09 15:16:18 +00:00
*
2012-01-27 16:38:39 +00:00
* @ class WC_Checkout
2011-08-10 17:11:11 +00:00
* @ package WooCommerce
* @ category Class
* @ author WooThemes
2011-08-09 15:16:18 +00:00
*/
2012-01-27 16:38:39 +00:00
class WC_Checkout {
2011-08-09 15:16:18 +00:00
var $posted ;
2011-12-21 16:03:45 +00:00
var $checkout_fields ;
2011-08-09 15:16:18 +00:00
var $must_create_account ;
var $creating_account ;
2011-12-15 19:22:15 +00:00
var $localisation ;
2011-08-09 15:16:18 +00:00
/** constructor */
2011-09-06 11:18:22 +00:00
function __construct () {
2011-12-15 23:24:02 +00:00
global $woocommerce ;
2011-08-09 15:16:18 +00:00
2012-02-12 11:36:33 +00:00
add_action ( 'woocommerce_checkout_process' , array ( & $this , 'checkout_process' ));
2011-08-10 17:11:11 +00:00
add_action ( 'woocommerce_checkout_billing' , array ( & $this , 'checkout_form_billing' ));
add_action ( 'woocommerce_checkout_shipping' , array ( & $this , 'checkout_form_shipping' ));
2011-08-09 15:16:18 +00:00
2011-12-21 16:03:45 +00:00
$this -> must_create_account = ( get_option ( 'woocommerce_enable_guest_checkout' ) == 'yes' || is_user_logged_in ()) ? false : true ;
// Define all Checkout fields
$this -> checkout_fields [ 'billing' ] = $woocommerce -> countries -> get_address_fields ( $this -> get_value ( 'billing_country' ), 'billing_' );
$this -> checkout_fields [ 'shipping' ] = $woocommerce -> countries -> get_address_fields ( $this -> get_value ( 'shipping_country' ), 'shipping_' );
$this -> checkout_fields [ 'account' ] = array (
'account_username' => array (
'type' => 'text' ,
2012-01-05 11:31:22 +00:00
'label' => __ ( 'Account username' , 'woocommerce' ),
2012-02-28 10:28:24 +00:00
'placeholder' => _x ( 'Username' , 'placeholder' , 'woocommerce' )
2011-12-21 16:03:45 +00:00
),
'account_password' => array (
'type' => 'password' ,
2012-01-05 11:31:22 +00:00
'label' => __ ( 'Account password' , 'woocommerce' ),
2012-02-28 10:28:24 +00:00
'placeholder' => _x ( 'Password' , 'placeholder' , 'woocommerce' ),
2011-12-21 16:03:45 +00:00
'class' => array ( 'form-row-first' )
),
'account_password-2' => array (
'type' => 'password' ,
2012-01-05 11:31:22 +00:00
'label' => __ ( 'Account password' , 'woocommerce' ),
2012-02-28 10:28:24 +00:00
'placeholder' => _x ( 'Password' , 'placeholder' , 'woocommerce' ),
2011-12-21 16:03:45 +00:00
'class' => array ( 'form-row-last' ),
'label_class' => array ( 'hidden' )
)
);
$this -> checkout_fields [ 'order' ] = array (
'order_comments' => array (
'type' => 'textarea' ,
'class' => array ( 'notes' ),
2012-01-05 11:31:22 +00:00
'label' => __ ( 'Order Notes' , 'woocommerce' ),
2012-02-28 10:28:24 +00:00
'placeholder' => _x ( 'Notes about your order, e.g. special notes for delivery.' , 'placeholder' , 'woocommerce' )
2011-12-21 16:03:45 +00:00
)
);
2011-12-21 21:56:01 +00:00
$this -> checkout_fields = apply_filters ( 'woocommerce_checkout_fields' , $this -> checkout_fields );
2011-08-09 15:16:18 +00:00
}
2012-02-12 11:36:33 +00:00
/** Checkout process */
function checkout_process () {
// When we process the checkout, lets ensure cart items are rechecked to prevent checkout
do_action ( 'woocommerce_check_cart_items' );
}
2011-08-09 15:16:18 +00:00
/** Output the billing information form */
function checkout_form_billing () {
2012-02-03 16:17:35 +00:00
woocommerce_get_template ( 'checkout/form-billing.php' , array ( 'checkout' => $this ) );
2011-08-09 15:16:18 +00:00
}
/** Output the shipping information form */
function checkout_form_shipping () {
2012-02-03 16:17:35 +00:00
woocommerce_get_template ( 'checkout/form-shipping.php' , array ( 'checkout' => $this ) );
2011-08-09 15:16:18 +00:00
}
2011-09-12 15:34:29 +00:00
/**
* Process the checkout after the confirm order button is pressed
*/
2011-08-09 15:16:18 +00:00
function process_checkout () {
2011-09-06 11:11:22 +00:00
global $wpdb , $woocommerce ;
2011-09-14 14:55:03 +00:00
2012-06-10 11:40:07 +00:00
if ( ! defined ( 'WOOCOMMERCE_CHECKOUT' ) ) define ( 'WOOCOMMERCE_CHECKOUT' , true );
2012-01-12 00:30:21 +00:00
2012-01-12 00:54:45 +00:00
$woocommerce -> verify_nonce ( 'process_checkout' );
do_action ( 'woocommerce_before_checkout_process' );
2012-01-12 00:43:30 +00:00
2012-06-10 11:40:07 +00:00
if ( sizeof ( $woocommerce -> cart -> get_cart () ) == 0 )
2012-01-12 00:54:45 +00:00
$woocommerce -> add_error ( sprintf ( __ ( 'Sorry, your session has expired. <a href="%s">Return to homepage →</a>' , 'woocommerce' ), home_url ()) );
do_action ( 'woocommerce_checkout_process' );
2012-01-12 00:43:30 +00:00
2012-01-12 00:54:45 +00:00
// Checkout fields (not defined in checkout_fields)
$this -> posted [ 'shiptobilling' ] = isset ( $_POST [ 'shiptobilling' ]) ? 1 : 0 ;
$this -> posted [ 'terms' ] = isset ( $_POST [ 'terms' ]) ? 1 : 0 ;
$this -> posted [ 'createaccount' ] = isset ( $_POST [ 'createaccount' ]) ? 1 : 0 ;
$this -> posted [ 'payment_method' ] = isset ( $_POST [ 'payment_method' ]) ? woocommerce_clean ( $_POST [ 'payment_method' ]) : '' ;
$this -> posted [ 'shipping_method' ] = isset ( $_POST [ 'shipping_method' ]) ? woocommerce_clean ( $_POST [ 'shipping_method' ]) : '' ;
// Ship to billing only option
2012-04-21 18:10:01 +00:00
if ( $woocommerce -> cart -> ship_to_billing_address_only () ) $this -> posted [ 'shiptobilling' ] = 1 ;
2012-01-12 00:54:45 +00:00
// Update customer shipping and payment method to posted method
2012-07-16 19:21:44 +00:00
$_SESSION [ '_chosen_shipping_method' ] = $this -> posted [ 'shipping_method' ];
$_SESSION [ '_chosen_payment_method' ] = $this -> posted [ 'payment_method' ];
2012-01-12 00:54:45 +00:00
// Note if we skip shipping
$skipped_shipping = false ;
2012-01-13 00:46:56 +00:00
// Get validation class
$validation = $woocommerce -> validation ();
2012-01-12 00:54:45 +00:00
// Get posted checkout_fields and do validation
2012-07-16 19:21:44 +00:00
foreach ( $this -> checkout_fields as $fieldset_key => $fieldset ) {
2012-01-12 00:43:30 +00:00
2012-01-12 00:54:45 +00:00
// Skip shipping if its not needed
2012-04-21 18:30:37 +00:00
if ( $fieldset_key == 'shipping' && ( $woocommerce -> cart -> ship_to_billing_address_only () || $this -> posted [ 'shiptobilling' ] || ( ! $woocommerce -> cart -> needs_shipping () && get_option ( 'woocommerce_require_shipping_address' ) == 'no' ) ) ) {
2012-01-12 00:54:45 +00:00
$skipped_shipping = true ;
continue ;
2012-04-21 18:30:37 +00:00
}
2012-01-12 00:43:30 +00:00
2012-07-16 19:21:44 +00:00
foreach ( $fieldset as $key => $field ) {
2012-01-12 00:30:21 +00:00
2012-07-16 19:21:44 +00:00
if ( ! isset ( $field [ 'type' ] ) ) $field [ 'type' ] = 'text' ;
2012-01-12 00:30:21 +00:00
2012-01-12 00:54:45 +00:00
// Get Value
2012-07-16 19:21:44 +00:00
switch ( $field [ 'type' ] ) {
2012-01-12 00:54:45 +00:00
case " checkbox " :
2012-07-16 19:21:44 +00:00
$this -> posted [ $key ] = isset ( $_POST [ $key ] ) ? 1 : 0 ;
2012-01-12 00:54:45 +00:00
break ;
default :
2012-07-16 19:21:44 +00:00
$this -> posted [ $key ] = isset ( $_POST [ $key ] ) ? woocommerce_clean ( $_POST [ $key ] ) : '' ;
2012-01-12 00:54:45 +00:00
break ;
2012-07-16 19:21:44 +00:00
}
2012-01-12 00:54:45 +00:00
// Hook to allow modification of value
2012-07-16 19:21:44 +00:00
$this -> posted [ $key ] = apply_filters ( 'woocommerce_process_checkout_field_' . $key , $this -> posted [ $key ] );
2012-01-12 00:54:45 +00:00
// Validation: Required fields
2012-07-16 19:21:44 +00:00
if ( isset ( $field [ 'required' ] ) && $field [ 'required' ] && empty ( $this -> posted [ $key ] ) ) $woocommerce -> add_error ( '<strong>' . $field [ 'label' ] . '</strong> ' . __ ( 'is a required field.' , 'woocommerce' ) );
if ( ! empty ( $this -> posted [ $key ] ) ) {
2012-01-12 00:54:45 +00:00
// Special handling for validation and formatting
2012-07-16 19:21:44 +00:00
switch ( $key ) {
2012-01-12 00:54:45 +00:00
case " billing_postcode " :
case " shipping_postcode " :
2012-07-16 19:21:44 +00:00
$validate_against = $key == 'billing_postcode' ? 'billing_country' : 'shipping_country' ;
2012-05-22 20:31:27 +00:00
$this -> posted [ $key ] = strtoupper ( str_replace ( ' ' , '' , $this -> posted [ $key ] ) );
2012-01-12 00:54:45 +00:00
2012-07-16 19:21:44 +00:00
if ( ! $validation -> is_postcode ( $this -> posted [ $key ], $_POST [ $validate_against ] ) )
$woocommerce -> add_error ( '<strong>' . $field [ 'label' ] . '</strong> ' . sprintf ( __ ( '(%s) is not a valid postcode/ZIP.' , 'woocommerce' ), $this -> posted [ $key ] ) );
else
2012-05-22 20:31:27 +00:00
$this -> posted [ $key ] = $validation -> format_postcode ( $this -> posted [ $key ], $_POST [ $validate_against ] );
2012-07-16 19:21:44 +00:00
break ;
case " billing_state " :
case " shipping_state " :
// Get valid states
$validate_against = $key == 'billing_state' ? 'billing_country' : 'shipping_country' ;
$valid_states = $woocommerce -> countries -> get_states ( $_POST [ $validate_against ] );
if ( $valid_states )
$valid_state_values = array_flip ( array_map ( 'strtolower' , $valid_states ) );
// Convert value to key if set
if ( isset ( $valid_state_values [ strtolower ( $this -> posted [ $key ] ) ] ) )
$this -> posted [ $key ] = $valid_state_values [ strtolower ( $this -> posted [ $key ] ) ];
// Only validate if the country has specific state options
if ( $valid_states && sizeof ( $valid_states ) > 0 )
if ( ! in_array ( $this -> posted [ $key ], array_keys ( $valid_states ) ) )
$woocommerce -> add_error ( '<strong>' . $field [ 'label' ] . '</strong> ' . __ ( 'is not valid. Please enter one of the following:' , 'woocommerce' ) . ' ' . implode ( ', ' , $valid_states ) );
2012-01-12 00:30:21 +00:00
break ;
2012-01-12 00:54:45 +00:00
case " billing_phone " :
2012-07-16 19:21:44 +00:00
2012-06-10 09:44:13 +00:00
$this -> posted [ $key ] = $validation -> format_phone ( $this -> posted [ $key ] );
2012-07-16 19:21:44 +00:00
2012-06-10 09:44:13 +00:00
if ( ! $validation -> is_phone ( $this -> posted [ $key ] ) )
$woocommerce -> add_error ( '<strong>' . $field [ 'label' ] . '</strong> ' . __ ( 'is not a valid number.' , 'woocommerce' ) );
2012-01-12 00:54:45 +00:00
break ;
case " billing_email " :
2012-07-16 19:21:44 +00:00
$this -> posted [ $key ] = strtolower ( $this -> posted [ $key ] );
if ( ! $validation -> is_email ( $this -> posted [ $key ] ) )
$woocommerce -> add_error ( '<strong>' . $field [ 'label' ] . '</strong> ' . __ ( 'is not a valid email address.' , 'woocommerce' ) );
2011-12-21 16:03:45 +00:00
break ;
2012-07-16 19:21:44 +00:00
}
}
}
}
2012-01-12 00:54:45 +00:00
// Update customer location to posted location so we can correctly check available shipping methods
2012-03-26 19:28:19 +00:00
if ( isset ( $this -> posted [ 'billing_country' ] ) )
$woocommerce -> customer -> set_country ( $this -> posted [ 'billing_country' ] );
if ( isset ( $this -> posted [ 'billing_state' ] ) )
$woocommerce -> customer -> set_state ( $this -> posted [ 'billing_state' ] );
if ( isset ( $this -> posted [ 'billing_postcode' ] ) )
$woocommerce -> customer -> set_postcode ( $this -> posted [ 'billing_postcode' ] );
2012-01-12 00:54:45 +00:00
// Shipping Information
2012-03-26 19:28:19 +00:00
if ( ! $skipped_shipping ) {
2012-01-12 00:54:45 +00:00
2011-12-21 16:03:45 +00:00
// Update customer location to posted location so we can correctly check available shipping methods
2012-03-26 19:16:05 +00:00
if ( isset ( $this -> posted [ 'shipping_country' ] ) )
$woocommerce -> customer -> set_shipping_country ( $this -> posted [ 'shipping_country' ] );
if ( isset ( $this -> posted [ 'shipping_state' ] ) )
$woocommerce -> customer -> set_shipping_state ( $this -> posted [ 'shipping_state' ] );
if ( isset ( $this -> posted [ 'shipping_postcode' ] ) )
$woocommerce -> customer -> set_shipping_postcode ( $this -> posted [ 'shipping_postcode' ] );
2011-12-21 16:03:45 +00:00
2012-03-26 19:28:19 +00:00
} else {
2012-01-12 00:54:45 +00:00
// Update customer location to posted location so we can correctly check available shipping methods
2012-03-26 19:16:05 +00:00
if ( isset ( $this -> posted [ 'billing_country' ] ) )
$woocommerce -> customer -> set_shipping_country ( $this -> posted [ 'billing_country' ] );
if ( isset ( $this -> posted [ 'billing_state' ] ) )
$woocommerce -> customer -> set_shipping_state ( $this -> posted [ 'billing_state' ] );
if ( isset ( $this -> posted [ 'billing_postcode' ] ) )
$woocommerce -> customer -> set_shipping_postcode ( $this -> posted [ 'billing_postcode' ] );
2011-08-09 15:16:18 +00:00
2012-03-26 19:28:19 +00:00
}
2012-04-21 18:10:01 +00:00
2012-07-16 19:21:44 +00:00
// Update cart totals now we have customer address
$woocommerce -> cart -> calculate_totals ();
// Handle accounts
2012-04-21 18:10:01 +00:00
if ( is_user_logged_in () )
2012-01-12 00:54:45 +00:00
$this -> creating_account = false ;
2012-04-21 18:10:01 +00:00
elseif ( ! empty ( $this -> posted [ 'createaccount' ] ) )
2012-01-12 00:54:45 +00:00
$this -> creating_account = true ;
2012-04-21 18:10:01 +00:00
elseif ( $this -> must_create_account )
2012-01-12 00:54:45 +00:00
$this -> creating_account = true ;
2012-04-21 18:10:01 +00:00
else
2012-01-12 00:54:45 +00:00
$this -> creating_account = false ;
2012-04-21 18:10:01 +00:00
if ( $this -> creating_account ) {
2012-01-12 00:54:45 +00:00
2012-07-16 19:21:44 +00:00
if ( empty ( $this -> posted [ 'account_username' ]) )
$woocommerce -> add_error ( __ ( 'Please enter an account username.' , 'woocommerce' ) );
if ( empty ( $this -> posted [ 'account_password' ]) )
$woocommerce -> add_error ( __ ( 'Please enter an account password.' , 'woocommerce' ) );
if ( $this -> posted [ 'account_password-2' ] !== $this -> posted [ 'account_password' ] )
$woocommerce -> add_error ( __ ( 'Passwords do not match.' , 'woocommerce' ) );
2012-01-12 00:54:45 +00:00
// Check the username
2012-07-16 19:21:44 +00:00
if ( ! validate_username ( $this -> posted [ 'account_username' ] ) )
2012-01-12 00:54:45 +00:00
$woocommerce -> add_error ( __ ( 'Invalid email/username.' , 'woocommerce' ) );
2012-07-16 19:21:44 +00:00
elseif ( username_exists ( $this -> posted [ 'account_username' ] ) )
2012-01-12 00:54:45 +00:00
$woocommerce -> add_error ( __ ( 'An account is already registered with that username. Please choose another.' , 'woocommerce' ) );
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
// Check the e-mail address
2012-07-16 19:21:44 +00:00
if ( email_exists ( $this -> posted [ 'billing_email' ] ) )
2012-01-12 00:54:45 +00:00
$woocommerce -> add_error ( __ ( 'An account is already registered with your email address. Please login.' , 'woocommerce' ) );
2011-08-09 15:16:18 +00:00
2012-04-21 18:10:01 +00:00
}
2012-01-12 00:54:45 +00:00
// Terms
2012-07-16 19:21:44 +00:00
if ( ! isset ( $_POST [ 'woocommerce_checkout_update_totals' ] ) && empty ( $this -> posted [ 'terms' ] ) && woocommerce_get_page_id ( 'terms' ) > 0 )
$woocommerce -> add_error ( __ ( 'You must accept our Terms & Conditions.' , 'woocommerce' ) );
2012-01-12 00:54:45 +00:00
2012-07-16 19:21:44 +00:00
if ( $woocommerce -> cart -> needs_shipping () ) {
2012-01-12 00:30:21 +00:00
2012-01-12 00:54:45 +00:00
// Shipping Method
$available_methods = $woocommerce -> shipping -> get_available_shipping_methods ();
2012-07-16 19:21:44 +00:00
if ( ! isset ( $available_methods [ $this -> posted [ 'shipping_method' ] ] ) )
2012-01-12 00:54:45 +00:00
$woocommerce -> add_error ( __ ( 'Invalid shipping method.' , 'woocommerce' ) );
2012-07-16 19:21:44 +00:00
}
2012-01-12 00:54:45 +00:00
2012-07-16 19:21:44 +00:00
if ( $woocommerce -> cart -> needs_payment ()) {
2012-01-12 00:54:45 +00:00
// Payment Method
$available_gateways = $woocommerce -> payment_gateways -> get_available_payment_gateways ();
2012-07-16 19:21:44 +00:00
if ( ! isset ( $available_gateways [ $this -> posted [ 'payment_method' ] ] ) )
2012-01-12 00:54:45 +00:00
$woocommerce -> add_error ( __ ( 'Invalid payment method.' , 'woocommerce' ) );
2012-07-16 19:21:44 +00:00
else
$available_gateways [ $this -> posted [ 'payment_method' ]] -> validate_fields (); // Payment Method Field Validation
}
2012-01-12 00:54:45 +00:00
2012-07-16 19:21:44 +00:00
// Action after validation
2012-01-12 00:54:45 +00:00
do_action ( 'woocommerce_after_checkout_validation' , $this -> posted );
2012-07-16 19:21:44 +00:00
if ( ! isset ( $_POST [ 'woocommerce_checkout_update_totals' ] ) && $woocommerce -> error_count () == 0 ) :
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
$user_id = get_current_user_id ();
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
while ( 1 ) :
2011-10-25 15:36:16 +00:00
2012-01-12 00:54:45 +00:00
// Create customer account and log them in
if ( $this -> creating_account && ! $user_id ) :
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
$reg_errors = new WP_Error ();
do_action ( 'woocommerce_register_post' , $this -> posted [ 'account_username' ], $this -> posted [ 'billing_email' ], $reg_errors );
$errors = apply_filters ( 'woocommerce_registration_errors' , $reg_errors , $this -> posted [ 'account_username' ], $this -> posted [ 'billing_email' ] );
2012-01-12 00:43:30 +00:00
2012-01-12 00:54:45 +00:00
// if there are no errors, let's create the user account
if ( ! $reg_errors -> get_error_code () ) :
2012-02-15 12:42:10 +00:00
$user_pass = esc_attr ( $this -> posted [ 'account_password' ] );
$user_id = wp_create_user ( $this -> posted [ 'account_username' ], $user_pass , $this -> posted [ 'billing_email' ] );
2012-01-12 00:54:45 +00:00
if ( ! $user_id ) :
2012-06-06 20:35:40 +00:00
$woocommerce -> add_error ( '<strong>' . __ ( 'ERROR' , 'woocommerce' ) . '</strong>: ' . __ ( 'Couldn’t register you… please contact us if you continue to have problems.' , 'woocommerce' ) );
2012-01-12 00:54:45 +00:00
break ;
endif ;
// Change role
wp_update_user ( array ( 'ID' => $user_id , 'role' => 'customer' ) ) ;
2012-04-10 17:21:33 +00:00
// Action
do_action ( 'woocommerce_created_customer' , $user_id );
2012-01-12 00:54:45 +00:00
// send the user a confirmation and their login details
$mailer = $woocommerce -> mailer ();
2012-02-15 12:42:10 +00:00
$mailer -> customer_new_account ( $user_id , $user_pass );
2012-01-12 00:54:45 +00:00
// set the WP login cookie
$secure_cookie = is_ssl () ? true : false ;
wp_set_auth_cookie ( $user_id , true , $secure_cookie );
2012-04-10 17:21:33 +00:00
2012-01-12 00:54:45 +00:00
else :
$woocommerce -> add_error ( $reg_errors -> get_error_message () );
break ;
endif ;
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
endif ;
// Create Order (send cart variable so we can record items and reduce inventory). Only create if this is a new order, not if the payment was rejected last time.
2012-01-27 16:38:39 +00:00
$_tax = new WC_Tax ();
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
$order_data = array (
'post_type' => 'shop_order' ,
2012-06-29 16:38:00 +00:00
'post_title' => sprintf ( __ ( 'Order – %s' , 'woocommerce' ), strftime ( _x ( '%b %d, %Y @ %I:%M %p' , 'Order date parsed by strftime' , 'woocommerce' ) ) ),
2012-01-12 00:54:45 +00:00
'post_status' => 'publish' ,
2012-02-25 19:48:09 +00:00
'ping_status' => 'closed' ,
2012-01-12 00:54:45 +00:00
'post_excerpt' => $this -> posted [ 'order_comments' ],
2012-03-12 09:18:10 +00:00
'post_author' => 1 ,
'post_password' => uniqid ( 'order_' ) // Protects the post just in case
2012-01-12 00:54:45 +00:00
);
// Cart items
$order_items = array ();
2011-08-09 15:16:18 +00:00
2012-07-17 18:11:14 +00:00
foreach ( $woocommerce -> cart -> get_cart () as $cart_item_key => $values ) {
2012-01-12 00:54:45 +00:00
$_product = $values [ 'data' ];
// Store any item meta data - item meta class lets plugins add item meta in a standardized way
$item_meta = new order_item_meta ();
$item_meta -> new_order_item ( $values );
// Store variation data in meta so admin can view it
2012-07-17 18:11:14 +00:00
if ( $values [ 'variation' ] && is_array ( $values [ 'variation' ] ) ) {
foreach ( $values [ 'variation' ] as $key => $value ) {
$item_meta -> add ( esc_attr ( str_replace ( 'attribute_' , '' , $key ) ), $value );
}
}
2012-01-12 00:43:30 +00:00
2012-07-17 18:11:14 +00:00
// Store backorder status
if ( $_product -> backorders_require_notification () && $_product -> is_on_backorder ( $values [ 'quantity' ] ) )
$item_meta -> add ( __ ( 'Backordered' , 'woocommerce' ), $values [ 'quantity' ] - max ( 0 , $_product -> get_total_stock () ) );
$order_items [] = apply_filters ( 'new_order_item' , array (
2012-01-12 00:54:45 +00:00
'id' => $values [ 'product_id' ],
'variation_id' => $values [ 'variation_id' ],
'name' => $_product -> get_title (),
'qty' => ( int ) $values [ 'quantity' ],
'item_meta' => $item_meta -> meta ,
2012-07-17 18:11:14 +00:00
'line_subtotal' => woocommerce_format_decimal ( $values [ 'line_subtotal' ] ), // Line subtotal (before discounts)
'line_subtotal_tax' => woocommerce_format_decimal ( $values [ 'line_subtotal_tax' ] ), // Line tax (before discounts)
'line_total' => woocommerce_format_decimal ( $values [ 'line_total' ] ), // Line total (after discounts)
'line_tax' => woocommerce_format_decimal ( $values [ 'line_tax' ] ), // Line Tax (after discounts)
'tax_class' => $_product -> get_tax_class () // Tax class (adjusted by filters)
), $values );
}
2012-01-12 00:30:21 +00:00
2012-01-12 00:54:45 +00:00
// Check order items for errors
do_action ( 'woocommerce_check_new_order_items' , $order_items );
2012-01-12 00:30:21 +00:00
2012-01-12 00:54:45 +00:00
if ( $woocommerce -> error_count () > 0 ) break ;
// Insert or update the post data
$create_new_order = true ;
if ( isset ( $_SESSION [ 'order_awaiting_payment' ]) && $_SESSION [ 'order_awaiting_payment' ] > 0 ) :
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
$order_id = ( int ) $_SESSION [ 'order_awaiting_payment' ];
2011-12-07 17:25:08 +00:00
2012-01-13 00:46:56 +00:00
/* Check order is unpaid by getting its status */
$terms = wp_get_object_terms ( $order_id , 'shop_order_status' , array ( 'fields' => 'slugs' ) );
$order_status = ( isset ( $terms [ 0 ])) ? $terms [ 0 ] : 'pending' ;
2012-01-12 00:43:30 +00:00
2012-01-13 00:46:56 +00:00
if ( $order_status == 'pending' ) :
2011-12-07 17:25:08 +00:00
2012-01-12 00:54:45 +00:00
// Resume the unpaid order
$order_data [ 'ID' ] = $order_id ;
wp_update_post ( $order_data );
do_action ( 'woocommerce_resume_order' , $order_id );
2011-12-07 17:25:08 +00:00
2012-01-12 00:54:45 +00:00
$create_new_order = false ;
2012-01-12 00:43:30 +00:00
2012-01-12 00:54:45 +00:00
endif ;
2012-01-12 00:43:30 +00:00
2012-01-12 00:54:45 +00:00
endif ;
if ( $create_new_order ) :
$order_id = wp_insert_post ( $order_data );
2012-01-12 00:43:30 +00:00
2012-01-12 00:54:45 +00:00
if ( is_wp_error ( $order_id )) :
$woocommerce -> add_error ( 'Error: Unable to create order. Please try again.' );
break ;
else :
// Inserted successfully
do_action ( 'woocommerce_new_order' , $order_id );
endif ;
endif ;
// Get better formatted billing method (title)
$shipping_method = $this -> posted [ 'shipping_method' ];
if ( isset ( $available_methods ) && isset ( $available_methods [ $this -> posted [ 'shipping_method' ]])) :
$shipping_method = $available_methods [ $this -> posted [ 'shipping_method' ]] -> label ;
endif ;
// Get better formatted shipping method (title/label)
$payment_method = $this -> posted [ 'payment_method' ];
if ( isset ( $available_gateways ) && isset ( $available_gateways [ $this -> posted [ 'payment_method' ]])) :
2012-07-17 14:28:26 +00:00
$payment_method = $available_gateways [ $this -> posted [ 'payment_method' ]] -> get_title ();
2012-01-12 00:54:45 +00:00
endif ;
// UPDATE ORDER META
// Save billing and shipping first, also save to user meta if logged in
2012-04-21 18:30:37 +00:00
if ( $this -> checkout_fields [ 'billing' ]) {
foreach ( $this -> checkout_fields [ 'billing' ] as $key => $field ) {
2012-01-12 00:43:30 +00:00
2012-01-12 00:54:45 +00:00
// Post
update_post_meta ( $order_id , '_' . $key , $this -> posted [ $key ] );
2012-01-12 00:43:30 +00:00
2012-01-12 00:54:45 +00:00
// User
2012-04-21 18:30:37 +00:00
if ( $user_id > 0 && ! empty ( $this -> posted [ $key ])) {
2012-01-12 00:54:45 +00:00
update_user_meta ( $user_id , $key , $this -> posted [ $key ] );
2012-03-12 13:49:42 +00:00
// Special fields
switch ( $key ) {
2012-05-25 03:34:58 +00:00
case " billing_email " :
2012-03-12 13:49:42 +00:00
if ( ! email_exists ( $this -> posted [ $key ])) wp_update_user ( array ( 'ID' => $user_id , 'user_email' => $this -> posted [ $key ] ) ) ;
break ;
case " billing_first_name " :
wp_update_user ( array ( 'ID' => $user_id , 'first_name' => $this -> posted [ $key ] ) ) ;
break ;
case " billing_last_name " :
wp_update_user ( array ( 'ID' => $user_id , 'last_name' => $this -> posted [ $key ] ) ) ;
break ;
}
2012-04-21 18:30:37 +00:00
}
}
}
if ( $this -> checkout_fields [ 'shipping' ] && ( $woocommerce -> cart -> needs_shipping () || get_option ( 'woocommerce_require_shipping_address' ) == 'yes' ) ) {
foreach ( $this -> checkout_fields [ 'shipping' ] as $key => $field ) {
if ( $this -> posted [ 'shiptobilling' ] ) {
2012-01-12 00:54:45 +00:00
$field_key = str_replace ( 'shipping_' , 'billing_' , $key );
2012-01-12 00:43:30 +00:00
2012-01-12 00:30:21 +00:00
// Post
2012-01-12 00:54:45 +00:00
update_post_meta ( $order_id , '_' . $key , $this -> posted [ $field_key ] );
2012-04-21 18:30:37 +00:00
} else {
2012-01-12 00:54:45 +00:00
// Post
update_post_meta ( $order_id , '_' . $key , $this -> posted [ $key ] );
2012-01-12 00:43:30 +00:00
2012-01-12 00:54:45 +00:00
// User
2012-04-21 18:30:37 +00:00
if ( $user_id > 0 )
2012-01-12 00:54:45 +00:00
update_user_meta ( $user_id , $key , $this -> posted [ $key ] );
2012-04-21 18:30:37 +00:00
}
}
}
2012-01-12 00:54:45 +00:00
2012-01-13 00:46:56 +00:00
// Save any other user meta
if ( $user_id ) do_action ( 'woocommerce_checkout_update_user_meta' , $user_id , $this -> posted );
2012-01-27 15:00:03 +00:00
// Prepare order taxes for storage
2012-01-12 00:54:45 +00:00
$order_taxes = array ();
2012-01-27 15:00:03 +00:00
foreach ( array_keys ( $woocommerce -> cart -> taxes + $woocommerce -> cart -> shipping_taxes ) as $key ) {
2011-12-31 19:03:41 +00:00
2012-01-12 00:54:45 +00:00
$is_compound = ( $woocommerce -> cart -> tax -> is_compound ( $key )) ? 1 : 0 ;
2011-08-29 16:09:42 +00:00
2012-01-27 15:00:03 +00:00
$cart_tax = ( isset ( $woocommerce -> cart -> taxes [ $key ])) ? $woocommerce -> cart -> taxes [ $key ] : 0 ;
$shipping_tax = ( isset ( $woocommerce -> cart -> shipping_taxes [ $key ])) ? $woocommerce -> cart -> shipping_taxes [ $key ] : 0 ;
2012-01-12 00:54:45 +00:00
$order_taxes [] = array (
'label' => $woocommerce -> cart -> tax -> get_rate_label ( $key ),
'compound' => $is_compound ,
2012-01-27 15:00:03 +00:00
'cart_tax' => number_format ( $cart_tax , 2 , '.' , '' ),
'shipping_tax' => number_format ( $shipping_tax , 2 , '.' , '' )
2012-01-12 00:54:45 +00:00
);
2012-01-27 15:00:03 +00:00
}
2012-05-25 11:10:17 +00:00
2012-01-12 00:54:45 +00:00
// Save other order meta fields
update_post_meta ( $order_id , '_shipping_method' , $this -> posted [ 'shipping_method' ]);
update_post_meta ( $order_id , '_payment_method' , $this -> posted [ 'payment_method' ]);
update_post_meta ( $order_id , '_shipping_method_title' , $shipping_method );
update_post_meta ( $order_id , '_payment_method_title' , $payment_method );
2012-05-10 11:45:14 +00:00
update_post_meta ( $order_id , '_order_shipping' , number_format ( ( float ) $woocommerce -> cart -> shipping_total , 2 , '.' , '' ));
update_post_meta ( $order_id , '_order_discount' , number_format ( ( float ) $woocommerce -> cart -> get_order_discount_total (), 2 , '.' , '' ));
update_post_meta ( $order_id , '_cart_discount' , number_format ( ( float ) $woocommerce -> cart -> get_cart_discount_total (), 2 , '.' , '' ));
update_post_meta ( $order_id , '_order_tax' , number_format ( ( float ) $woocommerce -> cart -> tax_total , 2 , '.' , '' ));
update_post_meta ( $order_id , '_order_shipping_tax' , number_format ( ( float ) $woocommerce -> cart -> shipping_tax_total , 2 , '.' , '' ));
update_post_meta ( $order_id , '_order_total' , number_format ( ( float ) $woocommerce -> cart -> total , 2 , '.' , '' ));
2012-01-12 00:54:45 +00:00
update_post_meta ( $order_id , '_order_key' , apply_filters ( 'woocommerce_generate_order_key' , uniqid ( 'order_' ) ));
update_post_meta ( $order_id , '_customer_user' , ( int ) $user_id );
update_post_meta ( $order_id , '_order_items' , $order_items );
update_post_meta ( $order_id , '_order_taxes' , $order_taxes );
2012-04-16 15:27:18 +00:00
update_post_meta ( $order_id , '_order_currency' , get_woocommerce_currency () );
2012-01-22 02:36:26 +00:00
update_post_meta ( $order_id , '_prices_include_tax' , get_option ( 'woocommerce_prices_include_tax' ) );
2012-01-12 00:54:45 +00:00
do_action ( 'woocommerce_checkout_update_order_meta' , $order_id , $this -> posted );
// Order status
wp_set_object_terms ( $order_id , 'pending' , 'shop_order_status' );
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
// Discount code meta
if ( $applied_coupons = $woocommerce -> cart -> get_applied_coupons ()) update_post_meta ( $order_id , 'coupons' , implode ( ', ' , $applied_coupons ));
// Order is saved
do_action ( 'woocommerce_checkout_order_processed' , $order_id , $this -> posted );
2012-02-27 15:02:44 +00:00
// Prevent timeout
2012-03-02 12:01:49 +00:00
@ set_time_limit ( 0 );
2012-02-27 15:02:44 +00:00
2012-01-12 00:54:45 +00:00
// Process payment
if ( $woocommerce -> cart -> needs_payment ()) :
2011-10-09 13:23:20 +00:00
2012-01-12 00:54:45 +00:00
// Store Order ID in session so it can be re-used after payment failure
$_SESSION [ 'order_awaiting_payment' ] = $order_id ;
2012-01-10 16:43:06 +00:00
2012-01-12 00:54:45 +00:00
// Process Payment
$result = $available_gateways [ $this -> posted [ 'payment_method' ]] -> process_payment ( $order_id );
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
// Redirect to success/confirmation/payment page
if ( $result [ 'result' ] == 'success' ) :
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
$result = apply_filters ( 'woocommerce_payment_successful_result' , $result );
2011-08-09 15:16:18 +00:00
if ( is_ajax ()) :
2012-01-12 00:54:45 +00:00
echo json_encode ( $result );
2011-08-09 15:16:18 +00:00
exit ;
else :
2012-02-24 20:44:58 +00:00
wp_redirect ( $result [ 'redirect' ] );
2011-08-09 15:16:18 +00:00
exit ;
endif ;
endif ;
2012-01-12 00:54:45 +00:00
else :
2012-01-12 00:30:21 +00:00
2012-01-27 16:38:39 +00:00
$order = new WC_Order ( $order_id );
2012-01-12 00:54:45 +00:00
// No payment was required for order
$order -> payment_complete ();
// Empty the Cart
$woocommerce -> cart -> empty_cart ();
2012-03-05 13:25:02 +00:00
// Get redirect
$return_url = get_permalink ( woocommerce_get_page_id ( 'thanks' ));
$return_url = add_query_arg ( 'key' , $order -> order_key , add_query_arg ( 'order' , $order -> id , $return_url ));
2012-01-12 00:54:45 +00:00
// Redirect to success/confirmation/payment page
if ( is_ajax ()) :
2012-01-18 12:32:39 +00:00
echo json_encode (
array (
2012-03-16 15:09:12 +00:00
'result' => 'success' ,
2012-03-05 13:25:02 +00:00
'redirect' => apply_filters ( 'woocommerce_checkout_no_payment_needed_redirect' , $return_url , $order )
2012-01-18 12:32:39 +00:00
)
);
2012-01-12 00:54:45 +00:00
exit ;
else :
2012-01-18 12:32:39 +00:00
wp_safe_redirect (
2012-03-05 13:25:02 +00:00
apply_filters ( 'woocommerce_checkout_no_payment_needed_redirect' , $return_url , $order )
2012-01-18 12:32:39 +00:00
);
2012-01-12 00:54:45 +00:00
exit ;
endif ;
endif ;
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
// Break out of loop
break ;
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
endwhile ;
endif ;
2011-08-09 15:16:18 +00:00
2012-01-12 00:54:45 +00:00
// If we reached this point then there were errors
if ( is_ajax ()) :
2012-03-14 11:16:26 +00:00
ob_start ();
2012-01-12 00:54:45 +00:00
$woocommerce -> show_messages ();
2012-03-14 11:16:26 +00:00
$messages = ob_get_clean ();
echo json_encode (
array (
'result' => 'failure' ,
'messages' => $messages ,
'refresh' => ( isset ( $_SESSION [ 'refresh_totals' ])) ? 'true' : 'false'
)
);
unset ( $_SESSION [ 'refresh_totals' ]);
2012-01-12 00:54:45 +00:00
exit ;
2011-08-09 15:16:18 +00:00
endif ;
}
/** Gets the value either from the posted data, or from the users meta data */
function get_value ( $input ) {
2012-01-04 16:24:26 +00:00
global $woocommerce ;
2012-01-13 11:44:35 +00:00
if ( isset ( $_POST [ $input ] ) && ! empty ( $_POST [ $input ])) :
2012-02-18 10:08:12 +00:00
2012-01-13 11:44:35 +00:00
return esc_attr ( $_POST [ $input ]);
2012-02-18 10:08:12 +00:00
2011-08-09 15:16:18 +00:00
elseif ( is_user_logged_in ()) :
2012-02-18 10:08:12 +00:00
2011-12-15 19:22:15 +00:00
if ( $meta = get_user_meta ( get_current_user_id (), $input , true )) return $meta ;
2011-08-09 15:16:18 +00:00
$current_user = wp_get_current_user ();
2011-12-21 16:03:45 +00:00
if ( $input == " billing_email " ) :
return $current_user -> user_email ;
endif ;
2011-11-16 15:25:45 +00:00
else :
2012-02-18 10:08:12 +00:00
2012-03-07 13:07:56 +00:00
$default_billing_country = apply_filters ( 'default_checkout_country' , ( $woocommerce -> customer -> get_country ()) ? $woocommerce -> customer -> get_country () : $woocommerce -> countries -> get_base_country ());
$default_shipping_country = apply_filters ( 'default_checkout_country' , ( $woocommerce -> customer -> get_shipping_country ()) ? $woocommerce -> customer -> get_shipping_country () : $woocommerce -> countries -> get_base_country ());
2012-05-09 17:29:22 +00:00
if ( $woocommerce -> customer -> has_calculated_shipping () ) {
2012-04-19 11:09:52 +00:00
$default_billing_state = apply_filters ( 'default_checkout_state' , $woocommerce -> customer -> get_state ());
$default_shipping_state = apply_filters ( 'default_checkout_state' , $woocommerce -> customer -> get_shipping_state ());
2012-05-09 17:29:22 +00:00
} else {
$default_billing_state = apply_filters ( 'default_checkout_state' , '' );
$default_shipping_state = apply_filters ( 'default_checkout_state' , '' );
2012-04-19 11:09:52 +00:00
}
2012-03-07 13:07:56 +00:00
if ( $input == " billing_country " ) return $default_billing_country ;
if ( $input == " billing_state " ) return $default_billing_state ;
2012-02-18 10:08:12 +00:00
if ( $input == " billing_postcode " ) return ( $woocommerce -> customer -> get_postcode ()) ? $woocommerce -> customer -> get_postcode () : '' ;
2012-03-07 13:07:56 +00:00
if ( $input == " shipping_country " ) return $default_shipping_country ;
2012-02-18 10:08:12 +00:00
2012-03-07 13:07:56 +00:00
if ( $input == " shipping_state " ) return $default_shipping_state ;
2012-02-18 10:08:12 +00:00
if ( $input == " shipping_postcode " ) return ( $woocommerce -> customer -> get_shipping_postcode ()) ? $woocommerce -> customer -> get_shipping_postcode () : '' ;
2011-11-16 15:25:45 +00:00
2011-08-09 15:16:18 +00:00
endif ;
}
2012-01-27 16:38:39 +00:00
}
/** Depreciated */
class woocommerce_checkout extends WC_Checkout {
public function __construct () {
_deprecated_function ( 'woocommerce_checkout' , '1.4' , 'WC_Checkout()' );
parent :: __construct ();
}
2011-08-09 15:16:18 +00:00
}