293 lines
6.2 KiB
PHP
293 lines
6.2 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' );
|
|
delete_option( 'edd_next_order_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 ) );
|
|
}
|
|
}
|