1014 lines
		
	
	
		
			33 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			1014 lines
		
	
	
		
			33 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Customer Functions.
 | |
|  *
 | |
|  * This file contains all of the first class functions for interacting with a
 | |
|  * customer or it's related meta data.
 | |
|  *
 | |
|  * @package     EDD
 | |
|  * @subpackage  Functions
 | |
|  * @copyright   Copyright (c) 2018, Easy Digital Downloads, LLC
 | |
|  * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 | |
|  * @since       3.0
 | |
|  */
 | |
| 
 | |
| // Exit if accessed directly
 | |
| defined( 'ABSPATH' ) || exit;
 | |
| 
 | |
| /**
 | |
|  * Add a customer.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param array $data {
 | |
|  *     Array of customer data. Default empty.
 | |
|  *
 | |
|  *     The `date_created` and `date_modified` parameters do not need to be passed.
 | |
|  *     They will be automatically populated if empty.
 | |
|  *
 | |
|  *     @type int    $user_id        WordPress user ID linked to the customer account.
 | |
|  *                                  Default 0.
 | |
|  *     @type string $email          Customer's primary email address. Default empty.
 | |
|  *     @type string $name           Customer's name. Default empty.
 | |
|  *     @type string $status         Customer's status. Default `active`.
 | |
|  *     @type float  $purchase_value Aggregated purchase value of the customer.
 | |
|  *                                  Default 0.
 | |
|  *     @type int    $purchase_count Aggregated purchase count of the customer.
 | |
|  *                                  Default 0.
 | |
|  *     @type string $date_created   Optional. Automatically calculated on add/edit.
 | |
|  *                                  The date & time the customer was created.
 | |
|  *                                  Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  *     @type string $date_modified  Optional. Automatically calculated on add/edit.
 | |
|  *                                  The date & time the customer was last modified.
 | |
|  *                                  Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  * }
 | |
|  * @return int|false ID of the inserted customer, false on failure.
 | |
|  */
 | |
