2013-08-09 16:11:15 +00:00
< ? php
/**
2015-11-03 13:53:50 +00:00
* WooCommerce Customer Functions
2013-08-09 16:11:15 +00:00
*
* Functions for customers .
*
* @ author WooThemes
* @ category Core
* @ package WooCommerce / Functions
2014-05-28 17:05:19 +00:00
* @ version 2.2 . 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
/**
2015-11-03 13:31:20 +00:00
* Prevent any user who cannot 'edit_posts' ( subscribers , customers etc ) from seeing the admin bar .
2013-08-09 16:11:15 +00:00
*
* 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-04-02 02:45:25 +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
/**
2015-11-03 13:31:20 +00:00
* Create a new customer .
2013-08-09 16:11:15 +00:00
*
* @ 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 ) ) {
2015-03-17 23:18:52 +00:00
return new WP_Error ( 'registration-error-invalid-email' , __ ( 'Please provide a valid email address.' , 'woocommerce' ) );
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 ( email_exists ( $email ) ) {
2015-03-17 23:18:52 +00:00
return new WP_Error ( 'registration-error-email-exists' , __ ( 'An account is already registered with your email address. Please login.' , 'woocommerce' ) );
2014-02-11 19:57:15 +00:00
}
2013-08-09 16:11:15 +00:00
// Handle username creation
2014-04-02 02:45:25 +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 ) ) {
2015-03-17 23:18:52 +00:00
return new WP_Error ( 'registration-error-invalid-username' , __ ( 'Please enter a valid account username.' , 'woocommerce' ) );
2014-02-11 19:57:15 +00:00
}
2013-08-09 16:11:15 +00:00
if ( username_exists ( $username ) )
2015-03-17 23:18:52 +00:00
return new WP_Error ( 'registration-error-username-exists' , __ ( 'An account is already registered with that username. Please choose another.' , 'woocommerce' ) );
2013-08-09 16:11:15 +00:00
} else {
2014-11-11 13:11:40 +00:00
$username = sanitize_user ( current ( explode ( '@' , $email ) ), true );
2013-08-09 16:11:15 +00:00
// Ensure username is unique
$append = 1 ;
$o_username = $username ;
while ( username_exists ( $username ) ) {
$username = $o_username . $append ;
$append ++ ;
}
}
// Handle password creation
2014-04-02 02:45:25 +00:00
if ( 'yes' === get_option ( 'woocommerce_registration_generate_password' ) && empty ( $password ) ) {
2013-08-09 16:11:15 +00:00
$password = wp_generate_password ();
$password_generated = true ;
2014-04-02 02:45:25 +00:00
2013-08-09 16:11:15 +00:00
} elseif ( empty ( $password ) ) {
2015-03-17 23:18:52 +00:00
return new WP_Error ( 'registration-error-missing-password' , __ ( 'Please enter an account password.' , 'woocommerce' ) );
2014-04-02 02:45:25 +00:00
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 ;
}
/**
2015-11-03 13:31:20 +00:00
* Login a customer ( set auth cookie and set global user object ) .
2013-08-09 16:11:15 +00:00
*
2015-07-16 19:55:48 +00:00
* @ param int $customer_id
2013-08-09 16:11:15 +00:00
*/
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
}
/**
2015-11-03 13:31:20 +00:00
* Get past orders ( by email ) and update them .
2013-08-09 16:11:15 +00:00
*
* @ 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 ,
2014-07-11 11:43:42 +00:00
'post_type' => wc_get_order_types (),
2014-05-30 15:14:24 +00:00
'post_status' => array_keys ( wc_get_order_statuses () ),
2014-02-11 19:51:10 +00:00
'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-05-30 15:14:24 +00:00
$linked = 0 ;
2014-02-11 19:51:10 +00:00
$complete = 0 ;
2013-08-09 16:11:15 +00:00
2014-12-04 13:09:37 +00:00
if ( $customer_orders ) {
2014-02-11 19:51:10 +00:00
foreach ( $customer_orders as $order_id ) {
update_post_meta ( $order_id , '_customer_user' , $customer -> ID );
2013-08-09 16:11:15 +00:00
2015-09-15 22:56:59 +00:00
do_action ( 'woocommerce_update_new_customer_past_order' , $order_id , $customer );
2014-12-04 13:09:37 +00:00
if ( get_post_status ( $order_id ) === 'wc-completed' ) {
2015-09-15 22:56:59 +00:00
$complete ++ ;
2014-05-30 15:14:24 +00:00
}
2013-08-09 16:11:15 +00:00
2015-09-15 22:56:59 +00:00
$linked ++ ;
2014-02-11 19:51:10 +00:00
}
2014-12-04 13:09:37 +00:00
}
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
}
/**
2015-11-03 13:31:20 +00:00
* Order Status completed - This is a paying customer .
2013-08-09 16:11:15 +00:00
*
* @ access public
* @ param int $order_id
*/
2013-11-25 12:52:53 +00:00
function wc_paying_customer ( $order_id ) {
2014-08-15 12:29:21 +00:00
$order = wc_get_order ( $order_id );
2013-08-09 16:11:15 +00:00
2014-10-02 15:44:36 +00:00
if ( $order -> user_id > 0 && 'refund' !== $order -> order_type ) {
2013-08-09 16:11:15 +00:00
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 );
2014-10-02 15:44:36 +00:00
}
if ( $order -> user_id > 0 && 'simple' === $order -> order_type ) {
2013-08-09 16:11:15 +00:00
$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
/**
2015-11-14 16:25:09 +00:00
* Checks if a user ( by email or ID or both ) has bought an item .
2013-08-09 16:11:15 +00:00
* @ 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 ;
2015-10-07 17:59:02 +00:00
$transient_name = 'wc_cbp_' . md5 ( $customer_email . $user_id . WC_Cache_Helper :: get_transient_version ( 'orders' ) );
2015-03-27 13:17:54 +00:00
if ( false === ( $result = get_transient ( $transient_name ) ) ) {
$customer_data = array ( $user_id );
2013-08-09 16:11:15 +00:00
2015-03-27 13:17:54 +00:00
if ( $user_id ) {
$user = get_user_by ( 'id' , $user_id );
2015-01-19 02:25:32 +00:00
2015-03-27 13:17:54 +00:00
if ( isset ( $user -> user_email ) ) {
$customer_data [] = $user -> user_email ;
}
2015-01-19 02:25:32 +00:00
}
2013-08-09 16:11:15 +00:00
2015-03-27 13:17:54 +00:00
if ( is_email ( $customer_email ) ) {
$customer_data [] = $customer_email ;
}
2013-08-09 16:11:15 +00:00
2015-05-19 05:01:53 +00:00
$customer_data = array_map ( 'esc_sql' , array_filter ( array_unique ( $customer_data ) ) );
2015-03-27 13:08:24 +00:00
2015-03-27 13:17:54 +00:00
if ( sizeof ( $customer_data ) == 0 ) {
return false ;
}
2013-08-09 16:11:15 +00:00
2015-10-07 17:59:02 +00:00
$result = $wpdb -> get_col ( "
SELECT im . meta_value FROM { $wpdb -> posts } AS p
INNER JOIN { $wpdb -> postmeta } AS pm ON p . ID = pm . post_id
INNER JOIN { $wpdb -> prefix } woocommerce_order_items AS i ON p . ID = i . order_id
INNER JOIN { $wpdb -> prefix } woocommerce_order_itemmeta AS im ON i . order_item_id = im . order_item_id
WHERE p . post_status IN ( 'wc-completed' , 'wc-processing' )
AND pm . meta_key IN ( '_billing_email' , '_customer_user' )
AND im . meta_key IN ( '_product_id' , '_variation_id' )
AND im . meta_value != 0
AND pm . meta_value IN ( '" . implode( "' , '", $customer_data ) . "' )
" );
2015-11-14 16:25:09 +00:00
$result = array_map ( 'absint' , $result );
2015-10-07 17:59:02 +00:00
set_transient ( $transient_name , $result , DAY_IN_SECONDS * 30 );
2015-03-27 13:17:54 +00:00
}
2015-11-14 16:25:09 +00:00
return in_array ( absint ( $product_id ), $result );
2013-09-06 14:37:38 +00:00
}
/**
2015-11-03 13:31:20 +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 ] ) {
case 'view_order' :
$user_id = $args [ 1 ];
2014-08-15 12:29:21 +00:00
$order = wc_get_order ( $args [ 2 ] );
2013-09-06 14:37:38 +00:00
2015-04-14 22:16:34 +00:00
if ( $order && $user_id == $order -> user_id ) {
2014-02-11 19:57:15 +00:00
$allcaps [ 'view_order' ] = true ;
}
2014-04-23 13:18:17 +00:00
break ;
2014-02-11 19:57:15 +00:00
case 'pay_for_order' :
2014-04-23 13:18:17 +00:00
$user_id = $args [ 1 ];
2014-02-11 19:57:15 +00:00
$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-09-06 14:37:38 +00:00
2014-08-15 12:29:21 +00:00
$order = wc_get_order ( $order_id );
2014-02-26 11:46:02 +00:00
if ( $user_id == $order -> user_id || empty ( $order -> user_id ) ) {
2014-02-11 19:57:15 +00:00
$allcaps [ 'pay_for_order' ] = true ;
}
2014-04-23 13:18:17 +00:00
break ;
2014-02-11 19:57:15 +00:00
case 'order_again' :
$user_id = $args [ 1 ];
2014-08-15 12:29:21 +00:00
$order = wc_get_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 ;
}
2014-04-23 13:18:17 +00:00
break ;
2014-02-11 19:57:15 +00:00
case 'cancel_order' :
$user_id = $args [ 1 ];
2014-08-15 12:29:21 +00:00
$order = wc_get_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 ;
}
2014-04-23 13:18:17 +00:00
break ;
2014-02-11 19:57:15 +00:00
case 'download_file' :
2014-04-23 13:18:17 +00:00
$user_id = $args [ 1 ];
2014-02-11 19:57:15 +00:00
$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 ;
}
2014-04-23 13:18:17 +00:00
break ;
2014-02-11 19:57:15 +00:00
}
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 );
2014-04-23 13:18:17 +00:00
/**
2015-11-03 13:31:20 +00:00
* Modify the list of editable roles to prevent non - admin adding admin users .
2014-04-23 13:18:17 +00:00
* @ param array $roles
* @ return array
*/
function wc_modify_editable_roles ( $roles ){
if ( ! current_user_can ( 'administrator' ) ) {
unset ( $roles [ 'administrator' ] );
}
return $roles ;
}
add_filter ( 'editable_roles' , 'wc_modify_editable_roles' );
/**
2015-11-03 13:31:20 +00:00
* Modify capabiltiies to prevent non - admin users editing admin users .
2014-04-23 13:18:17 +00:00
*
* $args [ 0 ] will be the user being edited in this case .
2014-05-28 17:05:19 +00:00
*
2014-04-23 13:18:17 +00:00
* @ param array $caps Array of caps
* @ param string $cap Name of the cap we are checking
* @ param int $user_id ID of the user being checked against
* @ param array $args
* @ return array
*/
function wc_modify_map_meta_cap ( $caps , $cap , $user_id , $args ) {
switch ( $cap ) {
case 'edit_user' :
case 'remove_user' :
case 'promote_user' :
case 'delete_user' :
2014-08-27 18:18:44 +00:00
if ( ! isset ( $args [ 0 ] ) || $args [ 0 ] === $user_id ) {
2014-04-23 13:18:17 +00:00
break ;
} else {
if ( user_can ( $args [ 0 ], 'administrator' ) && ! current_user_can ( 'administrator' ) ) {
$caps [] = 'do_not_allow' ;
}
}
break ;
}
return $caps ;
}
2014-05-28 17:05:19 +00:00
add_filter ( 'map_meta_cap' , 'wc_modify_map_meta_cap' , 10 , 4 );
/**
2015-11-03 13:31:20 +00:00
* Get customer available downloads .
2014-05-28 17:05:19 +00:00
*
* @ param int $customer_id Customer / User ID
* @ return array
*/
function wc_get_customer_available_downloads ( $customer_id ) {
global $wpdb ;
$downloads = array ();
$_product = null ;
$order = null ;
$file_number = 0 ;
// Get results from valid orders only
2015-03-17 18:21:57 +00:00
$results = apply_filters ( 'woocommerce_permission_list' , $wpdb -> get_results ( $wpdb -> prepare ( "
2014-05-28 17:05:19 +00:00
SELECT permissions .*
FROM { $wpdb -> prefix } woocommerce_downloadable_product_permissions as permissions
WHERE user_id = % d
AND permissions . order_id > 0
AND
(
permissions . downloads_remaining > 0
OR
permissions . downloads_remaining = ''
)
AND
(
permissions . access_expires IS NULL
OR
permissions . access_expires >= % s
2015-03-31 22:50:42 +00:00
OR
permissions . access_expires = '0000-00-00 00:00:00'
2014-05-28 17:05:19 +00:00
)
ORDER BY permissions . order_id , permissions . product_id , permissions . permission_id ;
2015-03-17 18:21:57 +00:00
" , $customer_id , date( 'Y-m-d', current_time( 'timestamp' ) ) ) ), $customer_id );
2014-05-28 17:05:19 +00:00
if ( $results ) {
2015-03-27 13:08:24 +00:00
2015-02-19 13:42:24 +00:00
$looped_downloads = array ();
2014-05-28 17:05:19 +00:00
foreach ( $results as $result ) {
if ( ! $order || $order -> id != $result -> order_id ) {
// new order
2014-08-15 12:29:21 +00:00
$order = wc_get_order ( $result -> order_id );
2014-05-28 17:05:19 +00:00
$_product = null ;
}
2015-02-18 10:04:19 +00:00
// Make sure the order exists for this download
if ( ! $order ) {
continue ;
}
2014-05-28 17:05:19 +00:00
// Downloads permitted?
if ( ! $order -> is_download_permitted () ) {
continue ;
}
2015-01-21 12:21:42 +00:00
$product_id = intval ( $result -> product_id );
if ( ! $_product || $_product -> id != $product_id ) {
2014-05-28 17:05:19 +00:00
// new product
$file_number = 0 ;
2015-01-21 12:21:42 +00:00
$_product = wc_get_product ( $product_id );
2014-05-28 17:05:19 +00:00
}
// Check product exists and has the file
if ( ! $_product || ! $_product -> exists () || ! $_product -> has_file ( $result -> download_id ) ) {
continue ;
}
$download_file = $_product -> get_file ( $result -> download_id );
2015-03-27 13:08:24 +00:00
2015-02-19 13:42:24 +00:00
// Check if the file has been already added to the downloads list
if ( in_array ( $download_file , $looped_downloads ) ) {
continue ;
}
array_push ( $looped_downloads , $download_file );
2014-08-19 10:01:55 +00:00
2014-05-28 17:05:19 +00:00
// Download name will be 'Product Name' for products with a single downloadable file, and 'Product Name - File X' for products with multiple files
$download_name = apply_filters (
'woocommerce_downloadable_product_name' ,
$_product -> get_title () . ' – ' . $download_file [ 'name' ],
$_product ,
$result -> download_id ,
$file_number
);
$downloads [] = array (
2014-08-19 10:01:55 +00:00
'download_url' => add_query_arg (
array (
2015-01-21 12:21:42 +00:00
'download_file' => $product_id ,
2014-08-19 10:01:55 +00:00
'order' => $result -> order_key ,
'email' => $result -> user_email ,
'key' => $result -> download_id
),
home_url ( '/' )
),
2014-05-28 17:05:19 +00:00
'download_id' => $result -> download_id ,
2015-01-21 12:21:42 +00:00
'product_id' => $product_id ,
2014-05-28 17:05:19 +00:00
'download_name' => $download_name ,
'order_id' => $order -> id ,
'order_key' => $order -> order_key ,
2014-08-19 10:01:55 +00:00
'downloads_remaining' => $result -> downloads_remaining ,
2015-01-13 12:29:37 +00:00
'access_expires' => $result -> access_expires ,
2014-08-19 10:01:55 +00:00
'file' => $download_file
2014-05-28 17:05:19 +00:00
);
$file_number ++ ;
}
}
return $downloads ;
}
2015-01-12 17:09:42 +00:00
/**
2015-11-03 13:31:20 +00:00
* Get total spent by customer .
2015-01-12 17:09:42 +00:00
* @ param int $user_id
* @ return string
*/
function wc_get_customer_total_spent ( $user_id ) {
if ( ! $spent = get_user_meta ( $user_id , '_money_spent' , true ) ) {
2015-01-12 17:18:17 +00:00
global $wpdb ;
2015-01-12 17:09:42 +00:00
$spent = $wpdb -> get_var ( " SELECT SUM(meta2.meta_value)
FROM $wpdb -> posts as posts
LEFT JOIN { $wpdb -> postmeta } AS meta ON posts . ID = meta . post_id
LEFT JOIN { $wpdb -> postmeta } AS meta2 ON posts . ID = meta2 . post_id
WHERE meta . meta_key = '_customer_user'
AND meta . meta_value = $user_id
AND posts . post_type IN ( '" . implode( "' , '", wc_get_order_types( ' reports ' ) ) . "' )
AND posts . post_status IN ( 'wc-completed' , 'wc-processing' )
AND meta2 . meta_key = '_order_total'
" );
update_user_meta ( $user_id , '_money_spent' , $spent );
}
return $spent ;
}
/**
2015-11-03 13:31:20 +00:00
* Get total orders by customer .
2015-01-12 17:09:42 +00:00
* @ param int $user_id
* @ return int
*/
function wc_get_customer_order_count ( $user_id ) {
if ( ! $count = get_user_meta ( $user_id , '_order_count' , true ) ) {
2015-01-12 17:18:17 +00:00
global $wpdb ;
2015-01-12 17:09:42 +00:00
$count = $wpdb -> get_var ( " SELECT COUNT(*)
FROM $wpdb -> posts as posts
LEFT JOIN { $wpdb -> postmeta } AS meta ON posts . ID = meta . post_id
WHERE meta . meta_key = '_customer_user'
AND posts . post_type IN ( '" . implode( "' , '", wc_get_order_types( ' order - count ' ) ) . "' )
AND posts . post_status IN ( '" . implode( "' , '", array_keys( wc_get_order_statuses() ) ) . "' )
AND meta_value = $user_id
" );
update_user_meta ( $user_id , '_order_count' , absint ( $count ) );
}
return absint ( $count );
}
2015-10-05 20:38:20 +00:00
/**
* Reset _customer_user on orders when a user is deleted .
* @ param int $user_id
*/
function wc_reset_order_customer_id_on_deleted_user ( $user_id ) {
global $wpdb ;
2016-01-07 01:53:21 +00:00
$wpdb -> update ( $wpdb -> postmeta , array ( 'meta_value' => 0 ), array ( 'meta_key' => '_customer_user' , 'meta_value' => $user_id ) );
2015-10-05 20:38:20 +00:00
}
2015-10-13 21:13:31 +00:00
add_action ( 'deleted_user' , 'wc_reset_order_customer_id_on_deleted_user' );
2015-10-09 16:22:56 +00:00
/**
2015-11-03 13:31:20 +00:00
* Get review verification status .
2015-10-09 16:22:56 +00:00
* @ param int $comment_id
* @ return bool
*/
function wc_review_is_from_verified_owner ( $comment_id ) {
$verified = get_comment_meta ( $comment_id , 'verified' , true );
// If no "verified" meta is present, generate it (if this is a product review).
if ( '' === $verified ) {
$verified = WC_Comments :: add_comment_purchase_verification ( $comment_id );
}
return ( bool ) $verified ;
}
2015-10-26 17:38:44 +00:00
/**
2015-11-03 13:31:20 +00:00
* Disable author archives for customers .
2015-10-26 17:38:44 +00:00
*
* @ since 2.5 . 0
*/
function wc_disable_author_archives_for_customers () {
global $wp_query , $author ;
if ( is_author () ) {
$user = get_user_by ( 'id' , $author );
if ( isset ( $user -> roles [ 0 ] ) && 'customer' === $user -> roles [ 0 ] ) {
wp_redirect ( wc_get_page_permalink ( 'shop' ) );
}
}
}
add_action ( 'template_redirect' , 'wc_disable_author_archives_for_customers' );
2016-02-10 11:56:13 +00:00
/**
2016-02-10 16:47:37 +00:00
* Hooks into the `profile_update` hook to set the user last updated timestamp .
2016-02-10 11:56:13 +00:00
*
2016-01-20 20:13:17 +00:00
* @ since 2.6 . 0
* @ param int $user_id The user that was updated .
* @ param array $old The profile fields pre - change .
2016-02-10 11:56:13 +00:00
*/
function wc_update_profile_last_update_time ( $user_id , $old ) {
wc_set_user_last_update_time ( $user_id );
}
add_action ( 'profile_update' , 'wc_update_profile_last_update_time' , 10 , 2 );
/**
2016-02-10 16:47:37 +00:00
* Hooks into the update user meta function to set the user last updated timestamp .
2016-02-10 11:56:13 +00:00
*
2016-01-20 20:13:17 +00:00
* @ since 2.6 . 0
* @ param int $meta_id ID of the meta object that was changed .
* @ param int $user_id The user that was updated .
* @ param string $meta_key Name of the meta key that was changed .
* @ param string $_meta_value Value of the meta that was changed .
2016-02-10 11:56:13 +00:00
*/
function wc_meta_update_last_update_time ( $meta_id , $user_id , $meta_key , $_meta_value ) {
2016-02-10 16:21:33 +00:00
$keys_to_track = apply_filters ( 'woocommerce_user_last_update_fields' , array ( 'first_name' , 'last_name' ) );
$update_time = false ;
if ( in_array ( $meta_key , $keys_to_track ) ) {
$update_time = true ;
}
if ( 'billing_' === substr ( $meta_key , 0 , 8 ) ) {
$update_time = true ;
}
if ( 'shipping_' === substr ( $meta_key , 0 , 9 ) ) {
$update_time = true ;
}
if ( $update_time ) {
wc_set_user_last_update_time ( $user_id );
2016-02-10 11:56:13 +00:00
}
}
2016-02-10 16:47:37 +00:00
add_action ( 'update_user_meta' , 'wc_meta_update_last_update_time' , 10 , 4 );
2016-02-10 11:56:13 +00:00
/**
2016-02-10 16:47:37 +00:00
* Sets a user ' s " last update " time to the current timestamp .
2016-02-10 11:56:13 +00:00
*
2016-01-20 20:13:17 +00:00
* @ since 2.6 . 0
* @ param int $user_id The user to set a timestamp for .
2016-02-10 11:56:13 +00:00
*/
function wc_set_user_last_update_time ( $user_id ) {
update_user_meta ( $user_id , 'last_update' , time () );
}
2016-01-20 20:13:17 +00:00
/**
* Get customer saved payment methods list .
*
* @ since 2.6 . 0
* @ param int $customer_id
* @ return array
*/
function wc_get_customer_saved_methods_list ( $customer_id ) {
return apply_filters ( 'woocommerce_saved_payment_methods_list' , array (), $customer_id );
}