304 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			304 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Backwards Compatibility Handler for Customers.
 | |
|  *
 | |
|  * @package     EDD
 | |
|  * @subpackage  Compat
 | |
|  * @copyright   Copyright (c) 2018, Easy Digital Downloads, LLC
 | |
|  * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 | |
|  * @since       3.0
 | |
|  */
 | |
| namespace EDD\Compat;
 | |
| 
 | |
| use EDD\Database\Table;
 | |
| 
 | |
| // Exit if accessed directly
 | |
| defined( 'ABSPATH' ) || exit;
 | |
| 
 | |
| /**
 | |
|  * Customer Class.
 | |
|  *
 | |
|  * @since 3.0
 | |
|  */
 | |
| class Customer extends Base {
 | |
| 
 | |
| 	/**
 | |
| 	 * Holds the component for which we are handling back-compat. There is a chance that two methods have the same name
 | |
| 	 * and need to be dispatched to completely other methods. When a new instance of Back_Compat is created, a component
 | |
| 	 * can be passed to the constructor which will allow __call() to dispatch to the correct methods.
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 * @access protected
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected $component = 'customer';
 | |
| 
 | |
| 	/**
 | |
| 	 * Magic method to handle calls to properties that no longer exist.
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @param string $property Name of the property.
 | |
| 	 *
 | |
| 	 * @return mixed
 | |
| 	 */
 | |
| 	public function __get( $property ) {
 | |
| 		switch( $property ) {
 | |
| 			case 'table_name' :
 | |
| 				global $wpdb;
 | |
| 				return $wpdb->edd_customers;
 | |
| 
 | |
| 			case 'primary_key' :
 | |
| 				return 'id';
 | |
| 
 | |
| 			case 'version' :
 | |
| 				$table = edd_get_component_interface( 'customer', 'table' );
 | |
| 
 | |
| 				return $table instanceof Table ? $table->get_version() : false;
 | |
| 			case 'meta_type' :
 | |
| 				return 'customer';
 | |
| 
 | |
| 			case 'date_key' :
 | |
| 				return 'date_created';
 | |
| 
 | |
| 			case 'cache_group' :
 | |
| 				return 'customers';
 | |
| 		}
 | |
| 
 | |
| 		return null;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Magic method to handle calls to method that no longer exist.
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @param string $name      Name of the method.
 | |
| 	 * @param array  $arguments Enumerated array containing the parameters passed to the $name'ed method.
 | |
| 	 * @return mixed Dependent on the method being dispatched to.
 | |
| 	 */
 | |
| 	public function __call( $name, $arguments ) {
 | |
| 		switch ( $name ) {
 | |
| 			case 'add':
 | |
| 			case 'insert':
 | |
| 				return edd_add_customer( $arguments[0] );
 | |
| 
 | |
| 			case 'update':
 | |
| 				return edd_update_customer( $arguments[0], $arguments[1] );
 | |
| 
 | |
| 			case 'delete':
 | |
| 				if ( ! is_bool( $arguments[0] ) ) {
 | |
| 					return false;
 | |
| 				}
 | |
| 
 | |
| 				$column = is_email( $arguments[0] ) ? 'email' : 'id';
 | |
| 				$customer = edd_get_customer_by( $column, $arguments[0] );
 | |
| 				edd_delete_customer( $customer->id );
 | |
| 				break;
 | |
| 			case 'exists':
 | |
| 				return (bool) edd_get_customer_by( 'email', $arguments[0] );
 | |
| 
 | |
| 			case 'get_customer_by':
 | |
| 				return edd_get_customer_by( $arguments[0], $arguments[1] );
 | |
| 
 | |
| 			case 'get_customers':
 | |
| 				return edd_get_customers( $arguments[0] );
 | |
| 
 | |
| 			case 'count':
 | |
| 				return edd_count_customers();
 | |
| 
 | |
| 			case 'get_column':
 | |
| 				return edd_get_customer_by( $arguments[0], $arguments[1] );
 | |
| 
 | |
| 			case 'attach_payment':
 | |
| 				/** @var $customer \EDD_Customer */
 | |
| 				$customer = edd_get_customer( $arguments[0] );
 | |
| 
 | |
| 				if ( ! $customer ) {
 | |
| 					return false;
 | |
| 				}
 | |
| 
 | |
| 				return $customer->attach_payment( $arguments[1], false );
 | |
| 
 | |
| 			case 'remove_payment':
 | |
| 				/** @var $customer \EDD_Customer */
 | |
| 				$customer = edd_get_customer( $arguments[0] );
 | |
| 
 | |
| 				if ( ! $customer ) {
 | |
| 					return false;
 | |
| 				}
 | |
| 
 | |
| 				return $customer->remove_payment( $arguments[1], false );
 | |
| 
 | |
| 			case 'increment_stats':
 | |
| 				/** @var $customer \EDD_Customer */
 | |
| 				$customer = edd_get_customer( $arguments[0] );
 | |
| 
 | |
| 				if ( ! $customer ) {
 | |
| 					return false;
 | |
| 				}
 | |
| 
 | |
| 				$increased_count = $customer->increase_purchase_count();
 | |
| 				$increased_value = $customer->increase_value( $arguments[1] );
 | |
| 
 | |
| 				return ( $increased_count && $increased_value )
 | |
| 					? true
 | |
| 					: false;
 | |
| 
 | |
| 			case 'decrement_stats':
 | |
| 				/** @var $customer \EDD_Customer */
 | |
| 				$customer = edd_get_customer( $arguments[0] );
 | |
| 
 | |
| 				if ( ! $customer ) {
 | |
| 					return false;
 | |
| 				}
 | |
| 
 | |
| 				$decreased_count = $customer->decrease_purchase_count();
 | |
| 				$decreased_value = $customer->decrease_value( $arguments[1] );
 | |
| 
 | |
| 				return ( $decreased_count && $decreased_value )
 | |
| 					? true
 | |
| 					: false;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Backwards compatibility hooks for customers.
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 * @access protected
 | |
| 	 */
 | |
| 	protected function hooks() {
 | |
| 
 | |
| 		/** Filters **********************************************************/
 | |
| 
 | |
| 		add_filter( 'get_user_metadata',    array( $this, 'get_user_meta'    ), 99, 4 );
 | |
| 		add_filter( 'update_user_metadata', array( $this, 'update_user_meta' ), 99, 5 );
 | |
| 		add_filter( 'add_user_metadata',    array( $this, 'update_user_meta' ), 99, 5 );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Backwards compatibility filters for get_user_meta() calls on customers.
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @param mixed  $value     The value get_post_meta would return if we don't filter.
 | |
| 	 * @param int    $object_id The object ID post meta was requested for.
 | |
| 	 * @param string $meta_key  The meta key requested.
 | |
| 	 * @param bool   $single    If a single value or an array of the value is requested.
 | |
| 	 *
 | |
| 	 * @return mixed The value to return.
 | |
| 	 */
 | |
| 	public function get_user_meta( $value, $object_id, $meta_key, $single ) {
 | |
| 		if ( 'get_user_metadata' !== current_filter() ) {
 | |
| 			$message = __( 'This function is not meant to be called directly. It is only here for backwards compatibility purposes.', 'easy-digital-downloads' );
 | |
| 			_doing_it_wrong( __FUNCTION__, esc_html( $message ), 'EDD 3.0' );
 | |
| 		}
 | |
| 
 | |
| 		if ( '_edd_user_address' !== $meta_key ) {
 | |
| 			return $value;
 | |
| 		}
 | |
| 
 | |
| 		$value = edd_get_customer_address( $object_id );
 | |
| 
 | |
| 		if ( $this->show_notices ) {
 | |
| 			_doing_it_wrong( 'get_user_meta()', 'User addresses being stored in meta have been <strong>deprecated</strong> since Easy Digital Downloads 3.0! Use <code>edd_get_customer_address()</code> instead.', 'EDD 3.0' );
 | |
| 
 | |
| 			if ( $this->show_backtrace ) {
 | |
| 				$backtrace = debug_backtrace();
 | |
| 				trigger_error( print_r( $backtrace, 1 ) );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return array( $value );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Listen for calls to update_user_meta() for customers and see if we need to filter them.
 | |
| 	 *
 | |
| 	 * This is here for backwards compatibility purposes with the migration to custom tables in EDD 3.0.
 | |
| 	 *
 | |
| 	 * @since 3.0
 | |
| 	 *
 | |
| 	 * @param null|bool $check      Whether to allow updating metadata for the given type.
 | |
| 	 * @param int       $object_id  Object ID.
 | |
| 	 * @param string    $meta_key   Meta key.
 | |
| 	 * @param mixed     $meta_value Meta value. Must be serializable if non-scalar.
 | |
| 	 * @param mixed     $prev_value Optional. If specified, only update existing metadata entries with the specified value.
 | |
| 	 *                              Otherwise, update all entries.
 | |
| 	 *
 | |
| 	 * @return mixed Returns 'null' if no action should be taken and WordPress core can continue, or non-null to avoid usermeta.
 | |
| 	 */
 | |
| 	public function update_user_meta( $check, $object_id, $meta_key, $meta_value, $prev_value ) {
 | |
| 		if ( '_edd_user_address' !== $meta_key ) {
 | |
| 			return $check;
 | |
| 		}
 | |
| 
 | |
| 		// Fetch saved primary address.
 | |
| 		$addresses = edd_get_customer_addresses(
 | |
| 			array(
 | |
| 				'number'      => 1,
 | |
| 				'is_primary'  => true,
 | |
| 				'customer_id' => $object_id,
 | |
| 			)
 | |
| 		);
 | |
| 
 | |
| 		// Defaults.
 | |
| 		$defaults = array(
 | |
| 			'line1'   => '',
 | |
| 			'line2'   => '',
 | |
| 			'city'    => '',
 | |
| 			'state'   => '',
 | |
| 			'country' => '',
 | |
| 			'zip'     => '',
 | |
| 		);
 | |
| 
 | |
| 		$address = wp_parse_args( (array) $meta_value, $defaults );
 | |
| 
 | |
| 		if ( is_array( $addresses ) && ! empty( $addresses[0] ) ) {
 | |
| 			$customer_address = $addresses[0];
 | |
| 
 | |
| 			edd_update_customer_address(
 | |
| 				$customer_address->id,
 | |
| 				array(
 | |
| 					'address'     => $address['line1'],
 | |
| 					'address2'    => $address['line2'],
 | |
| 					'city'        => $address['city'],
 | |
| 					'region'      => $address['state'],
 | |
| 					'postal_code' => $address['zip'],
 | |
| 					'country'     => $address['country'],
 | |
| 				)
 | |
| 			);
 | |
| 		} else {
 | |
| 			$customer = edd_get_customer_by( 'user_id', absint( $object_id ) );
 | |
| 
 | |
| 			if ( $customer ) {
 | |
| 				edd_add_customer_address(
 | |
| 					array(
 | |
| 						'customer_id' => $customer->id,
 | |
| 						'address'     => $address['line1'],
 | |
| 						'address2'    => $address['line2'],
 | |
| 						'city'        => $address['city'],
 | |
| 						'region'      => $address['state'],
 | |
| 						'postal_code' => $address['zip'],
 | |
| 						'country'     => $address['country'],
 | |
| 						'is_primary'  => true,
 | |
| 					)
 | |
| 				);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ( $this->show_notices ) {
 | |
| 			_doing_it_wrong( 'add_user_meta()/update_user_meta()', 'User addresses being stored in meta have been <strong>deprecated</strong> since Easy Digital Downloads 3.0! Use <code>edd_add_customer_address()/edd_update_customer_address()()</code> instead.', 'EDD 3.0' );
 | |
| 
 | |
| 			if ( $this->show_backtrace ) {
 | |
| 				$backtrace = debug_backtrace();
 | |
| 				trigger_error( print_r( $backtrace, 1 ) );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return $check;
 | |
| 	}
 | |
| 
 | |
| }
 |