2013-08-09 16:11:15 +00:00
< ? php
2014-02-07 18:35:30 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
exit ; // Exit if accessed directly
}
2013-08-09 16:11:15 +00:00
/**
2015-11-03 13:31:20 +00:00
* Handle frontend forms .
2013-08-09 16:11:15 +00:00
*
* @ class WC_Form_Handler
2014-05-28 13:52:50 +00:00
* @ version 2.2 . 0
2013-08-09 16:11:15 +00:00
* @ package WooCommerce / Classes /
* @ category Class
* @ author WooThemes
*/
class WC_Form_Handler {
/**
2015-11-03 13:31:20 +00:00
* Hook in methods .
2013-08-09 16:11:15 +00:00
*/
2014-05-28 13:52:50 +00:00
public static function init () {
2016-06-24 14:06:01 +00:00
add_action ( 'template_redirect' , array ( __CLASS__ , 'redirect_reset_password_link' ) );
2014-05-28 13:52:50 +00:00
add_action ( 'template_redirect' , array ( __CLASS__ , 'save_address' ) );
add_action ( 'template_redirect' , array ( __CLASS__ , 'save_account_details' ) );
2015-01-05 14:43:01 +00:00
add_action ( 'wp_loaded' , array ( __CLASS__ , 'checkout_action' ), 20 );
add_action ( 'wp_loaded' , array ( __CLASS__ , 'process_login' ), 20 );
add_action ( 'wp_loaded' , array ( __CLASS__ , 'process_registration' ), 20 );
2015-01-21 14:15:49 +00:00
add_action ( 'wp_loaded' , array ( __CLASS__ , 'process_lost_password' ), 20 );
2015-01-05 14:43:01 +00:00
add_action ( 'wp_loaded' , array ( __CLASS__ , 'process_reset_password' ), 20 );
add_action ( 'wp_loaded' , array ( __CLASS__ , 'cancel_order' ), 20 );
add_action ( 'wp_loaded' , array ( __CLASS__ , 'order_again' ), 20 );
add_action ( 'wp_loaded' , array ( __CLASS__ , 'update_cart_action' ), 20 );
add_action ( 'wp_loaded' , array ( __CLASS__ , 'add_to_cart_action' ), 20 );
2015-02-10 12:23:15 +00:00
2016-03-08 18:54:19 +00:00
// May need $wp global to access query vars.
2015-02-10 12:23:15 +00:00
add_action ( 'wp' , array ( __CLASS__ , 'pay_action' ), 20 );
add_action ( 'wp' , array ( __CLASS__ , 'add_payment_method_action' ), 20 );
2016-05-26 13:50:22 +00:00
add_action ( 'wp' , array ( __CLASS__ , 'delete_payment_method_action' ), 20 );
add_action ( 'wp' , array ( __CLASS__ , 'set_default_payment_method_action' ), 20 );
2013-08-09 16:11:15 +00:00
}
2016-06-24 14:06:01 +00:00
/**
* Remove key and login from querystring , set cookie , and redirect to account page to show the form .
*/
public static function redirect_reset_password_link () {
if ( is_account_page () && ! empty ( $_GET [ 'key' ] ) && ! empty ( $_GET [ 'login' ] ) ) {
$value = sprintf ( '%s:%s' , wp_unslash ( $_GET [ 'login' ] ), wp_unslash ( $_GET [ 'key' ] ) );
WC_Shortcode_My_Account :: set_reset_password_cookie ( $value );
wp_safe_redirect ( add_query_arg ( 'show-reset-form' , 'true' , wc_lostpassword_url () ) );
exit ;
}
}
2013-08-09 16:11:15 +00:00
/**
2016-03-08 18:54:19 +00:00
* Save and and update a billing or shipping address if the
2013-08-09 16:11:15 +00:00
* form was submitted through the user account page .
*/
2014-05-28 13:52:50 +00:00
public static function save_address () {
global $wp ;
2013-08-09 16:11:15 +00:00
2016-03-08 18:54:19 +00:00
if ( 'POST' !== strtoupper ( $_SERVER [ 'REQUEST_METHOD' ] ) ) {
2013-08-09 16:11:15 +00:00
return ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2016-03-08 18:54:19 +00:00
if ( empty ( $_POST [ 'action' ] ) || 'edit_address' !== $_POST [ 'action' ] || empty ( $_POST [ '_wpnonce' ] ) || ! wp_verify_nonce ( $_POST [ '_wpnonce' ], 'woocommerce-edit_address' ) ) {
2013-08-09 16:11:15 +00:00
return ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
$user_id = get_current_user_id ();
2014-02-07 18:35:30 +00:00
if ( $user_id <= 0 ) {
2013-09-19 13:39:49 +00:00
return ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2014-10-22 10:26:09 +00:00
$load_address = isset ( $wp -> query_vars [ 'edit-address' ] ) ? wc_edit_address_i18n ( sanitize_title ( $wp -> query_vars [ 'edit-address' ] ), true ) : 'billing' ;
2013-08-09 16:11:15 +00:00
2013-11-25 14:01:32 +00:00
$address = WC () -> countries -> get_address_fields ( esc_attr ( $_POST [ $load_address . '_country' ] ), $load_address . '_' );
2013-08-09 16:11:15 +00:00
2013-09-19 13:39:49 +00:00
foreach ( $address as $key => $field ) {
2013-08-09 16:11:15 +00:00
2014-02-07 18:35:30 +00:00
if ( ! isset ( $field [ 'type' ] ) ) {
2013-09-19 13:39:49 +00:00
$field [ 'type' ] = 'text' ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2016-03-08 18:54:19 +00:00
// Get Value.
2013-09-19 13:39:49 +00:00
switch ( $field [ 'type' ] ) {
2016-03-08 18:54:19 +00:00
case 'checkbox' :
2013-09-19 13:39:49 +00:00
$_POST [ $key ] = isset ( $_POST [ $key ] ) ? 1 : 0 ;
2013-08-09 16:11:15 +00:00
break ;
default :
2013-11-25 13:34:21 +00:00
$_POST [ $key ] = isset ( $_POST [ $key ] ) ? wc_clean ( $_POST [ $key ] ) : '' ;
2013-08-09 16:11:15 +00:00
break ;
2013-09-19 13:39:49 +00:00
}
2013-08-09 16:11:15 +00:00
2016-03-08 18:54:19 +00:00
// Hook to allow modification of value.
2013-09-19 13:39:49 +00:00
$_POST [ $key ] = apply_filters ( 'woocommerce_process_myaccount_field_' . $key , $_POST [ $key ] );
2013-08-09 16:11:15 +00:00
2016-03-08 18:54:19 +00:00
// Validation: Required fields.
2014-02-07 18:35:30 +00:00
if ( ! empty ( $field [ 'required' ] ) && empty ( $_POST [ $key ] ) ) {
2013-11-13 04:29:03 +00:00
wc_add_notice ( $field [ 'label' ] . ' ' . __ ( 'is a required field.' , 'woocommerce' ), 'error' );
2014-02-07 18:35:30 +00:00
}
2013-09-19 13:39:49 +00:00
2014-06-25 10:06:42 +00:00
if ( ! empty ( $_POST [ $key ] ) ) {
2014-06-20 09:28:04 +00:00
// Validation rules
if ( ! empty ( $field [ 'validate' ] ) && is_array ( $field [ 'validate' ] ) ) {
foreach ( $field [ 'validate' ] as $rule ) {
switch ( $rule ) {
case 'postcode' :
$_POST [ $key ] = strtoupper ( str_replace ( ' ' , '' , $_POST [ $key ] ) );
if ( ! WC_Validation :: is_postcode ( $_POST [ $key ], $_POST [ $load_address . '_country' ] ) ) {
wc_add_notice ( __ ( 'Please enter a valid postcode/ZIP.' , 'woocommerce' ), 'error' );
} else {
$_POST [ $key ] = wc_format_postcode ( $_POST [ $key ], $_POST [ $load_address . '_country' ] );
}
break ;
case 'phone' :
$_POST [ $key ] = wc_format_phone_number ( $_POST [ $key ] );
2013-09-19 13:39:49 +00:00
2014-06-20 09:28:04 +00:00
if ( ! WC_Validation :: is_phone ( $_POST [ $key ] ) ) {
wc_add_notice ( '<strong>' . $field [ 'label' ] . '</strong> ' . __ ( 'is not a valid phone number.' , 'woocommerce' ), 'error' );
}
break ;
case 'email' :
$_POST [ $key ] = strtolower ( $_POST [ $key ] );
2013-09-19 13:39:49 +00:00
2014-06-20 09:28:04 +00:00
if ( ! is_email ( $_POST [ $key ] ) ) {
wc_add_notice ( '<strong>' . $field [ 'label' ] . '</strong> ' . __ ( 'is not a valid email address.' , 'woocommerce' ), 'error' );
}
break ;
}
2013-09-19 13:39:49 +00:00
}
}
}
}
2013-08-09 16:11:15 +00:00
2013-11-27 16:15:53 +00:00
if ( wc_notice_count ( 'error' ) == 0 ) {
2013-08-09 16:11:15 +00:00
2014-02-07 18:35:30 +00:00
foreach ( $address as $key => $field ) {
2013-09-19 13:39:49 +00:00
update_user_meta ( $user_id , $key , $_POST [ $key ] );
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2013-11-13 04:32:29 +00:00
wc_add_notice ( __ ( 'Address changed successfully.' , 'woocommerce' ) );
2013-08-09 16:11:15 +00:00
2013-09-10 13:31:13 +00:00
do_action ( 'woocommerce_customer_save_address' , $user_id , $load_address );
2013-08-09 16:11:15 +00:00
2016-03-08 18:54:19 +00:00
wp_safe_redirect ( wc_get_page_permalink ( 'myaccount' ) );
2013-08-09 16:11:15 +00:00
exit ;
}
}
/**
* Save the password / account details and redirect back to the my account page .
*/
2014-05-28 13:52:50 +00:00
public static function save_account_details () {
2013-08-09 16:11:15 +00:00
2014-02-07 18:35:30 +00:00
if ( 'POST' !== strtoupper ( $_SERVER [ 'REQUEST_METHOD' ] ) ) {
2013-08-09 16:11:15 +00:00
return ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2014-10-28 09:40:50 +00:00
if ( empty ( $_POST [ 'action' ] ) || 'save_account_details' !== $_POST [ 'action' ] || empty ( $_POST [ '_wpnonce' ] ) || ! wp_verify_nonce ( $_POST [ '_wpnonce' ], 'save_account_details' ) ) {
2013-08-09 16:11:15 +00:00
return ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
$errors = new WP_Error ();
$user = new stdClass ();
$user -> ID = ( int ) get_current_user_id ();
$current_user = get_user_by ( 'id' , $user -> ID );
2014-02-07 18:35:30 +00:00
if ( $user -> ID <= 0 ) {
2013-08-09 16:11:15 +00:00
return ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2013-11-25 13:34:21 +00:00
$account_first_name = ! empty ( $_POST [ 'account_first_name' ] ) ? wc_clean ( $_POST [ 'account_first_name' ] ) : '' ;
$account_last_name = ! empty ( $_POST [ 'account_last_name' ] ) ? wc_clean ( $_POST [ 'account_last_name' ] ) : '' ;
2014-04-14 06:29:22 +00:00
$account_email = ! empty ( $_POST [ 'account_email' ] ) ? sanitize_email ( $_POST [ 'account_email' ] ) : '' ;
2014-04-22 19:01:57 +00:00
$pass_cur = ! empty ( $_POST [ 'password_current' ] ) ? $_POST [ 'password_current' ] : '' ;
2014-04-14 06:29:22 +00:00
$pass1 = ! empty ( $_POST [ 'password_1' ] ) ? $_POST [ 'password_1' ] : '' ;
$pass2 = ! empty ( $_POST [ 'password_2' ] ) ? $_POST [ 'password_2' ] : '' ;
2014-04-22 19:01:57 +00:00
$save_pass = true ;
2013-08-09 16:11:15 +00:00
$user -> first_name = $account_first_name ;
$user -> last_name = $account_last_name ;
2015-07-10 10:09:14 +00:00
// Prevent emails being displayed, or leave alone.
2015-08-17 11:02:16 +00:00
$user -> display_name = is_email ( $current_user -> display_name ) ? $user -> first_name : $current_user -> display_name ;
2013-08-09 16:11:15 +00:00
2015-09-07 14:21:54 +00:00
// Handle required fields
$required_fields = apply_filters ( 'woocommerce_save_account_details_required_fields' , array (
'account_first_name' => __ ( 'First Name' , 'woocommerce' ),
'account_last_name' => __ ( 'Last Name' , 'woocommerce' ),
'account_email' => __ ( 'Email address' , 'woocommerce' ),
) );
foreach ( $required_fields as $field_key => $field_name ) {
2016-02-11 14:21:43 +00:00
$value = wc_clean ( $_POST [ $field_key ] );
if ( empty ( $value ) ) {
2015-09-07 14:21:54 +00:00
wc_add_notice ( '<strong>' . esc_html ( $field_name ) . '</strong> ' . __ ( 'is a required field.' , 'woocommerce' ), 'error' );
}
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2015-09-07 14:21:54 +00:00
if ( $account_email ) {
if ( ! is_email ( $account_email ) ) {
wc_add_notice ( __ ( 'Please provide a valid email address.' , 'woocommerce' ), 'error' );
} elseif ( email_exists ( $account_email ) && $account_email !== $current_user -> user_email ) {
wc_add_notice ( __ ( 'This email address is already registered.' , 'woocommerce' ), 'error' );
}
$user -> user_email = $account_email ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2014-04-22 19:01:57 +00:00
if ( ! empty ( $pass1 ) && ! wp_check_password ( $pass_cur , $current_user -> user_pass , $current_user -> ID ) ) {
wc_add_notice ( __ ( 'Your current password is incorrect.' , 'woocommerce' ), 'error' );
$save_pass = false ;
}
if ( ! empty ( $pass_cur ) && empty ( $pass1 ) && empty ( $pass2 ) ) {
wc_add_notice ( __ ( 'Please fill out all password fields.' , 'woocommerce' ), 'error' );
$save_pass = false ;
} elseif ( ! empty ( $pass1 ) && empty ( $pass_cur ) ) {
wc_add_notice ( __ ( 'Please enter your current password.' , 'woocommerce' ), 'error' );
$save_pass = false ;
} elseif ( ! empty ( $pass1 ) && empty ( $pass2 ) ) {
2013-11-13 04:29:03 +00:00
wc_add_notice ( __ ( 'Please re-enter your password.' , 'woocommerce' ), 'error' );
2014-04-22 19:01:57 +00:00
$save_pass = false ;
2015-04-30 05:07:34 +00:00
} elseif ( ( ! empty ( $pass1 ) || ! empty ( $pass2 ) ) && $pass1 !== $pass2 ) {
wc_add_notice ( __ ( 'New passwords do not match.' , 'woocommerce' ), 'error' );
2014-04-22 19:01:57 +00:00
$save_pass = false ;
}
if ( $pass1 && $save_pass ) {
$user -> user_pass = $pass1 ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
// Allow plugins to return their own errors.
2015-07-10 10:11:51 +00:00
do_action_ref_array ( 'woocommerce_save_account_details_errors' , array ( & $errors , & $user ) );
2013-08-09 16:11:15 +00:00
2014-02-07 18:35:30 +00:00
if ( $errors -> get_error_messages () ) {
foreach ( $errors -> get_error_messages () as $error ) {
2013-11-13 04:29:03 +00:00
wc_add_notice ( $error , 'error' );
2014-02-07 18:35:30 +00:00
}
}
2013-08-09 16:11:15 +00:00
2014-04-22 19:01:57 +00:00
if ( wc_notice_count ( 'error' ) === 0 ) {
2013-08-09 16:11:15 +00:00
wp_update_user ( $user ) ;
2013-11-13 04:32:29 +00:00
wc_add_notice ( __ ( 'Account details changed successfully.' , 'woocommerce' ) );
2013-08-09 16:11:15 +00:00
do_action ( 'woocommerce_save_account_details' , $user -> ID );
2015-02-15 19:13:22 +00:00
wp_safe_redirect ( wc_get_page_permalink ( 'myaccount' ) );
2013-08-09 16:11:15 +00:00
exit ;
}
}
/**
* Process the checkout form .
*/
2014-05-28 13:52:50 +00:00
public static function checkout_action () {
2013-08-09 16:11:15 +00:00
if ( isset ( $_POST [ 'woocommerce_checkout_place_order' ] ) || isset ( $_POST [ 'woocommerce_checkout_update_totals' ] ) ) {
2015-05-14 21:18:53 +00:00
if ( WC () -> cart -> is_empty () ) {
2015-02-15 19:13:22 +00:00
wp_redirect ( wc_get_page_permalink ( 'cart' ) );
2013-08-09 16:11:15 +00:00
exit ;
}
2014-02-07 18:35:30 +00:00
if ( ! defined ( 'WOOCOMMERCE_CHECKOUT' ) ) {
2013-08-09 16:11:15 +00:00
define ( 'WOOCOMMERCE_CHECKOUT' , true );
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2014-05-28 13:52:50 +00:00
WC () -> checkout () -> process_checkout ();
2013-08-09 16:11:15 +00:00
}
}
/**
* Process the pay form .
*/
2014-05-28 13:52:50 +00:00
public static function pay_action () {
2013-08-09 16:11:15 +00:00
global $wp ;
2014-03-06 13:11:20 +00:00
if ( isset ( $_POST [ 'woocommerce_pay' ] ) && isset ( $_POST [ '_wpnonce' ] ) && wp_verify_nonce ( $_POST [ '_wpnonce' ], 'woocommerce-pay' ) ) {
2013-08-09 16:11:15 +00:00
ob_start ();
// Pay for existing order
2014-04-17 16:27:39 +00:00
$order_key = $_GET [ 'key' ];
$order_id = absint ( $wp -> query_vars [ 'order-pay' ] );
2014-08-15 12:29:21 +00:00
$order = wc_get_order ( $order_id );
2014-04-24 21:18:41 +00:00
2015-09-05 12:09:47 +00:00
if ( $order -> id == $order_id && $order -> order_key == $order_key && $order -> needs_payment () ) {
2013-08-09 16:11:15 +00:00
2016-02-05 18:44:55 +00:00
do_action ( 'woocommerce_before_pay_action' , $order );
2013-08-09 16:11:15 +00:00
// Set customer location to order location
2014-02-07 18:35:30 +00:00
if ( $order -> billing_country ) {
2013-08-09 16:11:15 +00:00
WC () -> customer -> set_country ( $order -> billing_country );
2014-02-07 18:35:30 +00:00
}
if ( $order -> billing_state ) {
2013-08-09 16:11:15 +00:00
WC () -> customer -> set_state ( $order -> billing_state );
2014-02-07 18:35:30 +00:00
}
if ( $order -> billing_postcode ) {
2013-08-09 16:11:15 +00:00
WC () -> customer -> set_postcode ( $order -> billing_postcode );
2014-02-07 18:35:30 +00:00
}
if ( $order -> billing_city ) {
2013-08-09 16:11:15 +00:00
WC () -> customer -> set_city ( $order -> billing_city );
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2015-10-06 11:33:45 +00:00
// Terms
if ( ! empty ( $_POST [ 'terms-field' ] ) && empty ( $_POST [ 'terms' ] ) ) {
wc_add_notice ( __ ( 'You must accept our Terms & Conditions.' , 'woocommerce' ), 'error' );
return ;
}
2013-08-09 16:11:15 +00:00
// Update payment method
2013-10-16 13:14:15 +00:00
if ( $order -> needs_payment () ) {
2015-10-06 11:33:45 +00:00
$payment_method = isset ( $_POST [ 'payment_method' ] ) ? wc_clean ( $_POST [ 'payment_method' ] ) : false ;
2013-08-09 16:11:15 +00:00
$available_gateways = WC () -> payment_gateways -> get_available_payment_gateways ();
2015-10-06 11:33:45 +00:00
if ( ! $payment_method ) {
wc_add_notice ( __ ( 'Invalid payment method.' , 'woocommerce' ), 'error' );
return ;
}
2013-08-09 16:11:15 +00:00
// Update meta
update_post_meta ( $order_id , '_payment_method' , $payment_method );
2014-02-07 18:35:30 +00:00
if ( isset ( $available_gateways [ $payment_method ] ) ) {
2013-08-09 16:11:15 +00:00
$payment_method_title = $available_gateways [ $payment_method ] -> get_title ();
2015-02-03 14:57:04 +00:00
} else {
$payment_method_title = '' ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2015-02-03 14:57:04 +00:00
update_post_meta ( $order_id , '_payment_method_title' , $payment_method_title );
2013-08-09 16:11:15 +00:00
// Validate
$available_gateways [ $payment_method ] -> validate_fields ();
// Process
2013-11-27 16:15:53 +00:00
if ( wc_notice_count ( 'error' ) == 0 ) {
2013-08-09 16:11:15 +00:00
$result = $available_gateways [ $payment_method ] -> process_payment ( $order_id );
// Redirect to success/confirmation/payment page
2015-12-03 10:51:07 +00:00
if ( 'success' === $result [ 'result' ] ) {
2013-08-09 16:11:15 +00:00
wp_redirect ( $result [ 'redirect' ] );
exit ;
}
}
} else {
// No payment was required for order
$order -> payment_complete ();
wp_safe_redirect ( $order -> get_checkout_order_received_url () );
exit ;
}
2016-02-05 18:44:55 +00:00
do_action ( 'woocommerce_after_pay_action' , $order );
}
2016-02-05 00:44:19 +00:00
2013-08-09 16:11:15 +00:00
}
}
2013-11-01 17:08:44 +00:00
/**
* Process the add payment method form .
*/
2014-05-28 13:52:50 +00:00
public static function add_payment_method_action () {
2016-01-20 10:47:33 +00:00
if ( isset ( $_POST [ 'woocommerce_add_payment_method' ], $_POST [ 'payment_method' ], $_POST [ '_wpnonce' ] ) && wp_verify_nonce ( $_POST [ '_wpnonce' ], 'woocommerce-add-payment-method' ) ) {
2013-11-01 17:08:44 +00:00
ob_start ();
2013-11-25 13:34:21 +00:00
$payment_method = wc_clean ( $_POST [ 'payment_method' ] );
2013-11-01 17:08:44 +00:00
$available_gateways = WC () -> payment_gateways -> get_available_payment_gateways ();
// Validate
$available_gateways [ $payment_method ] -> validate_fields ();
// Process
2015-02-26 15:18:11 +00:00
if ( wc_notice_count ( 'wc_errors' ) == 0 ) {
2013-11-01 17:08:44 +00:00
$result = $available_gateways [ $payment_method ] -> add_payment_method ();
// Redirect to success/confirmation/payment page
if ( $result [ 'result' ] == 'success' ) {
2016-02-17 14:49:47 +00:00
wc_add_notice ( __ ( 'Payment method added.' , 'woocommerce' ) );
2013-11-05 04:54:18 +00:00
wp_redirect ( $result [ 'redirect' ] );
2013-11-01 21:14:00 +00:00
exit ();
2013-11-01 17:08:44 +00:00
}
}
}
}
2016-05-26 13:50:22 +00:00
/**
* Process the delete payment method form .
*/
public static function delete_payment_method_action () {
global $wp ;
if ( isset ( $wp -> query_vars [ 'delete-payment-method' ] ) ) {
$token_id = absint ( $wp -> query_vars [ 'delete-payment-method' ] );
$token = WC_Payment_Tokens :: get ( $token_id );
$delete = true ;
if ( is_null ( $token ) ) {
wc_add_notice ( __ ( 'Invalid payment method' , 'woocommerce' ), 'error' );
$delete = false ;
}
if ( get_current_user_id () !== $token -> get_user_id () ) {
wc_add_notice ( __ ( 'Invalid payment method' , 'woocommerce' ), 'error' );
$delete = false ;
}
if ( false === wp_verify_nonce ( $_REQUEST [ '_wpnonce' ], 'delete-payment-method-' . $token_id ) ) {
wc_add_notice ( __ ( 'Invalid payment method' , 'woocommerce' ), 'error' );
$delete = false ;
}
if ( $delete ) {
WC_Payment_Tokens :: delete ( $token_id );
wc_add_notice ( __ ( 'Payment method deleted.' , 'woocommerce' ) );
}
wp_redirect ( wc_get_account_endpoint_url ( 'payment-methods' ) );
exit ();
}
}
/**
* Process the delete payment method form .
*/
public static function set_default_payment_method_action () {
global $wp ;
if ( isset ( $wp -> query_vars [ 'set-default-payment-method' ] ) ) {
$token_id = absint ( $wp -> query_vars [ 'set-default-payment-method' ] );
$token = WC_Payment_Tokens :: get ( $token_id );
$delete = true ;
if ( is_null ( $token ) ) {
wc_add_notice ( __ ( 'Invalid payment method' , 'woocommerce' ), 'error' );
$delete = false ;
}
if ( get_current_user_id () !== $token -> get_user_id () ) {
wc_add_notice ( __ ( 'Invalid payment method' , 'woocommerce' ), 'error' );
$delete = false ;
}
if ( false === wp_verify_nonce ( $_REQUEST [ '_wpnonce' ], 'set-default-payment-method-' . $token_id ) ) {
wc_add_notice ( __ ( 'Invalid payment method' , 'woocommerce' ), 'error' );
$delete = false ;
}
if ( $delete ) {
WC_Payment_Tokens :: set_users_default ( $token -> get_user_id (), intval ( $token_id ) );
wc_add_notice ( __ ( 'This payment method was successfully set as your default.' , 'woocommerce' ) );
}
wp_redirect ( wc_get_account_endpoint_url ( 'payment-methods' ) );
exit ();
}
}
2013-08-09 16:11:15 +00:00
/**
* Remove from cart / update .
*/
2014-05-28 13:52:50 +00:00
public static function update_cart_action () {
2013-12-31 14:02:50 +00:00
// Add Discount
if ( ! empty ( $_POST [ 'apply_coupon' ] ) && ! empty ( $_POST [ 'coupon_code' ] ) ) {
WC () -> cart -> add_discount ( sanitize_text_field ( $_POST [ 'coupon_code' ] ) );
}
// Remove Coupon Codes
elseif ( isset ( $_GET [ 'remove_coupon' ] ) ) {
WC () -> cart -> remove_coupon ( wc_clean ( $_GET [ 'remove_coupon' ] ) );
}
2013-08-09 16:11:15 +00:00
// Remove from cart
2014-03-06 13:11:20 +00:00
elseif ( ! empty ( $_GET [ 'remove_item' ] ) && isset ( $_GET [ '_wpnonce' ] ) && wp_verify_nonce ( $_GET [ '_wpnonce' ], 'woocommerce-cart' ) ) {
2015-02-16 11:31:33 +00:00
$cart_item_key = sanitize_text_field ( $_GET [ 'remove_item' ] );
2013-08-09 16:11:15 +00:00
2015-02-16 11:31:33 +00:00
if ( $cart_item = WC () -> cart -> get_cart_item ( $cart_item_key ) ) {
WC () -> cart -> remove_cart_item ( $cart_item_key );
2013-08-09 16:11:15 +00:00
2015-02-16 11:31:33 +00:00
$product = wc_get_product ( $cart_item [ 'product_id' ] );
2013-08-09 16:11:15 +00:00
2015-09-11 08:22:09 +00:00
$item_removed_title = apply_filters ( 'woocommerce_cart_item_removed_title' , $product ? $product -> get_title () : __ ( 'Item' , 'woocommerce' ), $cart_item );
// Don't show undo link if removed item is out of stock.
if ( $product -> is_in_stock () && $product -> has_enough_stock ( $cart_item [ 'quantity' ] ) ) {
2016-04-25 12:07:38 +00:00
$removed_notice = sprintf ( __ ( '%s removed.' , 'woocommerce' ), $item_removed_title );
$removed_notice .= ' <a href="' . esc_url ( WC () -> cart -> get_undo_url ( $cart_item_key ) ) . '">' . __ ( 'Undo?' , 'woocommerce' ) . '</a>' ;
2015-09-11 08:22:09 +00:00
} else {
2016-04-25 12:07:38 +00:00
$removed_notice = sprintf ( __ ( '%s removed.' , 'woocommerce' ), $item_removed_title );
2015-09-11 08:22:09 +00:00
}
2016-04-25 12:07:38 +00:00
wc_add_notice ( $removed_notice );
2015-02-16 11:31:33 +00:00
}
2014-11-18 16:31:06 +00:00
2015-10-28 17:56:31 +00:00
$referer = wp_get_referer () ? remove_query_arg ( array ( 'remove_item' , 'add-to-cart' , 'added-to-cart' ), add_query_arg ( 'removed_item' , '1' , wp_get_referer () ) ) : wc_get_cart_url ();
2013-08-09 16:11:15 +00:00
wp_safe_redirect ( $referer );
exit ;
2013-12-31 14:02:50 +00:00
}
2015-01-07 18:52:17 +00:00
// Undo Cart Item
2014-11-18 16:31:06 +00:00
elseif ( ! empty ( $_GET [ 'undo_item' ] ) && isset ( $_GET [ '_wpnonce' ] ) && wp_verify_nonce ( $_GET [ '_wpnonce' ], 'woocommerce-cart' ) ) {
2015-02-16 11:31:33 +00:00
$cart_item_key = sanitize_text_field ( $_GET [ 'undo_item' ] );
2014-11-18 16:31:06 +00:00
2015-01-07 18:52:17 +00:00
WC () -> cart -> restore_cart_item ( $cart_item_key );
2014-11-18 16:31:06 +00:00
2015-10-28 17:56:31 +00:00
$referer = wp_get_referer () ? remove_query_arg ( array ( 'undo_item' , '_wpnonce' ), wp_get_referer () ) : wc_get_cart_url ();
2014-11-18 16:31:06 +00:00
wp_safe_redirect ( $referer );
exit ;
}
2013-12-31 14:02:50 +00:00
// Update Cart - checks apply_coupon too because they are in the same form
2014-03-06 13:11:20 +00:00
if ( ( ! empty ( $_POST [ 'apply_coupon' ] ) || ! empty ( $_POST [ 'update_cart' ] ) || ! empty ( $_POST [ 'proceed' ] ) ) && isset ( $_POST [ '_wpnonce' ] ) && wp_verify_nonce ( $_POST [ '_wpnonce' ], 'woocommerce-cart' ) ) {
2013-08-09 16:11:15 +00:00
2013-12-31 14:02:50 +00:00
$cart_updated = false ;
$cart_totals = isset ( $_POST [ 'cart' ] ) ? $_POST [ 'cart' ] : '' ;
2013-08-09 16:11:15 +00:00
2015-05-14 21:18:53 +00:00
if ( ! WC () -> cart -> is_empty () && is_array ( $cart_totals ) ) {
2013-08-09 16:11:15 +00:00
foreach ( WC () -> cart -> get_cart () as $cart_item_key => $values ) {
$_product = $values [ 'data' ];
// Skip product if no updated quantity was posted
2014-10-09 15:50:42 +00:00
if ( ! isset ( $cart_totals [ $cart_item_key ] ) || ! isset ( $cart_totals [ $cart_item_key ][ 'qty' ] ) ) {
2013-08-09 16:11:15 +00:00
continue ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
// Sanitize
2014-06-25 10:25:28 +00:00
$quantity = apply_filters ( 'woocommerce_stock_amount_cart_item' , wc_stock_amount ( preg_replace ( " /[^0-9 \ .]/ " , '' , $cart_totals [ $cart_item_key ][ 'qty' ] ) ), $cart_item_key );
2013-08-09 16:11:15 +00:00
2014-02-07 18:35:30 +00:00
if ( '' === $quantity || $quantity == $values [ 'quantity' ] )
2013-08-09 16:11:15 +00:00
continue ;
// Update cart validation
2014-02-07 18:27:07 +00:00
$passed_validation = apply_filters ( 'woocommerce_update_cart_validation' , true , $cart_item_key , $values , $quantity );
2013-08-09 16:11:15 +00:00
2014-02-07 18:27:07 +00:00
// is_sold_individually
2013-08-09 16:11:15 +00:00
if ( $_product -> is_sold_individually () && $quantity > 1 ) {
2013-11-13 04:29:03 +00:00
wc_add_notice ( sprintf ( __ ( 'You can only have 1 %s in your cart.' , 'woocommerce' ), $_product -> get_title () ), 'error' );
2013-08-09 16:11:15 +00:00
$passed_validation = false ;
}
2014-02-07 18:35:30 +00:00
if ( $passed_validation ) {
2014-02-07 18:27:07 +00:00
WC () -> cart -> set_quantity ( $cart_item_key , $quantity , false );
2014-11-07 10:16:37 +00:00
$cart_updated = true ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
}
2014-02-26 12:14:50 +00:00
}
2014-03-03 15:15:32 +00:00
// Trigger action - let 3rd parties update the cart if they need to and update the $cart_updated variable
$cart_updated = apply_filters ( 'woocommerce_update_cart_action_cart_updated' , $cart_updated );
2013-08-19 14:19:44 +00:00
2014-03-03 15:15:32 +00:00
if ( $cart_updated ) {
2014-02-26 12:14:50 +00:00
// Recalc our totals
2013-08-19 14:19:44 +00:00
WC () -> cart -> calculate_totals ();
2013-08-09 16:11:15 +00:00
}
if ( ! empty ( $_POST [ 'proceed' ] ) ) {
2015-10-28 17:56:31 +00:00
wp_safe_redirect ( wc_get_checkout_url () );
2013-08-09 16:11:15 +00:00
exit ;
2013-12-31 14:02:50 +00:00
} elseif ( $cart_updated ) {
2013-11-13 04:32:29 +00:00
wc_add_notice ( __ ( 'Cart updated.' , 'woocommerce' ) );
2015-10-28 17:56:31 +00:00
$referer = remove_query_arg ( 'remove_coupon' , ( wp_get_referer () ? wp_get_referer () : wc_get_cart_url () ) );
2013-08-09 16:11:15 +00:00
wp_safe_redirect ( $referer );
exit ;
}
}
}
/**
* Place a previous order again .
*/
2014-05-28 13:52:50 +00:00
public static function order_again () {
2013-08-09 16:11:15 +00:00
// Nothing to do
2014-03-06 13:11:20 +00:00
if ( ! isset ( $_GET [ 'order_again' ] ) || ! is_user_logged_in () || ! isset ( $_GET [ '_wpnonce' ] ) || ! wp_verify_nonce ( $_GET [ '_wpnonce' ], 'woocommerce-order_again' ) ) {
2013-08-09 16:11:15 +00:00
return ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
// Clear current cart
2013-11-25 14:01:32 +00:00
WC () -> cart -> empty_cart ();
2013-08-09 16:11:15 +00:00
// Load the previous order - Stop if the order does not exist
2014-08-15 12:29:21 +00:00
$order = wc_get_order ( absint ( $_GET [ 'order_again' ] ) );
2013-08-09 16:11:15 +00:00
2014-02-07 18:35:30 +00:00
if ( empty ( $order -> id ) ) {
2013-08-09 16:11:15 +00:00
return ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2014-06-03 09:45:33 +00:00
if ( ! $order -> has_status ( 'completed' ) ) {
2013-08-09 16:11:15 +00:00
return ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
2013-09-13 15:37:26 +00:00
// Make sure the user is allowed to order again. By default it check if the
2013-09-06 14:39:45 +00:00
// previous order belonged to the current user.
2014-02-07 18:35:30 +00:00
if ( ! current_user_can ( 'order_again' , $order -> id ) ) {
2013-08-09 16:11:15 +00:00
return ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
// Copy products from the order to the cart
foreach ( $order -> get_items () as $item ) {
// Load all product info including variation data
$product_id = ( int ) apply_filters ( 'woocommerce_add_to_cart_product_id' , $item [ 'product_id' ] );
$quantity = ( int ) $item [ 'qty' ];
$variation_id = ( int ) $item [ 'variation_id' ];
$variations = array ();
$cart_item_data = apply_filters ( 'woocommerce_order_again_cart_item_data' , array (), $item , $order );
foreach ( $item [ 'item_meta' ] as $meta_name => $meta_value ) {
2013-12-02 11:09:30 +00:00
if ( taxonomy_is_product_attribute ( $meta_name ) ) {
2013-08-09 16:11:15 +00:00
$variations [ $meta_name ] = $meta_value [ 0 ];
2015-03-09 15:50:13 +00:00
} elseif ( meta_is_product_attribute ( $meta_name , $meta_value [ 0 ], $product_id ) ) {
2013-08-20 11:17:51 +00:00
$variations [ $meta_name ] = $meta_value [ 0 ];
2013-12-02 11:09:30 +00:00
}
2013-08-09 16:11:15 +00:00
}
// Add to cart validation
2014-02-07 18:35:30 +00:00
if ( ! apply_filters ( 'woocommerce_add_to_cart_validation' , true , $product_id , $quantity , $variation_id , $variations , $cart_item_data ) ) {
continue ;
}
2013-08-09 16:11:15 +00:00
2013-11-25 14:01:32 +00:00
WC () -> cart -> add_to_cart ( $product_id , $quantity , $variation_id , $variations , $cart_item_data );
2013-08-09 16:11:15 +00:00
}
do_action ( 'woocommerce_ordered_again' , $order -> id );
// Redirect to cart
2013-11-13 04:32:29 +00:00
wc_add_notice ( __ ( 'The cart has been filled with the items from your previous order.' , 'woocommerce' ) );
2015-10-28 17:56:31 +00:00
wp_safe_redirect ( wc_get_cart_url () );
2013-08-09 16:11:15 +00:00
exit ;
}
/**
* Cancel a pending order .
*/
2014-05-28 13:52:50 +00:00
public static function cancel_order () {
2013-12-03 14:07:11 +00:00
if ( isset ( $_GET [ 'cancel_order' ] ) && isset ( $_GET [ 'order' ] ) && isset ( $_GET [ 'order_id' ] ) ) {
2013-08-09 16:11:15 +00:00
2014-01-26 09:19:17 +00:00
$order_key = $_GET [ 'order' ];
2013-12-03 14:07:11 +00:00
$order_id = absint ( $_GET [ 'order_id' ] );
2014-08-15 12:29:21 +00:00
$order = wc_get_order ( $order_id );
2013-12-03 14:07:11 +00:00
$user_can_cancel = current_user_can ( 'cancel_order' , $order_id );
2014-06-03 09:45:33 +00:00
$order_can_cancel = $order -> has_status ( apply_filters ( 'woocommerce_valid_order_statuses_for_cancel' , array ( 'pending' , 'failed' ) ) );
2014-01-26 09:19:17 +00:00
$redirect = $_GET [ 'redirect' ];
2013-08-09 16:11:15 +00:00
2014-06-03 09:45:33 +00:00
if ( $order -> has_status ( 'cancelled' ) ) {
2014-02-24 10:39:43 +00:00
// Already cancelled - take no action
2016-03-30 11:45:25 +00:00
} elseif ( $user_can_cancel && $order_can_cancel && $order -> id === $order_id && $order -> order_key === $order_key ) {
2013-08-09 16:11:15 +00:00
// Cancel the order + restore stock
$order -> cancel_order ( __ ( 'Order cancelled by customer.' , 'woocommerce' ) );
// Message
2014-03-26 09:58:51 +00:00
wc_add_notice ( apply_filters ( 'woocommerce_order_cancelled_notice' , __ ( 'Your order was cancelled.' , 'woocommerce' ) ), apply_filters ( 'woocommerce_order_cancelled_notice_type' , 'notice' ) );
2013-08-09 16:11:15 +00:00
do_action ( 'woocommerce_cancelled_order' , $order -> id );
2013-12-03 14:07:11 +00:00
} elseif ( $user_can_cancel && ! $order_can_cancel ) {
wc_add_notice ( __ ( 'Your order can no longer be cancelled. Please contact us if you need assistance.' , 'woocommerce' ), 'error' );
} else {
2013-11-13 04:29:03 +00:00
wc_add_notice ( __ ( 'Invalid order.' , 'woocommerce' ), 'error' );
2013-12-03 14:07:11 +00:00
}
2013-08-09 16:11:15 +00:00
2013-12-30 14:09:46 +00:00
if ( $redirect ) {
wp_safe_redirect ( $redirect );
exit ;
}
2013-12-03 14:07:11 +00:00
}
2013-08-09 16:11:15 +00:00
}
/**
2015-11-03 13:31:20 +00:00
* Add to cart action .
2013-08-09 16:11:15 +00:00
*
* Checks for a valid request , does validation ( via hooks ) and then redirects if valid .
*
* @ param bool $url ( default : false )
*/
2014-05-28 13:52:50 +00:00
public static function add_to_cart_action ( $url = false ) {
2014-02-07 18:35:30 +00:00
if ( empty ( $_REQUEST [ 'add-to-cart' ] ) || ! is_numeric ( $_REQUEST [ 'add-to-cart' ] ) ) {
2013-08-09 16:11:15 +00:00
return ;
2014-02-07 18:35:30 +00:00
}
2013-08-09 16:11:15 +00:00
$product_id = apply_filters ( 'woocommerce_add_to_cart_product_id' , absint ( $_REQUEST [ 'add-to-cart' ] ) );
$was_added_to_cart = false ;
2014-08-19 10:09:29 +00:00
$adding_to_cart = wc_get_product ( $product_id );
2015-08-24 14:28:57 +00:00
if ( ! $adding_to_cart ) {
return ;
}
2013-08-09 16:11:15 +00:00
$add_to_cart_handler = apply_filters ( 'woocommerce_add_to_cart_handler' , $adding_to_cart -> product_type , $adding_to_cart );
2014-02-07 18:27:07 +00:00
// Variable product handling
if ( 'variable' === $add_to_cart_handler ) {
2015-08-20 22:41:56 +00:00
$was_added_to_cart = self :: add_to_cart_handler_variable ( $product_id );
2013-08-09 16:11:15 +00:00
2015-08-20 22:41:56 +00:00
// Grouped Products
} elseif ( 'grouped' === $add_to_cart_handler ) {
$was_added_to_cart = self :: add_to_cart_handler_grouped ( $product_id );
2013-08-09 16:11:15 +00:00
2015-08-20 22:41:56 +00:00
// Custom Handler
} elseif ( has_action ( 'woocommerce_add_to_cart_handler_' . $add_to_cart_handler ) ){
do_action ( 'woocommerce_add_to_cart_handler_' . $add_to_cart_handler , $url );
2014-02-07 18:27:07 +00:00
2015-08-20 22:41:56 +00:00
// Simple Products
} else {
$was_added_to_cart = self :: add_to_cart_handler_simple ( $product_id );
}
2014-02-07 18:27:07 +00:00
2015-08-20 22:41:56 +00:00
// If we added the product to the cart we can now optionally do a redirect.
if ( $was_added_to_cart && wc_notice_count ( 'error' ) === 0 ) {
// If has custom URL redirect there
if ( $url = apply_filters ( 'woocommerce_add_to_cart_redirect' , $url ) ) {
wp_safe_redirect ( $url );
exit ;
} elseif ( get_option ( 'woocommerce_cart_redirect_after_add' ) === 'yes' ) {
2015-10-28 17:56:31 +00:00
wp_safe_redirect ( wc_get_cart_url () );
2015-08-20 22:41:56 +00:00
exit ;
}
}
}
2014-02-07 18:27:07 +00:00
2015-08-20 22:41:56 +00:00
/**
2015-11-03 13:31:20 +00:00
* Handle adding simple products to the cart .
2015-08-20 22:41:56 +00:00
* @ since 2.4 . 6 Split from add_to_cart_action
* @ param int $product_id
* @ return bool success or not
*/
private static function add_to_cart_handler_simple ( $product_id ) {
$quantity = empty ( $_REQUEST [ 'quantity' ] ) ? 1 : wc_stock_amount ( $_REQUEST [ 'quantity' ] );
$passed_validation = apply_filters ( 'woocommerce_add_to_cart_validation' , true , $product_id , $quantity );
2014-02-07 18:27:07 +00:00
2015-08-20 22:41:56 +00:00
if ( $passed_validation && WC () -> cart -> add_to_cart ( $product_id , $quantity ) !== false ) {
2016-01-20 11:32:49 +00:00
wc_add_to_cart_message ( array ( $product_id => $quantity ), true );
2015-08-20 22:41:56 +00:00
return true ;
}
return false ;
}
2014-02-07 18:27:07 +00:00
2015-08-20 22:41:56 +00:00
/**
2015-11-03 13:31:20 +00:00
* Handle adding grouped products to the cart .
2015-08-20 22:41:56 +00:00
* @ since 2.4 . 6 Split from add_to_cart_action
* @ param int $product_id
* @ return bool success or not
*/
private static function add_to_cart_handler_grouped ( $product_id ) {
$was_added_to_cart = false ;
$added_to_cart = array ();
2013-08-09 16:11:15 +00:00
2015-08-20 22:41:56 +00:00
if ( ! empty ( $_REQUEST [ 'quantity' ] ) && is_array ( $_REQUEST [ 'quantity' ] ) ) {
$quantity_set = false ;
foreach ( $_REQUEST [ 'quantity' ] as $item => $quantity ) {
if ( $quantity <= 0 ) {
continue ;
2013-08-09 16:11:15 +00:00
}
2015-08-20 22:41:56 +00:00
$quantity_set = true ;
2013-08-09 16:11:15 +00:00
2014-02-07 18:27:07 +00:00
// Add to cart validation
2015-08-20 22:41:56 +00:00
$passed_validation = apply_filters ( 'woocommerce_add_to_cart_validation' , true , $item , $quantity );
2013-08-09 16:11:15 +00:00
2015-08-20 22:41:56 +00:00
if ( $passed_validation && WC () -> cart -> add_to_cart ( $item , $quantity ) !== false ) {
$was_added_to_cart = true ;
2016-01-20 11:32:49 +00:00
$added_to_cart [ $item ] = $quantity ;
2013-08-09 16:11:15 +00:00
}
2013-11-18 13:35:38 +00:00
}
2013-08-09 16:11:15 +00:00
2015-08-20 22:41:56 +00:00
if ( ! $was_added_to_cart && ! $quantity_set ) {
wc_add_notice ( __ ( 'Please choose the quantity of items you wish to add to your cart…' , 'woocommerce' ), 'error' );
} elseif ( $was_added_to_cart ) {
wc_add_to_cart_message ( $added_to_cart );
return true ;
}
2013-08-09 16:11:15 +00:00
2015-08-20 22:41:56 +00:00
} elseif ( $product_id ) {
/* Link on product archives */
wc_add_notice ( __ ( 'Please choose a product to add to your cart…' , 'woocommerce' ), 'error' );
}
return false ;
}
2013-08-09 16:11:15 +00:00
2015-08-20 22:41:56 +00:00
/**
2015-11-03 13:31:20 +00:00
* Handle adding variable products to the cart .
2015-08-20 22:41:56 +00:00
* @ since 2.4 . 6 Split from add_to_cart_action
* @ param int $product_id
* @ return bool success or not
*/
private static function add_to_cart_handler_variable ( $product_id ) {
$adding_to_cart = wc_get_product ( $product_id );
$variation_id = empty ( $_REQUEST [ 'variation_id' ] ) ? '' : absint ( $_REQUEST [ 'variation_id' ] );
$quantity = empty ( $_REQUEST [ 'quantity' ] ) ? 1 : wc_stock_amount ( $_REQUEST [ 'quantity' ] );
$missing_attributes = array ();
$variations = array ();
$attributes = $adding_to_cart -> get_attributes ();
2016-04-20 11:35:06 +00:00
// If no variation ID is set, attempt to get a variation ID from posted attributes.
if ( empty ( $variation_id ) ) {
$variation_id = $adding_to_cart -> get_matching_variation ( wp_unslash ( $_POST ) );
}
$variation = wc_get_product ( $variation_id );
2015-08-20 22:41:56 +00:00
// Verify all attributes
foreach ( $attributes as $attribute ) {
if ( ! $attribute [ 'is_variation' ] ) {
continue ;
}
2013-08-09 16:11:15 +00:00
2015-08-20 22:41:56 +00:00
$taxonomy = 'attribute_' . sanitize_title ( $attribute [ 'name' ] );
2013-08-09 16:11:15 +00:00
2015-08-20 22:41:56 +00:00
if ( isset ( $_REQUEST [ $taxonomy ] ) ) {
2013-08-09 16:11:15 +00:00
2015-08-20 22:41:56 +00:00
// Get value from post data
if ( $attribute [ 'is_taxonomy' ] ) {
// Don't use wc_clean as it destroys sanitized characters
$value = sanitize_title ( stripslashes ( $_REQUEST [ $taxonomy ] ) );
} else {
$value = wc_clean ( stripslashes ( $_REQUEST [ $taxonomy ] ) );
2013-08-09 16:11:15 +00:00
}
2015-08-20 22:41:56 +00:00
// Get valid value from variation
2015-09-22 16:22:12 +00:00
$valid_value = isset ( $variation -> variation_data [ $taxonomy ] ) ? $variation -> variation_data [ $taxonomy ] : '' ;
2013-08-09 16:11:15 +00:00
2015-08-20 22:41:56 +00:00
// Allow if valid
if ( '' === $valid_value || $valid_value === $value ) {
$variations [ $taxonomy ] = $value ;
continue ;
2013-08-09 16:11:15 +00:00
}
2015-08-20 22:41:56 +00:00
} else {
$missing_attributes [] = wc_attribute_label ( $attribute [ 'name' ] );
2013-08-09 16:11:15 +00:00
}
2015-08-20 22:41:56 +00:00
}
2013-08-09 16:11:15 +00:00
2016-06-06 18:39:23 +00:00
if ( ! empty ( $missing_attributes ) ) {
2015-08-20 22:41:56 +00:00
wc_add_notice ( sprintf ( _n ( '%s is a required field' , '%s are required fields' , sizeof ( $missing_attributes ), 'woocommerce' ), wc_format_list_of_items ( $missing_attributes ) ), 'error' );
} elseif ( empty ( $variation_id ) ) {
wc_add_notice ( __ ( 'Please choose product options…' , 'woocommerce' ), 'error' );
2014-02-07 18:27:07 +00:00
} else {
2013-08-09 16:11:15 +00:00
// Add to cart validation
2015-08-20 22:41:56 +00:00
$passed_validation = apply_filters ( 'woocommerce_add_to_cart_validation' , true , $product_id , $quantity , $variation_id , $variations );
2013-08-09 16:11:15 +00:00
2015-08-20 22:41:56 +00:00
if ( $passed_validation && WC () -> cart -> add_to_cart ( $product_id , $quantity , $variation_id , $variations ) !== false ) {
2016-01-20 11:32:49 +00:00
wc_add_to_cart_message ( array ( $product_id => $quantity ), true );
2015-08-20 22:41:56 +00:00
return true ;
2013-08-09 16:11:15 +00:00
}
2014-02-07 18:27:07 +00:00
}
2015-08-20 22:41:56 +00:00
return false ;
2013-08-09 16:11:15 +00:00
}
/**
* Process the login form .
*/
2014-05-28 13:52:50 +00:00
public static function process_login () {
2016-06-08 12:19:30 +00:00
$nonce_value = isset ( $_POST [ '_wpnonce' ] ) ? $_POST [ '_wpnonce' ] : '' ;
$nonce_value = isset ( $_POST [ 'woocommerce-login-nonce' ] ) ? $_POST [ 'woocommerce-login-nonce' ] : $nonce_value ;
if ( ! empty ( $_POST [ 'login' ] ) && wp_verify_nonce ( $nonce_value , 'woocommerce-login' ) ) {
2013-08-09 16:11:15 +00:00
try {
2015-10-20 19:20:50 +00:00
$creds = array ();
$username = trim ( $_POST [ 'username' ] );
2013-12-29 13:11:54 +00:00
2013-11-13 11:49:34 +00:00
$validation_error = new WP_Error ();
$validation_error = apply_filters ( 'woocommerce_process_login_errors' , $validation_error , $_POST [ 'username' ], $_POST [ 'password' ] );
2014-01-03 11:06:28 +00:00
if ( $validation_error -> get_error_code () ) {
2013-11-13 11:49:34 +00:00
throw new Exception ( '<strong>' . __ ( 'Error' , 'woocommerce' ) . ':</strong> ' . $validation_error -> get_error_message () );
2014-01-03 11:06:28 +00:00
}
2013-08-09 16:11:15 +00:00
2015-10-20 19:20:50 +00:00
if ( empty ( $username ) ) {
2013-08-09 16:11:15 +00:00
throw new Exception ( '<strong>' . __ ( 'Error' , 'woocommerce' ) . ':</strong> ' . __ ( 'Username is required.' , 'woocommerce' ) );
2014-01-03 11:06:28 +00:00
}
2013-11-13 11:49:34 +00:00
2014-01-03 11:06:28 +00:00
if ( empty ( $_POST [ 'password' ] ) ) {
2013-08-09 16:11:15 +00:00
throw new Exception ( '<strong>' . __ ( 'Error' , 'woocommerce' ) . ':</strong> ' . __ ( 'Password is required.' , 'woocommerce' ) );
2014-01-03 11:06:28 +00:00
}
2013-08-09 16:11:15 +00:00
2015-10-20 19:20:50 +00:00
if ( is_email ( $username ) && apply_filters ( 'woocommerce_get_username_from_email' , true ) ) {
$user = get_user_by ( 'email' , $username );
2013-08-09 16:11:15 +00:00
2014-01-03 11:06:28 +00:00
if ( isset ( $user -> user_login ) ) {
2015-10-20 19:20:50 +00:00
$creds [ 'user_login' ] = $user -> user_login ;
2014-01-03 11:06:28 +00:00
} else {
2013-08-09 16:11:15 +00:00
throw new Exception ( '<strong>' . __ ( 'Error' , 'woocommerce' ) . ':</strong> ' . __ ( 'A user could not be found with this email address.' , 'woocommerce' ) );
2014-01-03 11:06:28 +00:00
}
2013-08-09 16:11:15 +00:00
} else {
2015-10-20 19:20:50 +00:00
$creds [ 'user_login' ] = $username ;
2013-08-09 16:11:15 +00:00
}
$creds [ 'user_password' ] = $_POST [ 'password' ];
2013-10-25 15:10:09 +00:00
$creds [ 'remember' ] = isset ( $_POST [ 'rememberme' ] );
2013-08-09 16:11:15 +00:00
$secure_cookie = is_ssl () ? true : false ;
2013-08-10 19:31:17 +00:00
$user = wp_signon ( apply_filters ( 'woocommerce_login_credentials' , $creds ), $secure_cookie );
2013-08-09 16:11:15 +00:00
if ( is_wp_error ( $user ) ) {
2015-06-26 12:15:31 +00:00
$message = $user -> get_error_message ();
2015-10-20 19:20:50 +00:00
$message = str_replace ( '<strong>' . esc_html ( $creds [ 'user_login' ] ) . '</strong>' , '<strong>' . esc_html ( $username ) . '</strong>' , $message );
2015-06-26 12:15:31 +00:00
throw new Exception ( $message );
2013-08-09 16:11:15 +00:00
} else {
if ( ! empty ( $_POST [ 'redirect' ] ) ) {
2014-10-01 18:24:11 +00:00
$redirect = $_POST [ 'redirect' ];
2013-08-09 16:11:15 +00:00
} elseif ( wp_get_referer () ) {
2014-10-01 18:24:11 +00:00
$redirect = wp_get_referer ();
2013-08-09 16:11:15 +00:00
} else {
2015-02-15 19:13:22 +00:00
$redirect = wc_get_page_permalink ( 'myaccount' );
2013-08-09 16:11:15 +00:00
}
wp_redirect ( apply_filters ( 'woocommerce_login_redirect' , $redirect , $user ) );
exit ;
}
2014-01-03 11:06:28 +00:00
2016-04-27 15:00:30 +00:00
} catch ( Exception $e ) {
2013-11-13 04:29:03 +00:00
wc_add_notice ( apply_filters ( 'login_errors' , $e -> getMessage () ), 'error' );
2013-08-09 16:11:15 +00:00
}
}
}
2015-01-21 14:15:49 +00:00
/**
2015-11-03 13:31:20 +00:00
* Handle lost password form .
2015-01-21 14:15:49 +00:00
*/
public static function process_lost_password () {
if ( isset ( $_POST [ 'wc_reset_password' ] ) && isset ( $_POST [ 'user_login' ] ) && isset ( $_POST [ '_wpnonce' ] ) && wp_verify_nonce ( $_POST [ '_wpnonce' ], 'lost_password' ) ) {
2016-04-27 15:00:30 +00:00
$success = WC_Shortcode_My_Account :: retrieve_password ();
// If successful, redirect to my account with query arg set
if ( $success ) {
wp_redirect ( add_query_arg ( 'reset-link-sent' , 'true' , remove_query_arg ( array ( 'key' , 'login' , 'reset' ) ) ) );
exit ;
}
2015-01-21 14:15:49 +00:00
}
}
2013-08-09 16:11:15 +00:00
/**
2015-11-03 13:31:20 +00:00
* Handle reset password form .
2013-08-09 16:11:15 +00:00
*/
2014-05-28 13:52:50 +00:00
public static function process_reset_password () {
2015-01-21 14:15:49 +00:00
$posted_fields = array ( 'wc_reset_password' , 'password_1' , 'password_2' , 'reset_key' , 'reset_login' , '_wpnonce' );
2013-08-09 16:11:15 +00:00
2015-01-21 14:15:49 +00:00
foreach ( $posted_fields as $field ) {
if ( ! isset ( $_POST [ $field ] ) ) {
return ;
}
$posted_fields [ $field ] = $_POST [ $field ];
2013-08-09 16:11:15 +00:00
}
2015-01-21 14:59:44 +00:00
if ( ! wp_verify_nonce ( $posted_fields [ '_wpnonce' ], 'reset_password' ) ) {
2015-01-21 14:15:49 +00:00
return ;
}
2013-08-09 16:11:15 +00:00
2015-01-21 14:59:44 +00:00
$user = WC_Shortcode_My_Account :: check_password_reset_key ( $posted_fields [ 'reset_key' ], $posted_fields [ 'reset_login' ] );
2013-08-09 16:11:15 +00:00
2015-01-21 14:59:44 +00:00
if ( $user instanceof WP_User ) {
if ( empty ( $posted_fields [ 'password_1' ] ) ) {
wc_add_notice ( __ ( 'Please enter your password.' , 'woocommerce' ), 'error' );
}
2013-08-09 16:11:15 +00:00
2015-01-21 14:59:44 +00:00
if ( $posted_fields [ 'password_1' ] !== $posted_fields [ 'password_2' ] ) {
wc_add_notice ( __ ( 'Passwords do not match.' , 'woocommerce' ), 'error' );
}
2013-08-09 16:11:15 +00:00
2015-01-21 14:59:44 +00:00
$errors = new WP_Error ();
2013-10-18 01:24:06 +00:00
2015-01-21 14:59:44 +00:00
do_action ( 'validate_password_reset' , $errors , $user );
2013-08-09 16:11:15 +00:00
2015-01-21 14:59:44 +00:00
wc_add_wp_error_notices ( $errors );
2013-08-09 16:11:15 +00:00
2015-01-21 14:59:44 +00:00
if ( 0 === wc_notice_count ( 'error' ) ) {
WC_Shortcode_My_Account :: reset_password ( $user , $posted_fields [ 'password_1' ] );
2013-08-09 16:11:15 +00:00
2015-01-21 14:59:44 +00:00
do_action ( 'woocommerce_customer_reset_password' , $user );
2013-08-09 16:11:15 +00:00
2016-04-27 15:00:30 +00:00
wp_redirect ( add_query_arg ( 'reset' , 'true' , remove_query_arg ( array ( 'key' , 'login' , 'reset-link-sent' ) ) ) );
2015-01-21 14:59:44 +00:00
exit ;
}
2013-08-09 16:11:15 +00:00
}
}
/**
* Process the registration form .
*/
2014-05-28 13:52:50 +00:00
public static function process_registration () {
2016-06-08 12:19:30 +00:00
$nonce_value = isset ( $_POST [ '_wpnonce' ] ) ? $_POST [ '_wpnonce' ] : '' ;
$nonce_value = isset ( $_POST [ 'woocommerce-register-nonce' ] ) ? $_POST [ 'woocommerce-register-nonce' ] : $nonce_value ;
if ( ! empty ( $_POST [ 'register' ] ) && wp_verify_nonce ( $nonce_value , 'woocommerce-register' ) ) {
2015-01-20 16:05:08 +00:00
$username = 'no' === get_option ( 'woocommerce_registration_generate_username' ) ? $_POST [ 'username' ] : '' ;
$password = 'no' === get_option ( 'woocommerce_registration_generate_password' ) ? $_POST [ 'password' ] : '' ;
$email = $_POST [ 'email' ];
2014-04-02 02:45:25 +00:00
2014-01-03 11:06:28 +00:00
try {
$validation_error = new WP_Error ();
2015-01-20 16:05:08 +00:00
$validation_error = apply_filters ( 'woocommerce_process_registration_errors' , $validation_error , $username , $password , $email );
2014-01-03 11:06:28 +00:00
if ( $validation_error -> get_error_code () ) {
2015-01-20 16:05:08 +00:00
throw new Exception ( $validation_error -> get_error_message () );
2014-01-03 11:06:28 +00:00
}
2013-08-09 16:11:15 +00:00
2015-01-20 16:05:08 +00:00
// Anti-spam trap
if ( ! empty ( $_POST [ 'email_2' ] ) ) {
throw new Exception ( __ ( 'Anti-spam field was filled in.' , 'woocommerce' ) );
}
2013-12-29 13:11:54 +00:00
2015-01-20 16:05:08 +00:00
$new_customer = wc_create_new_customer ( sanitize_email ( $email ), wc_clean ( $username ), $password );
2013-08-09 16:11:15 +00:00
2015-01-20 16:05:08 +00:00
if ( is_wp_error ( $new_customer ) ) {
throw new Exception ( $new_customer -> get_error_message () );
}
2013-08-09 16:11:15 +00:00
2015-01-20 16:05:08 +00:00
if ( apply_filters ( 'woocommerce_registration_auth_new_customer' , true , $new_customer ) ) {
wc_set_customer_auth_cookie ( $new_customer );
}
2013-08-09 16:11:15 +00:00
2015-02-15 19:13:22 +00:00
wp_safe_redirect ( apply_filters ( 'woocommerce_registration_redirect' , wp_get_referer () ? wp_get_referer () : wc_get_page_permalink ( 'myaccount' ) ) );
2015-01-20 16:05:08 +00:00
exit ;
2013-08-09 16:11:15 +00:00
2015-01-20 16:05:08 +00:00
} catch ( Exception $e ) {
wc_add_notice ( '<strong>' . __ ( 'Error' , 'woocommerce' ) . ':</strong> ' . $e -> getMessage (), 'error' );
2013-08-09 16:11:15 +00:00
}
}
}
}
2014-05-28 13:52:50 +00:00
WC_Form_Handler :: init ();