| function edd_add_customer( $data = array() ) {
 | |
| 
 | |
| 	// An email must be given for every customer that is created.
 | |
| 	if ( ! isset( $data['email'] ) || empty( $data['email'] ) ) {
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	$customers  = new EDD\Database\Queries\Customer();
 | |
| 	$customer_id = $customers->add_item( $data );
 | |
| 
 | |
| 	if ( ! empty( $customer_id ) ) {
 | |
| 		/**
 | |
| 		 * Action that runs when a customer is added with the edd_add_customer function.
 | |
| 		 *
 | |
| 		 * @since 3.0.4
 | |
| 		 *
 | |
| 		 * @param int          $customer_id Customer ID added.
 | |
| 		 * @param array        $data        Array of arguments sent to create the customer with.
 | |
| 		 */
 | |
| 		do_action( 'edd_customer_added', $customer_id, $data );
 | |
| 	}
 | |
| 
 | |
| 	return $customer_id;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Delete a customer.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int ID of customer to delete.
 | |
|  * @return int|false `1` if the customer was deleted successfully, false on error.
 | |
|  */
 | |
| function edd_delete_customer( $customer_id = 0 ) {
 | |
| 	$customers = new EDD\Database\Queries\Customer();
 | |
| 
 | |
| 	$customer_deleted = $customers->delete_item( $customer_id );
 | |
| 
 | |
| 	if ( ! empty( $customer_deleted ) ) {
 | |
| 		/**
 | |
| 		 * Action that runs when a customer is deleted with the edd_delete_customer function.
 | |
| 		 *
 | |
| 		 * @since 3.0.4
 | |
| 		 *
 | |
| 		 * @param int          $customer_id Customer ID being deleted.
 | |
| 		 */
 | |
| 		do_action( 'edd_customer_deleted', $customer_id );
 | |
| 	}
 | |
| 
 | |
| 	return $customer_deleted;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Destroy a customer.
 | |
|  *
 | |
|  * Completely deletes a customer, and the addresses and email addresses with it.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int $customer_id Customer ID.
 | |
|  * @return int|false `1` if the customer was deleted successfully, false on error.
 | |
|  */
 | |
| function edd_destroy_customer( $customer_id = 0 ) {
 | |
| 
 | |
| 	// Bail if a customer ID was not passed.
 | |
| 	if ( empty( $customer_id ) ) {
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	// Get email addresses.
 | |
| 	$email_addresses = edd_get_customer_email_addresses( array(
 | |
| 		'customer_id'   => $customer_id,
 | |
| 		'no_found_rows' => true,
 | |
| 	) );
 | |
| 
 | |
| 	// Destroy email addresses.
 | |
| 	if ( ! empty( $email_addresses ) ) {
 | |
| 		foreach ( $email_addresses as $email_address ) {
 | |
| 			edd_delete_customer_email_address( $email_address->id );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// Get addresses.
 | |
| 	$addresses = edd_get_customer_addresses( array(
 | |
| 		'customer_id'   => $customer_id,
 | |
| 		'no_found_rows' => true,
 | |
| 	) );
 | |
| 
 | |
| 	// Destroy addresses.
 | |
| 	if ( ! empty( $addresses ) ) {
 | |
| 		foreach ( $addresses as $address ) {
 | |
| 			edd_delete_customer_address( $address->id );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// Delete the customer.
 | |
| 	$customer_destroyed = edd_delete_customer( $customer_id );
 | |
| 	if ( ! empty( $customer_destroyed ) ) {
 | |
| 		/**
 | |
| 		 * Action that runs when a customer is destroyed with the edd_destroy_customer function.
 | |
| 		 *
 | |
| 		 * This action is similar to edd_customer_deleted and includes running that action,
 | |
| 		 * but also includes deleting all customer addresses and email addresses.
 | |
| 		 *
 | |
| 		 * @since 3.0.4
 | |
| 		 *
 | |
| 		 * @param int          $customer_id Customer ID being destroyed.
 | |
| 		 */
 | |
| 		do_action( 'edd_customer_destroyed', $customer_id );
 | |
| 	}
 | |
| 
 | |
| 	return $customer_destroyed;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Update a customer.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int $customer_id Customer ID.
 | |
|  * @param array $data {
 | |
|  *     Array of customer data. Default empty.
 | |
|  *
 | |
|  *     @type int    $user_id        WordPress user ID linked to the customer account.
 | |
|  *                                  Default 0.
 | |
|  *     @type string $email          Customer's primary email address. Default empty.
 | |
|  *     @type string $name           Customer's name. Default empty.
 | |
|  *     @type string $status         Customer's status. Default `active`.
 | |
|  *     @type float  $purchase_value Aggregated purchase value of the customer.
 | |
|  *                                  Default 0.
 | |
|  *     @type int    $purchase_count Aggregated purchase count of the customer.
 | |
|  *                                  Default 0.
 | |
|  *     @type string $date_created   Optional. Automatically calculated on add/edit.
 | |
|  *                                  The date & time the customer was created.
 | |
|  *                                  Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  *     @type string $date_modified  Optional. Automatically calculated on add/edit.
 | |
|  *                                  The date & time the customer was last modified.
 | |
|  *                                  Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  * }
 | |
|  *
 | |
|  * @return int|false Number of rows updated if successful, false otherwise.
 | |
|  */
 | |
| function edd_update_customer( $customer_id = 0, $data = array() ) {
 | |
| 	$customers = new EDD\Database\Queries\Customer();
 | |
| 
 | |
| 	$previous_customer_data = edd_get_customer( $customer_id );
 | |
| 	$customer_updated       = $customers->update_item( $customer_id, $data );
 | |
| 
 | |
| 	if ( ! empty( $customer_updated ) ) {
 | |
| 		/**
 | |
| 		 * Action that runs when a customer is updated with the edd_update_customer function.
 | |
| 		 *
 | |
| 		 * @since 3.0.4
 | |
| 		 *
 | |
| 		 * @param int          $customer_id            Customer ID updated.
 | |
| 		 * @param array        $data                   Array of arguments sent to create the customer with.
 | |
| 		 * @param EDD_Customer $previous_customer_data The customer row before it was updated.
 | |
| 		 */
 | |
| 		do_action( 'edd_customer_updated', $customer_id, $data, $previous_customer_data );
 | |
| 	}
 | |
| 
 | |
| 	return $customer_updated;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Get a customer item by ID.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int $customer_id Customer ID.
 | |
|  * @return EDD_Customer|false Customer object if successful, false otherwise.
 | |
|  */
 | |
| function edd_get_customer( $customer_id = 0 ) {
 | |
| 	$customers = new EDD\Database\Queries\Customer();
 | |
| 
 | |
| 	// Return customer.
 | |
| 	return $customers->get_item( $customer_id );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Get a customer item by a specific field value.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param string $field Database table field.
 | |
|  * @param string $value Value of the row.
 | |
|  *
 | |
|  * @return EDD_Customer|false Customer object if successful, false otherwise.
 | |
|  */
 | |
| function edd_get_customer_by( $field = '', $value = '' ) {
 | |
| 	// For backwards compatibility in filters only.
 | |
| 	$customers_db = EDD()->customers;
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the Customer before querying the database.
 | |
| 	 *
 | |
| 	 * Return a non-null value to bypass the default query and return early.
 | |
| 	 *
 | |
| 	 * @since 2.9.23
 | |
| 	 *
 | |
| 	 * @param mixed|null          $customer         Customer to return instead. Default null to use default method.
 | |
| 	 * @param string              $field            The field to retrieve by.
 | |
| 	 * @param mixed               $value            The value to search by.
 | |
| 	 * @param EDD\Compat\Customer $edd_customers_db Customer database class. Deprecated in 3.0.
 | |
| 	 */
 | |
| 	$found = apply_filters( 'edd_pre_get_customer', null, $field, $value, $customers_db );
 | |
| 
 | |
| 	if ( null !== $found ) {
 | |
| 		return $found;
 | |
| 	}
 | |
| 
 | |
| 	$customers = new EDD\Database\Queries\Customer();
 | |
| 	if ( 'email' === $field ) {
 | |
| 		$customer_emails = new EDD\Database\Queries\Customer_Email_Address();
 | |
| 		$customer_email  = $customer_emails->get_item_by( 'email', $value );
 | |
| 
 | |
| 		$customer = false;
 | |
| 		if ( ! empty( $customer_email->customer_id ) ) {
 | |
| 			$customer  = $customers->get_item_by( 'id', $customer_email->customer_id );
 | |
| 		}
 | |
| 	} else {
 | |
| 		$customer  = $customers->get_item_by( $field, $value );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the single Customer retrieved from the database based on field.
 | |
| 	 *
 | |
| 	 * @since 2.9.23
 | |
| 	 *
 | |
| 	 * @param EDD_Customer|false  $customer         Customer query result. False if no Customer is found.
 | |
| 	 * @param array               $args             Arguments used to query the Customer.
 | |
| 	 * @param EDD\Compat\Customer $edd_customers_db Customer database class. Deprecated in 3.0.
 | |
| 	 */
 | |
| 	$customer = apply_filters( "edd_get_customer_by_{$field}", $customer, $customers->query_vars, $customers_db );
 | |
| 
 | |
| 	/**
 | |
| 	 * Filters the single Customer retrieved from the database.
 | |
| 	 *
 | |
| 	 * @since 2.9.23
 | |
| 	 *
 | |
| 	 * @param EDD_Customer|false $customer         Customer query result. False if no Customer is found.
 | |
| 	 * @param array              $args             Arguments used to query the Customer.
 | |
| 	 * @param EDD_DB_Customers   $edd_customers_db Customer database class.
 | |
| 	 */
 | |
| 	$customer = apply_filters( 'edd_get_customer', $customer, $customers->query_vars, $customers_db );
 | |
| 
 | |
| 	return $customer;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Get a field from a customer object.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int    $customer_id Customer ID. Default `0`.
 | |
|  * @param string $field       Field to retrieve from object. Default empty.
 | |
|  *
 | |
|  * @return mixed Null if customer does not exist. Value of Customer if exists.
 | |
|  */
 | |
| function edd_get_customer_field( $customer_id = 0, $field = '' ) {
 | |
| 	$customer = edd_get_customer( $customer_id );
 | |
| 
 | |
| 	// Check that field exists.
 | |
| 	return isset( $customer->{$field} )
 | |
| 		? $customer->{$field}
 | |
| 		: null;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Query for customers.
 | |
|  *
 | |
|  * @see \EDD\Database\Queries\Customer::__construct()
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param array $args Arguments. See `EDD\Database\Queries\Customer` for
 | |
|  *                    accepted arguments.
 | |
|  * @return \EDD_Customer[] Array of `EDD_Customer` objects.
 | |
|  */
 | |
| function edd_get_customers( $args = array() ) {
 | |
| 
 | |
| 	// Parse args
 | |
| 	$r = wp_parse_args( $args, array(
 | |
| 		'number' => 30
 | |
| 	) );
 | |
| 
 | |
| 	if ( -1 == $r['number'] ) {
 | |
| 		_doing_it_wrong( __FUNCTION__, esc_html__( 'Do not use -1 to retrieve all results.', 'easy-digital-downloads' ), '3.0' );
 | |
| 		$r['number'] = 9999999;
 | |
| 	}
 | |
| 
 | |
| 	// Instantiate a query object
 | |
| 	$customers = new EDD\Database\Queries\Customer();
 | |
| 
 | |
| 	// Return customers
 | |
| 	return $customers->query( $r );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Get total number of customers.
 | |
|  *
 | |
|  * @see \EDD\Database\Queries\Customer::__construct()
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param array $args Arguments. See `EDD\Database\Queries\Customer` for
 | |
|  *                    accepted arguments.
 | |
|  * @return int Number of customers returned based on query arguments passed.
 | |
|  */
 | |
| function edd_count_customers( $args = array() ) {
 | |
| 
 | |
| 	// Parse args
 | |
| 	$r = wp_parse_args( $args, array(
 | |
| 		'count' => true
 | |
| 	) );
 | |
| 
 | |
| 	// Query for count(s)
 | |
| 	$customers = new EDD\Database\Queries\Customer( $r );
 | |
| 
 | |
| 	// Return count(s)
 | |
| 	return absint( $customers->found_items );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Query for and return array of customer counts, keyed by status.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param array $args Arguments. See `EDD\Database\Queries\Customer` for
 | |
|  *                    accepted arguments.
 | |
|  * @return array Customer counts keyed by status.
 | |
|  */
 | |
| function edd_get_customer_counts( $args = array() ) {
 | |
| 
 | |
| 	// Parse arguments
 | |
| 	$r = wp_parse_args( $args, array(
 | |
| 		'count'   => true,
 | |
| 		'groupby' => 'status'
 | |
| 	) );
 | |
| 
 | |
| 	// Query for count
 | |
| 	$counts = new EDD\Database\Queries\Customer( $r );
 | |
| 
 | |
| 	// Format & return
 | |
| 	return edd_format_counts( $counts, $r['groupby'] );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Return the role used to edit customers.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @return string Role used to edit customers.
 | |
|  */
 | |
| function edd_get_edit_customers_role() {
 | |
| 
 | |
| 	/**
 | |
| 	 * Filter role used to edit customers.
 | |
| 	 *
 | |
| 	 * @since 2.3
 | |
| 	 *
 | |
| 	 * @param string WordPress role used to edit customers. Default `edit_shop_payments`.
 | |
| 	 */
 | |
| 	return apply_filters( 'edd_edit_customers_role', 'edit_shop_payments' );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Retrieve all of the IP addresses used by a customer.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int $customer_id Customer ID.
 | |
|  *
 | |
|  * @return array Array of objects containing IP addresses.
 | |
|  */
 | |
| function edd_get_customer_ip_addresses( $customer_id = 0 ) {
 | |
| 
 | |
| 	// Bail if no customer ID was passed.
 | |
| 	if ( empty( $customer_id ) ) {
 | |
| 		return array();
 | |
| 	}
 | |
| 
 | |
| 	$customer = edd_get_customer( $customer_id );
 | |
| 
 | |
| 	return $customer->get_ips();
 | |
| }
 | |
| 
 | |
| /** Meta **********************************************************************/
 | |
| 
 | |
| /**
 | |
|  * Add meta data field to a customer.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int     $customer_id  Customer ID.
 | |
|  * @param string  $meta_key     Meta data name.
 | |
|  * @param mixed   $meta_value   Meta data value. Must be serializable if non-scalar.
 | |
|  * @param bool    $unique       Optional. Whether the same key should not be added.
 | |
|  *                              Default false.
 | |
|  *
 | |
|  * @return int|false Meta ID on success, false on failure.
 | |
|  */
 | |
| function edd_add_customer_meta( $customer_id, $meta_key, $meta_value, $unique = false ) {
 | |
| 	return add_metadata( 'edd_customer', $customer_id, $meta_key, $meta_value, $unique );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Remove meta data matching criteria from a customer.
 | |
|  *
 | |
|  * You can match based on the key, or key and value. Removing based on key and
 | |
|  * value, will keep from removing duplicate meta data with the same key. It also
 | |
|  * allows removing all meta data matching key, if needed.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int     $customer_id  Customer ID.
 | |
|  * @param string  $meta_key     Meta data name.
 | |
|  * @param mixed   $meta_value   Optional. Meta data value. Must be serializable if
 | |
|  *                              non-scalar. Default empty.
 | |
|  *
 | |
|  * @return bool True on success, false on failure.
 | |
|  */
 | |
| function edd_delete_customer_meta( $customer_id, $meta_key, $meta_value = '' ) {
 | |
| 	return delete_metadata( 'edd_customer', $customer_id, $meta_key, $meta_value );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Retrieve customer meta field for a customer.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int     $customer_id  Customer ID.
 | |
|  * @param string  $key          Optional. The meta key to retrieve. By default, returns
 | |
|  *                              data for all keys. Default empty.
 | |
|  * @param bool    $single       Optional, default is false.
 | |
|  *                              If true, return only the first value of the specified meta_key.
 | |
|  *                              This parameter has no effect if meta_key is not specified.
 | |
|  *
 | |
|  * @return mixed Will be an array if $single is false. Will be value of meta data
 | |
|  *               field if $single is true.
 | |
|  */
 | |
| function edd_get_customer_meta( $customer_id, $key = '', $single = false ) {
 | |
| 	return get_metadata( 'edd_customer', $customer_id, $key, $single );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Update customer meta field based on customer ID.
 | |
|  *
 | |
|  * Use the $prev_value parameter to differentiate between meta fields with the
 | |
|  * same key and customer ID.
 | |
|  *
 | |
|  * If the meta field for the customer does not exist, it will be added.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int     $customer_id  Customer ID.
 | |
|  * @param string  $meta_key     Meta data key.
 | |
|  * @param mixed   $meta_value   Meta data value. Must be serializable if non-scalar.
 | |
|  * @param mixed   $prev_value   Optional. Previous value to check before removing.
 | |
|  *                              Default empty.
 | |
|  *
 | |
|  * @return int|bool Meta ID if the key didn't exist, true on successful update,
 | |
|  *                  false on failure.
 | |
|  */
 | |
| function edd_update_customer_meta( $customer_id, $meta_key, $meta_value, $prev_value = '' ) {
 | |
| 	return update_metadata( 'edd_customer', $customer_id, $meta_key, $meta_value, $prev_value );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Delete everything from customer meta matching meta key.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param string $meta_key Key to search for when deleting.
 | |
|  *
 | |
|  * @return bool Whether the customer meta key was deleted from the database.
 | |
|  */
 | |
| function edd_delete_customer_meta_by_key( $meta_key ) {
 | |
| 	return delete_metadata( 'edd_customer', null, $meta_key, '', true );
 | |
| }
 | |
| 
 | |
| /** Customer Addresses **********************************************************/
 | |
| 
 | |
| /**
 | |
|  * Get a customer address by ID.
 | |
|  *
 | |
|  * @internal This method is named edd_fetch_customer_address as edd_get_customer_address
 | |
|  *           exists for backwards compatibility purposes and returns an array instead of
 | |
|  *           an object.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int $customer_address_id Customer address ID.
 | |
|  * @return EDD\Customers\Customer_Address Customer address object.
 | |
|  */
 | |
| function edd_fetch_customer_address( $customer_address_id = 0 ) {
 | |
| 	$customer_addresses = new EDD\Database\Queries\Customer_Address();
 | |
| 
 | |
| 	// Return customer address.
 | |
| 	return $customer_addresses->get_item( $customer_address_id );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Add a customer address.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param array $data {
 | |
|  *     Array of customer address data. Default empty.
 | |
|  *
 | |
|  *     The `date_created` and `date_modified` parameters do not need to be passed.
 | |
|  *     They will be automatically populated if empty.
 | |
|  *
 | |
|  *     @type int    $customer_id   Customer ID. Default `0`.
 | |
|  *     @type string $type          Address type. Default `billing`.
 | |
|  *     @type string $status        Address status, if used or not. Default `active`.
 | |
|  *     @type string $address       First line of address. Default empty.
 | |
|  *     @type string $address2      Second line of address. Default empty.
 | |
|  *     @type string $city          City. Default empty.
 | |
|  *     @type string $region        Region. See `edd_get_shop_states()` for
 | |
|  *                                 accepted values. Default empty.
 | |
|  *     @type string $postal_code   Postal code. Default empty.
 | |
|  *     @type string $country       Country. See `edd_get_country_list()` for
 | |
|  *                                 accepted values. Default empty.
 | |
|  *     @type string $date_created  Optional. Automatically calculated on add/edit.
 | |
|  *                                 The date & time the address was inserted.
 | |
|  *                                 Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  *     @type string $date_modified Optional. Automatically calculated on add/edit.
 | |
|  *                                 The date & time the address was last modified.
 | |
|  *                                 Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  * }
 | |
|  * @return int|false ID of newly created customer address, false on error.
 | |
|  */
 | |
| function edd_add_customer_address( $data = array() ) {
 | |
| 
 | |
| 	// A customer ID must be supplied for every address inserted.
 | |
| 	if ( empty( $data['customer_id'] ) ) {
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	$customer_addresses = new EDD\Database\Queries\Customer_Address();
 | |
| 
 | |
| 	return $customer_addresses->add_item( $data );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Delete a customer address.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int $customer_address_id Customer address ID.
 | |
|  * @return int|false `1` if the adjustment was deleted successfully, false on error.
 | |
|  */
 | |
| function edd_delete_customer_address( $customer_address_id = 0 ) {
 | |
| 	$customer_addresses = new EDD\Database\Queries\Customer_Address();
 | |
| 
 | |
| 	return $customer_addresses->delete_item( $customer_address_id );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Update a customer address.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int   $customer_address_id Customer address ID.
 | |
|  * @param array $data {
 | |
|  *     Array of customer address data. Default empty.
 | |
|  *
 | |
|  *     @type int    $customer_id   Customer ID. Default `0`.
 | |
|  *     @type string $type          Address type. Default `billing`.
 | |
|  *     @type string $status        Address status, if used or not. Default `active`.
 | |
|  *     @type string $address       First line of address. Default empty.
 | |
|  *     @type string $address2      Second line of address. Default empty.
 | |
|  *     @type string $city          City. Default empty.
 | |
|  *     @type string $region        Region. See `edd_get_shop_states()` for
 | |
|  *                                 accepted values. Default empty.
 | |
|  *     @type string $postal_code   Postal code. Default empty.
 | |
|  *     @type string $country       Country. See `edd_get_country_list()` for
 | |
|  *                                 accepted values. Default empty.
 | |
|  *     @type string $date_created  Optional. Automatically calculated on add/edit.
 | |
|  *                                 The date & time the adjustment was inserted.
 | |
|  *                                 Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  *     @type string $date_modified Optional. Automatically calculated on add/edit.
 | |
|  *                                 The date & time the adjustment was last modified.
 | |
|  *                                 Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  * }
 | |
|  *
 | |
|  * @return int|false Number of rows updated if successful, false otherwise.
 | |
|  */
 | |
| function edd_update_customer_address( $customer_address_id = 0, $data = array() ) {
 | |
| 	$customer_addresses = new EDD\Database\Queries\Customer_Address();
 | |
| 
 | |
| 	return $customer_addresses->update_item( $customer_address_id, $data );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Get a customer address by a specific field value.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param string $field Database table field.
 | |
|  * @param string $value Value of the row.
 | |
|  *
 | |
|  * @return \EDD\Customers\Customer_Address|false Customer_Address if successful,
 | |
|  *                                               false otherwise.
 | |
|  */
 | |
| function edd_get_customer_address_by( $field = '', $value = '' ) {
 | |
| 	$customer_addresses = new EDD\Database\Queries\Customer_Address();
 | |
| 
 | |
| 	// Return customer address
 | |
| 	return $customer_addresses->get_item_by( $field, $value );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Query for customer addresses.
 | |
|  *
 | |
|  * @see \EDD\Database\Queries\Customer_Address::__construct()
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param array $args Arguments. See `EDD\Database\Queries\Customer_Address` for
 | |
|  *                    accepted arguments.
 | |
|  * @return \EDD\Customers\Customer_Address[] Array of `Customer_Address` objects.
 | |
|  */
 | |
| function edd_get_customer_addresses( $args = array() ) {
 | |
| 
 | |
| 	// Parse args
 | |
| 	$r = wp_parse_args( $args, array(
 | |
| 		'number' => 30
 | |
| 	) );
 | |
| 
 | |
| 	// Instantiate a query object
 | |
| 	$customer_addresses = new EDD\Database\Queries\Customer_Address();
 | |
| 
 | |
| 	// Return addresses
 | |
| 	return $customer_addresses->query( $r );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Count customer addresses.
 | |
|  *
 | |
|  * @see \EDD\Database\Queries\Customer_Address::__construct()
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param array $args Arguments. See `EDD\Database\Queries\Customer_Address` for
 | |
|  *                    accepted arguments.
 | |
|  * @return int Number of customer addresses returned based on query arguments passed.
 | |
|  */
 | |
| function edd_count_customer_addresses( $args = array() ) {
 | |
| 
 | |
| 	// Parse args
 | |
| 	$r = wp_parse_args( $args, array(
 | |
| 		'count' => true
 | |
| 	) );
 | |
| 
 | |
| 	// Query for count(s)
 | |
| 	$customer_addresses = new EDD\Database\Queries\Customer_Address( $r );
 | |
| 
 | |
| 	// Return count(s)
 | |
| 	return absint( $customer_addresses->found_items );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Maybe add a customer address. Only unique addresses will be added. Used
 | |
|  * by `edd_build_order()` and `edd_add_manual_order()` to maybe add order
 | |
|  * addresses to the customer addresses table. Also used by the data migrator
 | |
|  * class when migrating orders from 2.9.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int   $customer_id Customer ID.
 | |
|  * @param array $data {
 | |
|  *     Array of customer address data. Default empty.
 | |
|  *
 | |
|  *     @type string $type          Address type. Default `billing`.
 | |
|  *     @type string $status        Address status, if used or not. Default `active`.
 | |
|  *     @type string $address       First line of address. Default empty.
 | |
|  *     @type string $address2      Second line of address. Default empty.
 | |
|  *     @type string $city          City. Default empty.
 | |
|  *     @type string $region        Region. See `edd_get_shop_states()` for
 | |
|  *                                 accepted values. Default empty.
 | |
|  *     @type string $postal_code   Postal code. Default empty.
 | |
|  *     @type string $country       Country. See `edd_get_country_list()` for
 | |
|  *                                 accepted values. Default empty.
 | |
|  *     @type string $date_created  Optional. Automatically calculated on add/edit.
 | |
|  *                                 The date & time the address was inserted.
 | |
|  *                                 Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  *     @type string $date_modified Optional. Automatically calculated on add/edit.
 | |
|  *                                 The date & time the address was last modified.
 | |
|  *                                 Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  * }
 | |
|  *
 | |
|  * @return int|false ID of the insert customer address. False otherwise.
 | |
|  */
 | |
| function edd_maybe_add_customer_address( $customer_id = 0, $data = array() ) {
 | |
| 
 | |
| 	// Bail if nothing passed.
 | |
| 	if ( empty( $customer_id ) || empty( $data ) ) {
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	// Set up an array with empty address keys. If all of these are empty in $data, the address should not be added.
 | |
| 	$empty_address    = array(
 | |
| 		'address'     => '',
 | |
| 		'address2'    => '',
 | |
| 		'city'        => '',
 | |
| 		'region'      => '',
 | |
| 		'country'     => '',
 | |
| 		'postal_code' => '',
 | |
| 	);
 | |
| 	$address_to_check = array_intersect_key( $data, $empty_address );
 | |
| 	$address_to_check = array_filter( $address_to_check );
 | |
| 	if ( empty( $address_to_check ) ) {
 | |
| 		return false;
 | |
| 	}
 | |
| 	$address_to_check['customer_id'] = $customer_id;
 | |
| 	$address_to_check['type']        = empty( $data['type'] ) ? 'billing' : $data['type'];
 | |
| 
 | |
| 	// Check if this address is already assigned to the customer.
 | |
| 	$address_exists = edd_get_customer_addresses( $address_to_check );
 | |
| 	if ( ! empty( $address_exists ) ) {
 | |
| 		if ( 'billing' === $address_to_check['type'] ) {
 | |
| 			edd_update_customer_address( $address_exists[0], array( 'is_primary' => true ) );
 | |
| 		}
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	$data['customer_id'] = $customer_id;
 | |
| 	if ( 'billing' === $address_to_check['type'] ) {
 | |
| 		$data['is_primary'] = true;
 | |
| 	}
 | |
| 
 | |
| 	// Add the new address to the customer record.
 | |
| 	return edd_add_customer_address( $data );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Query for and return array of customer address counts, keyed by status.
 | |
|  *
 | |
|  * @see \EDD\Database\Queries\Customer_Address::__construct()
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param array $args Arguments. See `EDD\Database\Queries\Customer_Address` for
 | |
|  *                    accepted arguments.
 | |
|  * @return array Customer address counts keyed by status.
 | |
|  */
 | |
| function edd_get_customer_address_counts( $args = array() ) {
 | |
| 
 | |
| 	// Parse args
 | |
| 	$r = wp_parse_args( $args, array(
 | |
| 		'count'   => true,
 | |
| 		'groupby' => 'status'
 | |
| 	) );
 | |
| 
 | |
| 	// Query for count
 | |
| 	$counts = new EDD\Database\Queries\Customer_Address( $r );
 | |
| 
 | |
| 	// Format & return
 | |
| 	return edd_format_counts( $counts, $r['groupby'] );
 | |
| }
 | |
| 
 | |
| /** Customer Email Addresses *************************************************/
 | |
| 
 | |
| /**
 | |
|  * Add a customer email address.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param array $data {
 | |
|  *     Array of customer email address data. Default empty.
 | |
|  *
 | |
|  *     The `date_created` and `date_modified` parameters do not need to be passed.
 | |
|  *     They will be automatically populated if empty.
 | |
|  *
 | |
|  *     @type int    $customer_id   Customer ID. Default `0`.
 | |
|  *     @type string $type          Email address type. Default `secondary`.
 | |
|  *     @type string $status        Email address type. Default `active`.
 | |
|  *     @type string $email         Email address. Default empty.
 | |
|  *     @type string $date_created  Optional. Automatically calculated on add/edit.
 | |
|  *                                 The date & time the email address was inserted.
 | |
|  *                                 Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  *     @type string $date_modified Optional. Automatically calculated on add/edit.
 | |
|  *                                 The date & time the email address was last
 | |
|  *                                 modified. Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  * }
 | |
|  * @return int|false ID of newly created customer email address, false on error.
 | |
|  */
 | |
| function edd_add_customer_email_address( $data ) {
 | |
| 
 | |
| 	// A customer ID and email must be supplied for every address inserted.
 | |
| 	if ( empty( $data['customer_id'] ) || empty( $data['email'] ) ) {
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	// Instantiate a query object.
 | |
| 	$customer_email_addresses = new EDD\Database\Queries\Customer_Email_Address();
 | |
| 
 | |
| 	// Check if the address already exists for this customer.
 | |
| 	$existing_addresses = $customer_email_addresses->query(
 | |
| 		array(
 | |
| 			'customer_id' => $data['customer_id'],
 | |
| 			'email'       => $data['email'],
 | |
| 		)
 | |
| 	);
 | |
| 	if ( ! empty( $existing_addresses ) ) {
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	// Add the email address to the customer.
 | |
| 	return $customer_email_addresses->add_item( $data );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Delete a customer email address.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int $customer_email_address_id Customer email address ID.
 | |
|  * @return int|false `1` if the customer email address was deleted successfully,
 | |
|  *                   false on error.
 | |
|  */
 | |
| function edd_delete_customer_email_address( $customer_email_address_id ) {
 | |
| 	$customer_email_addresses = new EDD\Database\Queries\Customer_Email_Address();
 | |
| 
 | |
| 	return $customer_email_addresses->delete_item( $customer_email_address_id );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Update a customer email address.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int   $customer_email_address_id Customer email address ID.
 | |
|  * @param array $data {
 | |
|  *     Array of customer email address data. Default empty.
 | |
|  *
 | |
|  *     @type int    $customer_id   Customer ID. Default `0`.
 | |
|  *     @type string $type          Email address type. Default `secondary`.
 | |
|  *     @type string $status        Email address type. Default `active`.
 | |
|  *     @type string $email         Email address. Default empty.
 | |
|  *     @type string $date_created  Optional. Automatically calculated on add/edit.
 | |
|  *                                 The date & time the email address was inserted.
 | |
|  *                                 Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  *     @type string $date_modified Optional. Automatically calculated on add/edit.
 | |
|  *                                 The date & time the email address was last
 | |
|  *                                 modified. Format: YYYY-MM-DD HH:MM:SS. Default empty.
 | |
|  * }
 | |
|  *
 | |
|  * @return int|false Number of rows updated if successful, false otherwise.
 | |
|  */
 | |
| function edd_update_customer_email_address( $customer_email_address_id, $data = array() ) {
 | |
| 	$customer_email_addresses = new EDD\Database\Queries\Customer_Email_Address();
 | |
| 
 | |
| 	return $customer_email_addresses->update_item( $customer_email_address_id, $data );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Get a customer email address by ID.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param int $customer_email_address_id Customer email address ID.
 | |
|  * @return \EDD\Customers\Customer_Email_Address|false Customer_Email_Address if
 | |
|  *                                                     successful, false otherwise.
 | |
|  */
 | |
| function edd_get_customer_email_address( $customer_email_address_id ) {
 | |
| 	$customer_email_addresses = new EDD\Database\Queries\Customer_Email_Address();
 | |
| 
 | |
| 	// Return customer email address
 | |
| 	return $customer_email_addresses->get_item( $customer_email_address_id );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Get a customer email address by a specific field value.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param string $field Database table field.
 | |
|  * @param string $value Value of the row.
 | |
|  *
 | |
|  * @return \EDD\Customers\Customer_Email_Address|false Customer_Email_Address if
 | |
|  *                                                     successful, false otherwise.
 | |
|  */
 | |
| function edd_get_customer_email_address_by( $field = '', $value = '' ) {
 | |
| 	$customer_email_addresses = new EDD\Database\Queries\Customer_Email_Address();
 | |
| 
 | |
| 	// Return customer email address
 | |
| 	return $customer_email_addresses->get_item_by( $field, $value );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Query for customer email addresses.
 | |
|  *
 | |
|  * @see \EDD\Database\Queries\Customer_Email_Address::__construct()
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param array $args Arguments. See `EDD\Database\Queries\Customer_Email_Address`
 | |
|  *                    for accepted arguments.
 | |
|  * @return \EDD\Customers\Customer_Email_Address[] Array of `Customer_Email_Address` objects.
 | |
|  */
 | |
| function edd_get_customer_email_addresses( $args = array() ) {
 | |
| 
 | |
| 	// Parse args
 | |
| 	$r = wp_parse_args( $args, array(
 | |
| 		'number' => 30
 | |
| 	) );
 | |
| 
 | |
| 	// Instantiate a query object
 | |
| 	$customer_email_addresses = new EDD\Database\Queries\Customer_Email_Address();
 | |
| 
 | |
| 	// Return customer email addresses
 | |
| 	return $customer_email_addresses->query( $r );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Count customer addresses.
 | |
|  *
 | |
|  * @see \EDD\Database\Queries\Customer_Email_Address::__construct()
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param array $args Arguments. See `EDD\Database\Queries\Customer_Email_Address`
 | |
|  *                    for accepted arguments.
 | |
|  * @return int Number of customer email addresses returned based on query arguments passed.
 | |
|  */
 | |
| function edd_count_customer_email_addresses( $args = array() ) {
 | |
| 
 | |
| 	// Parse args
 | |
| 	$r = wp_parse_args( $args, array(
 | |
| 		'count' => true
 | |
| 	) );
 | |
| 
 | |
| 	// Query for count(s)
 | |
| 	$customer_email_addresses = new EDD\Database\Queries\Customer_Email_Address( $r );
 | |
| 
 | |
| 	// Return count(s)
 | |
| 	return absint( $customer_email_addresses->found_items );
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Query for and return array of customer email counts, keyed by status.
 | |
|  *
 | |
|  * @see \EDD\Database\Queries\Customer_Email_Address::__construct()
 | |
|  *
 | |
|  * @since 3.0
 | |
|  *
 | |
|  * @param array $args Arguments. See `EDD\Database\Queries\Customer_Email_Address`
 | |
|  *                    for accepted arguments.
 | |
|  * @return array Customer email addresses keyed by status.
 | |
|  */
 | |
| function edd_get_customer_email_address_counts( $args = array() ) {
 | |
| 
 | |
| 	// Parse args
 | |
| 	$r = wp_parse_args( $args, array(
 | |
| 		'count'   => true,
 | |
| 		'groupby' => 'status'
 | |
| 	) );
 | |
| 
 | |
| 	// Query for count
 | |
| 	$counts = new EDD\Database\Queries\Customer_Email_Address( $r );
 | |
| 
 | |
| 	// Format & return
 | |
| 	return edd_format_counts( $counts, $r['groupby'] );
 | |
| }
 |