292 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			292 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Reset store earnings and stats.
 | |
|  *
 | |
|  * This class handles batch processing of resetting store and download sales and earnings stats.
 | |
|  *
 | |
|  * @package     EDD
 | |
|  * @subpackage  Admin\Tools
 | |
|  * @copyright   Copyright (c) 2018, Easy Digital Downloads, LLC
 | |
|  * @license     http://opensource.org/licenses/gpl-2.0.php GNU Public License
 | |
|  * @since       2.5
 | |
|  */
 | |
| 
 | |
| // Exit if accessed directly
 | |
| defined( 'ABSPATH' ) || exit;
 | |
| 
 | |
| /**
 | |
|  * EDD_Tools_Reset_Stats class.
 | |
|  *
 | |
|  * @since 2.5
 | |
|  * @since 3.0 Updated to work with new query methods.
 | |
|  */
 | |
| class EDD_Tools_Reset_Stats extends EDD_Batch_Export {
 | |
| 
 | |
| 	/**
 | |
| 	 * Our export type. Used for export-type specific filters/actions.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	public $export_type = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * Allows for a non-download batch processing to be run.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 * @var bool
 | |
| 	 */
 | |
| 	public $is_void = true;
 | |
| 
 | |
| 	/**
 | |
| 	 * Sets the number of items to pull on each step.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 * @var int
 | |
| 	 */
 | |
| 	public $per_step = 1;
 | |
| 
 | |
| 	/**
 | |
| 	 * Retrieve the export data.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 *
 | |
| 	 * @return array|false $data The data for the CSV file, false otherwise.
 | |
| 	 */
 | |
| 	public function get_data() {
 | |
| 		global $wpdb;
 | |
| 
 | |
| 		$tables = $this->get_stored_data( 'edd_reset_tables_to_truncate' );
 | |
| 
 | |
| 		if ( ! is_array( $tables ) ) {
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		$offset     = ( $this->step - 1 ) * $this->per_step;
 | |
| 		$step_items = array_slice( $tables, $offset, $this->per_step );
 | |
| 
 | |
| 		if ( $step_items ) {
 | |
| 			$query = "TRUNCATE TABLE {$step_items[0]}";
 | |
| 			edd_debug_log( var_export($query, true), true );
 | |
| 			$wpdb->query( $query );
 | |
| 
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Return the percentage completed.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 *
 | |
| 	 * @return float Percentage complete.
 | |
| 	 */
 | |
| 	public function get_percentage_complete() {
 | |
| 		$items = $this->get_stored_data( 'edd_reset_tables_to_truncate' );
 | |
| 		$total = count( $items );
 | |
| 
 | |
| 		$percentage = 100;
 | |
| 
 | |
| 		if ( $total > 0 ) {
 | |
| 			$percentage = ( ( $this->per_step * $this->step ) / $total ) * 100;
 | |
| 		}
 | |
| 
 | |
| 		if ( $percentage > 100 ) {
 | |
| 			$percentage = 100;
 | |
| 		}
 | |
| 
 | |
| 		return $percentage;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Set the properties specific to the export.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 *
 | |
| 	 * @param array $request Form data passed into the batch processor.
 | |
| 	 */
 | |
| 	public function set_properties( $request ) {}
 | |
| 
 | |
| 	/**
 | |
| 	 * Process a step.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 *
 | |
| 	 * @return bool True if more data exists, false otherwise.
 | |
| 	 */
 | |
| 	public function process_step() {
 | |
| 		if ( ! $this->can_export() ) {
 | |
| 			wp_die( esc_html__( 'You do not have permission to export data.', 'easy-digital-downloads' ), esc_html__( 'Error', 'easy-digital-downloads' ), array( 'response' => 403 ) );
 | |
| 		}
 | |
| 
 | |
| 		$had_data = $this->get_data();
 | |
| 
 | |
| 		if ( $had_data ) {
 | |
| 			$this->done = false;
 | |
| 			return true;
 | |
| 		} else {
 | |
| 			update_option( 'edd_earnings_total', 0, false );
 | |
| 			update_option( 'edd_earnings_total_without_tax', 0, false );
 | |
| 			delete_transient( 'edd_earnings_total' );
 | |
| 			delete_transient( 'edd_earnings_total_without_tax' );
 | |
| 			delete_transient( 'edd_estimated_monthly_stats' . true );
 | |
| 			delete_transient( 'edd_estimated_monthly_stats' . false );
 | |
| 			$this->delete_data( 'edd_reset_tables_to_truncate' );
 | |
| 
 | |
| 			// Reset the sequential order numbers
 | |
| 			if ( edd_get_option( 'enable_sequential' ) ) {
 | |
| 				delete_option( 'edd_last_payment_number' );
 | |
| 			}
 | |
| 
 | |
| 			$this->done    = true;
 | |
| 			$this->message = __( 'Your store has been successfully reset.', 'easy-digital-downloads' );
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Export headers.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 */
 | |
| 	public function headers() {
 | |
| 		edd_set_time_limit();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Perform the export.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 */
 | |
| 	public function export() {
 | |
| 
 | |
| 		// Set headers.
 | |
| 		$this->headers();
 | |
| 
 | |
| 		edd_die();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Fetch data prior to batch processing starting.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 */
 | |
| 	public function pre_fetch() {
 | |
| 		if ( 1 === $this->step ) {
 | |
| 			$this->delete_data( 'edd_reset_tables_to_truncate' );
 | |
| 		}
 | |
| 
 | |
| 		$tables = get_option( 'edd_reset_tables_to_truncate', false );
 | |
| 
 | |
| 		if ( false === $tables ) {
 | |
| 			$tables = array();
 | |
| 
 | |
| 			foreach ( EDD()->components as $component ) {
 | |
| 				/** @var $component EDD\Component */
 | |
| 
 | |
| 				// Objects
 | |
| 				$object = $component->get_interface( 'table' );
 | |
| 				if ( $object instanceof \EDD\Database\Table && $object->exists() ) {
 | |
| 					if ( 'adjustments' === $object->name ) {
 | |
| 						continue;
 | |
| 					}
 | |
| 					$tables[] = $object->table_name;
 | |
| 				}
 | |
| 
 | |
| 				// Meta
 | |
| 				$meta = $component->get_interface( 'meta' );
 | |
| 				if ( $meta instanceof \EDD\Database\Table && $meta->exists() ) {
 | |
| 					if ( 'adjustmentmeta' === $meta->name ) {
 | |
| 						continue;
 | |
| 					}
 | |
| 					$tables[] = $meta->table_name;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			$tables = apply_filters( 'edd_reset_tables_to_truncate', $tables );
 | |
| 
 | |
| 			$this->store_data( 'edd_reset_tables_to_truncate', $tables );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Given a key, get the information from the database directly.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 *
 | |
| 	 * @param string $key Option name.
 | |
| 	 * @return mixed Returns the data from the database.
 | |
| 	 */
 | |
| 	private function get_stored_data( $key ) {
 | |
| 		global $wpdb;
 | |
| 
 | |
| 		$value = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM {$wpdb->options} WHERE option_name = %s", $key ) );
 | |
| 
 | |
| 		if ( empty( $value ) ) {
 | |
| 			return array();
 | |
| 		}
 | |
| 
 | |
| 		$maybe_json = json_decode( $value );
 | |
| 		if ( ! is_null( $maybe_json ) ) {
 | |
| 			$value = json_decode( $value, true );
 | |
| 		}
 | |
| 
 | |
| 		return (array) $value;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Store a value in the wp_options table.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 *
 | |
| 	 * @param string $key   Option name.
 | |
| 	 * @param mixed  $value Option value.
 | |
| 	 */
 | |
| 	private function store_data( $key = '', $value = '' ) {
 | |
| 		global $wpdb;
 | |
| 
 | |
| 		// Bail if no key was passed.
 | |
| 		if ( empty( $key ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Parse value.
 | |
| 		$value = is_array( $value )
 | |
| 			? wp_json_encode( $value )
 | |
| 			: esc_attr( $value );
 | |
| 
 | |
| 		// Prepare data.
 | |
| 		$data = array(
 | |
| 			'option_name'  => $key,
 | |
| 			'option_value' => $value,
 | |
| 			'autoload'     => 'no',
 | |
| 		);
 | |
| 
 | |
| 		$formats = array( '%s', '%s', '%s' );
 | |
| 
 | |
| 		// Update database.
 | |
| 		$wpdb->replace( $wpdb->options, $data, $formats );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Delete an option.
 | |
| 	 *
 | |
| 	 * @since 2.5
 | |
| 	 *
 | |
| 	 * @param string $key Option name.
 | |
| 	 */
 | |
| 	private function delete_data( $key = '' ) {
 | |
| 		global $wpdb;
 | |
| 
 | |
| 		// Bail if no key was passed.
 | |
| 		if ( empty( $key ) ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Delete from the database.
 | |
| 		$wpdb->delete( $wpdb->options, array( 'option_name' => $key ) );
 | |
| 	}
 | |
| }
 |