2013-08-09 16:11:15 +00:00
< ? php
/**
* WooCommerce Customer Functions
*
* Functions for customers .
*
* @ author WooThemes
* @ category Core
* @ package WooCommerce / Functions
2014-02-11 19:57:15 +00:00
* @ version 2.1 . 0
2013-08-09 16:11:15 +00:00
*/
2014-02-11 19:57:15 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
exit ; // Exit if accessed directly
}
2013-08-09 16:11:15 +00:00
/**
* Prevent any user who cannot 'edit_posts' ( subscribers , customers etc ) from seeing the admin bar
*
* Note : get_option ( 'woocommerce_lock_down_admin' , true ) is a deprecated option here for backwards compat . Defaults to true .
*
* @ access public
* @ param bool $show_admin_bar
* @ return bool
*/
2013-11-25 12:52:53 +00:00
function wc_disable_admin_bar ( $show_admin_bar ) {
2014-02-11 19:57:15 +00:00
if ( apply_filters ( 'woocommerce_disable_admin_bar' , get_option ( 'woocommerce_lock_down_admin' , 'yes' ) == 'yes' ) && ! ( current_user_can ( 'edit_posts' ) || current_user_can ( 'manage_woocommerce' ) ) ) {
2013-08-09 16:11:15 +00:00
$show_admin_bar = false ;
}
return $show_admin_bar ;
}
2013-11-25 12:52:53 +00:00
add_filter ( 'show_admin_bar' , 'wc_disable_admin_bar' , 10 , 1 );
2013-08-09 16:11:15 +00:00
/**
* Create a new customer
*
* @ param string $email
* @ param string $username
* @ param string $password
2014-02-11 16:39:22 +00:00
* @ return int | WP_Error on failure , Int ( user ID ) on success
2013-08-09 16:11:15 +00:00
*/
2013-11-25 12:52:53 +00:00
function wc_create_new_customer ( $email , $username = '' , $password = '' ) {
2013-08-09 16:11:15 +00:00
// Check the e-mail address
2014-02-11 19:57:15 +00:00
if ( empty ( $email ) || ! is_email ( $email ) ) {
return new WP_Error ( 'registration-error' , __ ( 'Please provide a valid email address.' , 'woocommerce' ) );
}
2013-08-09 16:11:15 +00:00
2014-02-11 19:57:15 +00:00
if ( email_exists ( $email ) ) {
return new WP_Error ( 'registration-error' , __ ( 'An account is already registered with your email address. Please login.' , 'woocommerce' ) );
}
2013-08-09 16:11:15 +00:00
// Handle username creation
2014-02-11 19:57:15 +00:00
if ( 'no' == get_option ( 'woocommerce_registration_generate_username' ) || ! empty ( $username ) ) {
2013-08-09 16:11:15 +00:00
$username = sanitize_user ( $username );
2014-02-11 19:57:15 +00:00
if ( empty ( $username ) || ! validate_username ( $username ) ) {
return new WP_Error ( 'registration-error' , __ ( 'Please enter a valid account username.' , 'woocommerce' ) );
}
2013-08-09 16:11:15 +00:00
if ( username_exists ( $username ) )
2014-02-11 19:57:15 +00:00
return new WP_Error ( 'registration-error' , __ ( 'An account is already registered with that username. Please choose another.' , 'woocommerce' ) );
2013-08-09 16:11:15 +00:00
} else {
$username = sanitize_user ( current ( explode ( '@' , $email ) ) );
// Ensure username is unique
$append = 1 ;
$o_username = $username ;
while ( username_exists ( $username ) ) {
$username = $o_username . $append ;
$append ++ ;
}
}
// Handle password creation
2014-02-11 19:57:15 +00:00
if ( 'yes' == get_option ( 'woocommerce_registration_generate_password' ) && empty ( $password ) && ! isset ( $_POST [ 'register' ] ) ) {
2013-08-09 16:11:15 +00:00
$password = wp_generate_password ();
$password_generated = true ;
} elseif ( empty ( $password ) ) {
2014-02-11 19:57:15 +00:00
return new WP_Error ( 'registration-error' , __ ( 'Please enter an account password.' , 'woocommerce' ) );
2013-08-09 16:11:15 +00:00
} else {
$password_generated = false ;
}
// WP Validation
$validation_errors = new WP_Error ();
do_action ( 'woocommerce_register_post' , $username , $email , $validation_errors );
$validation_errors = apply_filters ( 'woocommerce_registration_errors' , $validation_errors , $username , $email );
if ( $validation_errors -> get_error_code () )
return $validation_errors ;
2014-02-11 19:51:10 +00:00
$new_customer_data = apply_filters ( 'woocommerce_new_customer_data' , array (
'user_login' => $username ,
'user_pass' => $password ,
'user_email' => $email ,
'role' => 'customer'
) );
2013-08-09 16:11:15 +00:00
2014-02-11 19:51:10 +00:00
$customer_id = wp_insert_user ( $new_customer_data );
2013-08-09 16:11:15 +00:00
2014-02-11 19:57:15 +00:00
if ( is_wp_error ( $customer_id ) ) {
return new WP_Error ( 'registration-error' , '<strong>' . __ ( 'ERROR' , 'woocommerce' ) . '</strong>: ' . __ ( 'Couldn’t register you… please contact us if you continue to have problems.' , 'woocommerce' ) );
}
2013-08-09 16:11:15 +00:00
do_action ( 'woocommerce_created_customer' , $customer_id , $new_customer_data , $password_generated );
return $customer_id ;
}
/**
* Login a customer ( set auth cookie and set global user object )
*
* @ param int $customer_id
* @ return void
*/
2013-11-25 12:52:53 +00:00
function wc_set_customer_auth_cookie ( $customer_id ) {
2013-08-09 16:11:15 +00:00
global $current_user ;
$current_user = get_user_by ( 'id' , $customer_id );
2013-09-04 10:26:19 +00:00
wp_set_auth_cookie ( $customer_id , true );
2013-08-09 16:11:15 +00:00
}
/**
* Get past orders ( by email ) and update them
*
* @ param int $customer_id
2013-11-27 18:20:31 +00:00
* @ return int
2013-08-09 16:11:15 +00:00
*/
2013-11-25 12:52:53 +00:00
function wc_update_new_customer_past_orders ( $customer_id ) {
2013-08-09 16:11:15 +00:00
2014-02-11 19:51:10 +00:00
$customer = get_user_by ( 'id' , absint ( $customer_id ) );
2013-08-09 16:11:15 +00:00
2014-02-11 19:51:10 +00:00
$customer_orders = get_posts ( array (
'numberposts' => - 1 ,
'post_type' => 'shop_order' ,
'post_status' => 'publish' ,
'fields' => 'ids' ,
'meta_query' => array (
2013-08-09 16:11:15 +00:00
array (
'key' => '_customer_user' ,
'value' => array ( 0 , '' ),
'compare' => 'IN'
),
array (
'key' => '_billing_email' ,
'value' => $customer -> user_email ,
)
),
2014-02-11 19:51:10 +00:00
) );
2013-08-09 16:11:15 +00:00
2014-02-11 19:51:10 +00:00
$linked = 0 ;
$complete = 0 ;
2013-08-09 16:11:15 +00:00
2014-02-11 19:51:10 +00:00
if ( $customer_orders )
foreach ( $customer_orders as $order_id ) {
update_post_meta ( $order_id , '_customer_user' , $customer -> ID );
2013-08-09 16:11:15 +00:00
2014-02-11 19:51:10 +00:00
$order_status = wp_get_post_terms ( $order_id , 'shop_order_status' );
2013-08-09 16:11:15 +00:00
if ( $order_status ) {
$order_status = current ( $order_status );
$order_status = sanitize_title ( $order_status -> slug );
}
if ( $order_status == 'completed' )
$complete ++ ;
2014-02-11 19:51:10 +00:00
$linked ++ ;
}
2013-08-09 16:11:15 +00:00
2014-02-11 19:51:10 +00:00
if ( $complete ) {
update_user_meta ( $customer_id , 'paying_customer' , 1 );
update_user_meta ( $customer_id , '_order_count' , '' );
update_user_meta ( $customer_id , '_money_spent' , '' );
}
2013-08-09 16:11:15 +00:00
2014-02-11 19:51:10 +00:00
return $linked ;
2013-08-09 16:11:15 +00:00
}
/**
* Order Status completed - This is a paying customer
*
* @ access public
* @ param int $order_id
* @ return void
*/
2013-11-25 12:52:53 +00:00
function wc_paying_customer ( $order_id ) {
2013-08-09 16:11:15 +00:00
$order = new WC_Order ( $order_id );
if ( $order -> user_id > 0 ) {
update_user_meta ( $order -> user_id , 'paying_customer' , 1 );
$old_spent = absint ( get_user_meta ( $order -> user_id , '_money_spent' , true ) );
update_user_meta ( $order -> user_id , '_money_spent' , $old_spent + $order -> order_total );
$old_count = absint ( get_user_meta ( $order -> user_id , '_order_count' , true ) );
update_user_meta ( $order -> user_id , '_order_count' , $old_count + 1 );
}
}
2013-11-25 12:52:53 +00:00
add_action ( 'woocommerce_order_status_completed' , 'wc_paying_customer' );
2013-08-09 16:11:15 +00:00
/**
* Checks if a user ( by email ) has bought an item
*
* @ access public
* @ param string $customer_email
* @ param int $user_id
* @ param int $product_id
* @ return bool
*/
2013-11-25 12:52:53 +00:00
function wc_customer_bought_product ( $customer_email , $user_id , $product_id ) {
2013-08-09 16:11:15 +00:00
global $wpdb ;
$emails = array ();
if ( $user_id ) {
$user = get_user_by ( 'id' , $user_id );
$emails [] = $user -> user_email ;
}
2014-02-11 19:57:15 +00:00
if ( is_email ( $customer_email ) ) {
2013-08-09 16:11:15 +00:00
$emails [] = $customer_email ;
2014-02-11 19:57:15 +00:00
}
2013-08-09 16:11:15 +00:00
2014-02-11 19:57:15 +00:00
if ( sizeof ( $emails ) == 0 ) {
2013-08-09 16:11:15 +00:00
return false ;
2014-02-11 19:57:15 +00:00
}
2013-08-09 16:11:15 +00:00
2013-10-31 17:37:36 +00:00
$completed = get_term_by ( 'slug' , 'completed' , 'shop_order_status' );
$processing = get_term_by ( 'slug' , 'processing' , 'shop_order_status' );
2013-08-09 16:11:15 +00:00
return $wpdb -> get_var (
$wpdb -> prepare ( "
SELECT COUNT ( DISTINCT order_items . order_item_id )
FROM { $wpdb -> prefix } woocommerce_order_items as order_items
LEFT JOIN { $wpdb -> prefix } woocommerce_order_itemmeta AS itemmeta ON order_items . order_item_id = itemmeta . order_item_id
LEFT JOIN { $wpdb -> postmeta } AS postmeta ON order_items . order_id = postmeta . post_id
LEFT JOIN { $wpdb -> term_relationships } AS rel ON order_items . order_id = rel . object_ID
WHERE
2013-10-31 17:37:36 +00:00
rel . term_taxonomy_id IN ( % d , % d ) AND
2013-08-09 16:11:15 +00:00
itemmeta . meta_value = % s AND
itemmeta . meta_key IN ( '_variation_id' , '_product_id' ) AND
postmeta . meta_key IN ( '_billing_email' , '_customer_user' ) AND
(
postmeta . meta_value IN ( '" . implode( "' , '", array_unique( $emails ) ) . "' ) OR
(
2013-10-31 17:37:36 +00:00
postmeta . meta_value = % s AND
2013-08-09 16:11:15 +00:00
postmeta . meta_value > 0
)
)
2013-10-31 17:37:36 +00:00
" , $completed->term_taxonomy_id , $processing->term_taxonomy_id , $product_id , $user_id
2013-08-09 16:11:15 +00:00
)
);
2013-09-06 14:37:38 +00:00
}
/**
2014-01-03 11:06:28 +00:00
* Checks if a user has a certain capability
2013-09-06 14:37:38 +00:00
*
* @ access public
* @ param array $allcaps
* @ param array $caps
* @ param array $args
* @ return bool
*/
2013-11-25 12:52:53 +00:00
function wc_customer_has_capability ( $allcaps , $caps , $args ) {
2014-02-11 19:57:15 +00:00
if ( isset ( $caps [ 0 ] ) ) {
switch ( $caps [ 0 ] ) {
2013-09-06 14:37:38 +00:00
2014-02-11 19:57:15 +00:00
case 'view_order' :
$user_id = $args [ 1 ];
$order = new WC_Order ( $args [ 2 ] );
2013-09-06 14:37:38 +00:00
2014-02-11 19:57:15 +00:00
if ( $user_id == $order -> user_id ) {
$allcaps [ 'view_order' ] = true ;
}
2013-09-06 14:37:38 +00:00
2014-02-11 19:57:15 +00:00
break ;
2013-09-06 14:37:38 +00:00
2014-02-11 19:57:15 +00:00
case 'pay_for_order' :
$user_id = $args [ 1 ];
$order_id = isset ( $args [ 2 ] ) ? $args [ 2 ] : null ;
2013-11-28 15:22:05 +00:00
2014-02-11 19:57:15 +00:00
// When no order ID, we assume it's a new order
// and thus, customer can pay for it
if ( ! $order_id ) {
$allcaps [ 'pay_for_order' ] = true ;
break ;
}
2013-11-28 15:22:05 +00:00
2014-02-11 19:57:15 +00:00
$order = new WC_Order ( $order_id );
2013-09-06 14:37:38 +00:00
2014-02-11 19:57:15 +00:00
if ( $user_id == $order -> user_id ) {
$allcaps [ 'pay_for_order' ] = true ;
}
2013-09-06 14:37:38 +00:00
2014-02-11 19:57:15 +00:00
break ;
2013-09-06 14:37:38 +00:00
2014-02-11 19:57:15 +00:00
case 'order_again' :
$user_id = $args [ 1 ];
$order = new WC_Order ( $args [ 2 ] );
2013-09-06 14:37:38 +00:00
2014-02-11 19:57:15 +00:00
if ( $user_id == $order -> user_id ) {
$allcaps [ 'order_again' ] = true ;
}
2013-09-06 14:37:38 +00:00
2014-02-11 19:57:15 +00:00
break ;
2013-09-06 14:37:38 +00:00
2014-02-11 19:57:15 +00:00
case 'cancel_order' :
$user_id = $args [ 1 ];
$order = new WC_Order ( $args [ 2 ] );
2013-09-06 14:37:38 +00:00
2014-02-11 19:57:15 +00:00
if ( $user_id == $order -> user_id ) {
$allcaps [ 'cancel_order' ] = true ;
}
2013-09-06 14:37:38 +00:00
2014-02-11 19:57:15 +00:00
break ;
2013-09-06 16:38:06 +00:00
2014-02-11 19:57:15 +00:00
case 'download_file' :
$user_id = $args [ 1 ];
$download = $args [ 2 ];
2013-09-06 16:38:06 +00:00
2014-02-11 19:57:15 +00:00
if ( $user_id == $download -> user_id ) {
$allcaps [ 'download_file' ] = true ;
}
2013-09-06 16:38:06 +00:00
2014-02-11 19:57:15 +00:00
break ;
}
2014-02-11 19:51:10 +00:00
}
2014-02-11 19:57:15 +00:00
return $allcaps ;
2013-09-06 14:37:38 +00:00
}
2014-02-11 19:57:15 +00:00
add_filter ( 'user_has_cap' , 'wc_customer_has_capability' , 10 , 3 );