| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433 |
- <?php
- /**
- * Class for customer download permissions.
- *
- * @package WooCommerce/Classes
- * @version 3.0.0
- * @since 3.0.0
- */
- defined( 'ABSPATH' ) || exit;
- /**
- * Customer download class.
- */
- class WC_Customer_Download extends WC_Data implements ArrayAccess {
- /**
- * This is the name of this object type.
- *
- * @var string
- */
- protected $object_type = 'customer_download';
- /**
- * Download Data array.
- *
- * @since 3.0.0
- * @var array
- */
- protected $data = array(
- 'download_id' => '',
- 'product_id' => 0,
- 'user_id' => 0,
- 'user_email' => '',
- 'order_id' => 0,
- 'order_key' => '',
- 'downloads_remaining' => '',
- 'access_granted' => null,
- 'access_expires' => null,
- 'download_count' => 0,
- );
- /**
- * Constructor.
- *
- * @param int|object|array $download Download ID, instance or data.
- */
- public function __construct( $download = 0 ) {
- parent::__construct( $download );
- if ( is_numeric( $download ) && $download > 0 ) {
- $this->set_id( $download );
- } elseif ( $download instanceof self ) {
- $this->set_id( $download->get_id() );
- } elseif ( is_object( $download ) && ! empty( $download->permission_id ) ) {
- $this->set_id( $download->permission_id );
- $this->set_props( (array) $download );
- $this->set_object_read( true );
- } else {
- $this->set_object_read( true );
- }
- $this->data_store = WC_Data_Store::load( 'customer-download' );
- if ( $this->get_id() > 0 ) {
- $this->data_store->read( $this );
- }
- }
- /*
- |--------------------------------------------------------------------------
- | Getters
- |--------------------------------------------------------------------------
- */
- /**
- * Get download id.
- *
- * @param string $context What the value is for. Valid values are 'view' and 'edit'.
- * @return string
- */
- public function get_download_id( $context = 'view' ) {
- return $this->get_prop( 'download_id', $context );
- }
- /**
- * Get product id.
- *
- * @param string $context What the value is for. Valid values are 'view' and 'edit'.
- * @return integer
- */
- public function get_product_id( $context = 'view' ) {
- return $this->get_prop( 'product_id', $context );
- }
- /**
- * Get user id.
- *
- * @param string $context What the value is for. Valid values are 'view' and 'edit'.
- * @return integer
- */
- public function get_user_id( $context = 'view' ) {
- return $this->get_prop( 'user_id', $context );
- }
- /**
- * Get user_email.
- *
- * @param string $context What the value is for. Valid values are 'view' and 'edit'.
- * @return string
- */
- public function get_user_email( $context = 'view' ) {
- return $this->get_prop( 'user_email', $context );
- }
- /**
- * Get order_id.
- *
- * @param string $context What the value is for. Valid values are 'view' and 'edit'.
- * @return integer
- */
- public function get_order_id( $context = 'view' ) {
- return $this->get_prop( 'order_id', $context );
- }
- /**
- * Get order_key.
- *
- * @param string $context What the value is for. Valid values are 'view' and 'edit'.
- * @return string
- */
- public function get_order_key( $context = 'view' ) {
- return $this->get_prop( 'order_key', $context );
- }
- /**
- * Get downloads_remaining.
- *
- * @param string $context What the value is for. Valid values are 'view' and 'edit'.
- * @return integer|string
- */
- public function get_downloads_remaining( $context = 'view' ) {
- return $this->get_prop( 'downloads_remaining', $context );
- }
- /**
- * Get access_granted.
- *
- * @param string $context What the value is for. Valid values are 'view' and 'edit'.
- * @return WC_DateTime|null Object if the date is set or null if there is no date.
- */
- public function get_access_granted( $context = 'view' ) {
- return $this->get_prop( 'access_granted', $context );
- }
- /**
- * Get access_expires.
- *
- * @param string $context What the value is for. Valid values are 'view' and 'edit'.
- * @return WC_DateTime|null Object if the date is set or null if there is no date.
- */
- public function get_access_expires( $context = 'view' ) {
- return $this->get_prop( 'access_expires', $context );
- }
- /**
- * Get download_count.
- *
- * @param string $context What the value is for. Valid values are 'view' and 'edit'.
- * @return integer
- */
- public function get_download_count( $context = 'view' ) {
- // Check for count of download logs.
- $data_store = WC_Data_Store::load( 'customer-download-log' );
- $download_log_ids = $data_store->get_download_logs_for_permission( $this->get_id() );
- $download_log_count = 0;
- if ( ! empty( $download_log_ids ) ) {
- $download_log_count = count( $download_log_ids );
- }
- // Check download count in prop.
- $download_count_prop = $this->get_prop( 'download_count', $context );
- // Return the larger of the two in case they differ.
- // If logs are removed for some reason, we should still respect the
- // count stored in the prop.
- return max( $download_log_count, $download_count_prop );
- }
- /*
- |--------------------------------------------------------------------------
- | Setters
- |--------------------------------------------------------------------------
- */
- /**
- * Set download id.
- *
- * @param string $value Download ID.
- */
- public function set_download_id( $value ) {
- $this->set_prop( 'download_id', $value );
- }
- /**
- * Set product id.
- *
- * @param int $value Product ID.
- */
- public function set_product_id( $value ) {
- $this->set_prop( 'product_id', absint( $value ) );
- }
- /**
- * Set user id.
- *
- * @param int $value User ID.
- */
- public function set_user_id( $value ) {
- $this->set_prop( 'user_id', absint( $value ) );
- }
- /**
- * Set user_email.
- *
- * @param int $value User email.
- */
- public function set_user_email( $value ) {
- $this->set_prop( 'user_email', sanitize_email( $value ) );
- }
- /**
- * Set order_id.
- *
- * @param int $value Order ID.
- */
- public function set_order_id( $value ) {
- $this->set_prop( 'order_id', absint( $value ) );
- }
- /**
- * Set order_key.
- *
- * @param string $value Order key.
- */
- public function set_order_key( $value ) {
- $this->set_prop( 'order_key', $value );
- }
- /**
- * Set downloads_remaining.
- *
- * @param integer|string $value Amount of downloads remaining.
- */
- public function set_downloads_remaining( $value ) {
- $this->set_prop( 'downloads_remaining', '' === $value ? '' : absint( $value ) );
- }
- /**
- * Set access_granted.
- *
- * @param string|integer|null $date UTC timestamp, or ISO 8601 DateTime. If the DateTime string has no timezone or offset, WordPress site timezone will be assumed. Null if their is no date.
- */
- public function set_access_granted( $date = null ) {
- $this->set_date_prop( 'access_granted', $date );
- }
- /**
- * Set access_expires.
- *
- * @param string|integer|null $date UTC timestamp, or ISO 8601 DateTime. If the DateTime string has no timezone or offset, WordPress site timezone will be assumed. Null if their is no date.
- */
- public function set_access_expires( $date = null ) {
- $this->set_date_prop( 'access_expires', $date );
- }
- /**
- * Set download_count.
- *
- * @param int $value Download count.
- */
- public function set_download_count( $value ) {
- $this->set_prop( 'download_count', absint( $value ) );
- }
- /**
- * Track a download on this permission.
- *
- * @since 3.3.0
- * @throws Exception When permission ID is invalid.
- * @param int $user_id Id of the user performing the download.
- * @param string $user_ip_address IP Address of the user performing the download.
- */
- public function track_download( $user_id = null, $user_ip_address = null ) {
- global $wpdb;
- // Must have a permission_id to track download log.
- if ( ! ( $this->get_id() > 0 ) ) {
- throw new Exception( __( 'Invalid permission ID.', 'woocommerce' ) );
- }
- // Increment download count, and decrement downloads remaining.
- // Use SQL to avoid possible issues with downloads in quick succession.
- // If downloads_remaining is blank, leave it blank (unlimited).
- // Also, ensure downloads_remaining doesn't drop below zero.
- $query = $wpdb->prepare(
- "
- UPDATE {$wpdb->prefix}woocommerce_downloadable_product_permissions
- SET download_count = download_count + 1,
- downloads_remaining = IF( downloads_remaining = '', '', GREATEST( 0, downloads_remaining - 1 ) )
- WHERE permission_id = %d",
- $this->get_id()
- );
- $wpdb->query( $query ); // WPCS: unprepared SQL ok.
- // Re-read this download from the data store to pull updated counts.
- $this->data_store->read( $this );
- // Track download in download log.
- $download_log = new WC_Customer_Download_Log();
- $download_log->set_timestamp( current_time( 'timestamp', true ) );
- $download_log->set_permission_id( $this->get_id() );
- if ( ! is_null( $user_id ) ) {
- $download_log->set_user_id( $user_id );
- }
- if ( ! is_null( $user_ip_address ) ) {
- $download_log->set_user_ip_address( $user_ip_address );
- }
- $download_log->save();
- }
- /*
- |--------------------------------------------------------------------------
- | CRUD methods
- |--------------------------------------------------------------------------
- */
- /**
- * Save data to the database.
- *
- * @since 3.0.0
- * @return int Item ID
- */
- public function save() {
- if ( $this->data_store ) {
- // Trigger action before saving to the DB. Use a pointer to adjust object props before save.
- do_action( 'woocommerce_before_' . $this->object_type . '_object_save', $this, $this->data_store );
- if ( $this->get_id() ) {
- $this->data_store->update( $this );
- } else {
- $this->data_store->create( $this );
- }
- }
- return $this->get_id();
- }
- /*
- |--------------------------------------------------------------------------
- | ArrayAccess/Backwards compatibility.
- |--------------------------------------------------------------------------
- */
- /**
- * OffsetGet.
- *
- * @param string $offset Offset.
- * @return mixed
- */
- public function offsetGet( $offset ) {
- if ( is_callable( array( $this, "get_$offset" ) ) ) {
- return $this->{"get_$offset"}();
- }
- }
- /**
- * OffsetSet.
- *
- * @param string $offset Offset.
- * @param mixed $value Value.
- */
- public function offsetSet( $offset, $value ) {
- if ( is_callable( array( $this, "set_$offset" ) ) ) {
- $this->{"set_$offset"}( $value );
- }
- }
- /**
- * OffsetUnset
- *
- * @param string $offset Offset.
- */
- public function offsetUnset( $offset ) {
- if ( is_callable( array( $this, "set_$offset" ) ) ) {
- $this->{"set_$offset"}( '' );
- }
- }
- /**
- * OffsetExists.
- *
- * @param string $offset Offset.
- * @return bool
- */
- public function offsetExists( $offset ) {
- return in_array( $offset, array_keys( $this->data ), true );
- }
- /**
- * Magic __isset method for backwards compatibility. Legacy properties which could be accessed directly in the past.
- *
- * @param string $key Key name.
- * @return bool
- */
- public function __isset( $key ) {
- return in_array( $key, array_keys( $this->data ), true );
- }
- /**
- * Magic __get method for backwards compatibility. Maps legacy vars to new getters.
- *
- * @param string $key Key name.
- * @return mixed
- */
- public function __get( $key ) {
- if ( is_callable( array( $this, "get_$key" ) ) ) {
- return $this->{"get_$key"}( '' );
- }
- }
- }
|