PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.0.5
GiveWP – Donation Plugin and Fundraising Platform v2.0.5
4.16.3 4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / includes / admin / tools / data / class-give-tools-reset-stats.php
give / includes / admin / tools / data Last commit date
class-give-tools-delete-import-donors.php 8 years ago class-give-tools-delete-test-donors.php 8 years ago class-give-tools-delete-test-transactions.php 8 years ago class-give-tools-recount-all-stats.php 8 years ago class-give-tools-recount-donor-stats.php 8 years ago class-give-tools-recount-form-stats.php 8 years ago class-give-tools-recount-income.php 8 years ago class-give-tools-recount-single-donor-stats.php 8 years ago class-give-tools-reset-stats.php 8 years ago tools-actions.php 8 years ago
class-give-tools-reset-stats.php
371 lines
1 <?php
2 /**
3 * Recount income and stats
4 *
5 * This class handles batch processing of resetting donations and income stats.
6 *
7 * @subpackage Admin/Tools/Give_Tools_Reset_Stats
8 * @copyright Copyright (c) 2016, WordImpress
9 * @license https://opensource.org/licenses/gpl-license GNU Public License
10 * @since 1.5
11 */
12
13 // Exit if accessed directly.
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit;
16 }
17
18 /**
19 * Give_Tools_Reset_Stats Class
20 *
21 * @since 1.5
22 */
23 class Give_Tools_Reset_Stats extends Give_Batch_Export {
24
25 /**
26 * Our export type. Used for export-type specific filters/actions
27 *
28 * @var string
29 * @since 1.5
30 */
31 public $export_type = '';
32
33 /**
34 * Allows for a non-form batch processing to be run.
35 *
36 * @since 1.5
37 * @var boolean
38 */
39 public $is_void = true;
40
41 /**
42 * Sets the number of items to pull on each step
43 *
44 * @since 1.5
45 * @var integer
46 */
47 public $per_step = 30;
48
49 /**
50 * Constructor.
51 */
52 public function __construct( $_step = 1 ) {
53 parent::__construct( $_step );
54
55 $this->is_writable = true;
56 }
57
58 /**
59 * Get the Export Data
60 *
61 * @access public
62 * @since 1.5
63 * @global object $wpdb Used to query the database using the WordPress
64 * Database API
65 * @return bool $data The data for the CSV file
66 */
67 public function get_data() {
68 global $wpdb;
69
70 $items = $this->get_stored_data( 'give_temp_reset_ids' );
71
72 if ( ! is_array( $items ) ) {
73 return false;
74 }
75
76 $offset = ( $this->step - 1 ) * $this->per_step;
77 $step_items = array_slice( $items, $offset, $this->per_step );
78
79 if ( $step_items ) {
80
81 $step_ids = array(
82 'customers' => array(),
83 'forms' => array(),
84 'other' => array(),
85 );
86
87 foreach ( $step_items as $item ) {
88
89 switch ( $item['type'] ) {
90 case 'customer':
91 $step_ids['customers'][] = $item['id'];
92 break;
93 case 'forms':
94 $step_ids['give_forms'][] = $item['id'];
95 break;
96 default:
97 $item_type = apply_filters( 'give_reset_item_type', 'other', $item );
98 $step_ids[ $item_type ][] = $item['id'];
99 break;
100 }
101 }
102
103 $sql = array();
104 $meta_table = __give_v20_bc_table_details('form' );
105
106 foreach ( $step_ids as $type => $ids ) {
107
108 if ( empty( $ids ) ) {
109 continue;
110 }
111
112 $ids = implode( ',', $ids );
113
114 switch ( $type ) {
115 case 'customers':
116 $sql[] = "DELETE FROM $wpdb->donors WHERE id IN ($ids)";
117 $table_name = $wpdb->donors;
118 $meta_table_name = $wpdb->donormeta;
119 $sql[] = "DELETE FROM $table_name WHERE id IN ($ids)";
120 $sql[] = "DELETE FROM $meta_table_name WHERE donor_id IN ($ids)";
121 break;
122 case 'forms':
123 $sql[] = "UPDATE {$meta_table['name']} SET meta_value = 0 WHERE meta_key = '_give_form_sales' AND {$meta_table['column']['id']} IN ($ids)";
124 $sql[] = "UPDATE {$meta_table['name']} SET meta_value = 0.00 WHERE meta_key = '_give_form_earnings' AND {$meta_table['column']['id']} IN ($ids)";
125 break;
126 case 'other':
127 $sql[] = "DELETE FROM $wpdb->posts WHERE id IN ($ids)";
128 $sql[] = "DELETE FROM $wpdb->postmeta WHERE post_id IN ($ids)";
129 $sql[] = "DELETE FROM $wpdb->comments WHERE comment_post_ID IN ($ids)";
130 $sql[] = "DELETE FROM $wpdb->commentmeta WHERE comment_id NOT IN (SELECT comment_ID FROM $wpdb->comments)";
131 break;
132 }
133
134 if ( ! in_array( $type, array( 'customers', 'forms', 'other' ) ) ) {
135 // Allows other types of custom post types to filter on their own post_type
136 // and add items to the query list, for the IDs found in their post type.
137 $sql = apply_filters( "give_reset_add_queries_{$type}", $sql, $ids );
138 }
139 }
140
141 if ( ! empty( $sql ) ) {
142 foreach ( $sql as $query ) {
143 $wpdb->query( $query );
144 }
145 }
146
147 return true;
148
149 }// End if().
150
151 return false;
152
153 }
154
155 /**
156 * Return the calculated completion percentage.
157 *
158 * @since 1.5
159 * @return int
160 */
161 public function get_percentage_complete() {
162
163 $items = $this->get_stored_data( 'give_temp_reset_ids' );
164 $total = count( $items );
165
166 $percentage = 100;
167
168 if ( $total > 0 ) {
169 $percentage = ( ( $this->per_step * $this->step ) / $total ) * 100;
170 }
171
172 if ( $percentage > 100 ) {
173 $percentage = 100;
174 }
175
176 return $percentage;
177 }
178
179 /**
180 * Set the properties specific to the payments export.
181 *
182 * @since 1.5
183 *
184 * @param array $request The Form Data passed into the batch processing.
185 */
186 public function set_properties( $request ) {
187 }
188
189 /**
190 * Process a step
191 *
192 * @since 1.5
193 * @return bool
194 */
195 public function process_step() {
196
197 if ( ! $this->can_export() ) {
198 wp_die( esc_html__( 'You do not have permission to reset data.', 'give' ), esc_html__( 'Error', 'give' ), array(
199 'response' => 403,
200 ) );
201 }
202
203 $had_data = $this->get_data();
204
205 if ( $had_data ) {
206 $this->done = false;
207
208 return true;
209 } else {
210 update_option( 'give_earnings_total', 0 );
211 Give_Cache::delete( Give_Cache::get_key( 'give_estimated_monthly_stats' ) );
212
213 $this->delete_data( 'give_temp_reset_ids' );
214
215 // Reset the sequential order numbers
216 if ( give_get_option( 'enable_sequential' ) ) {
217 delete_option( 'give_last_payment_number' );
218 }
219
220 $this->done = true;
221 $this->message = esc_html__( 'Donation forms, income, donations counts, and logs successfully reset.', 'give' );
222
223 return false;
224 }
225 }
226
227 /**
228 * Headers
229 */
230 public function headers() {
231 give_ignore_user_abort();
232 }
233
234 /**
235 * Perform the export
236 *
237 * @access public
238 * @since 1.5
239 * @return void
240 */
241 public function export() {
242
243 // Set headers
244 $this->headers();
245
246 give_die();
247 }
248
249 /**
250 * Pre Fetch
251 */
252 public function pre_fetch() {
253
254 if ( $this->step == 1 ) {
255 $this->delete_data( 'give_temp_reset_ids' );
256 }
257
258 $items = get_option( 'give_temp_reset_ids', false );
259
260 if ( false === $items ) {
261 $items = array();
262
263 $give_types_for_reset = array( 'give_forms', 'give_payment' );
264 $give_types_for_reset = apply_filters( 'give_reset_store_post_types', $give_types_for_reset );
265
266 $args = apply_filters( 'give_tools_reset_stats_total_args', array(
267 'post_type' => $give_types_for_reset,
268 'post_status' => 'any',
269 'posts_per_page' => - 1,
270 ) );
271
272 $posts = get_posts( $args );
273 foreach ( $posts as $post ) {
274 $items[] = array(
275 'id' => (int) $post->ID,
276 'type' => $post->post_type,
277 );
278 }
279
280 $donor_args = array(
281 'number' => - 1,
282 );
283 $donors = Give()->donors->get_donors( $donor_args );
284 foreach ( $donors as $donor ) {
285 $items[] = array(
286 'id' => (int) $donor->id,
287 'type' => 'customer',
288 );
289 }
290
291 // Allow filtering of items to remove with an unassociative array for each item
292 // The array contains the unique ID of the item, and a 'type' for you to use in the execution of the get_data method
293 $items = apply_filters( 'give_reset_items', $items );
294
295 $this->store_data( 'give_temp_reset_ids', $items );
296 }// End if().
297
298 }
299
300 /**
301 * Given a key, get the information from the Database Directly.
302 *
303 * @since 1.5
304 *
305 * @param string $key The option_name
306 *
307 * @return mixed Returns the data from the database.
308 */
309 private function get_stored_data( $key ) {
310 global $wpdb;
311 $value = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = '%s'", $key ) );
312
313 if ( empty( $value ) ) {
314 return false;
315 }
316
317 $maybe_json = json_decode( $value );
318 if ( ! is_null( $maybe_json ) ) {
319 $value = json_decode( $value, true );
320 }
321
322 return $value;
323 }
324
325 /**
326 * Give a key, store the value.
327 *
328 * @since 1.5
329 *
330 * @param string $key The option_name.
331 * @param mixed $value The value to store.
332 *
333 * @return void
334 */
335 private function store_data( $key, $value ) {
336 global $wpdb;
337
338 $value = is_array( $value ) ? wp_json_encode( $value ) : esc_attr( $value );
339
340 $data = array(
341 'option_name' => $key,
342 'option_value' => $value,
343 'autoload' => 'no',
344 );
345
346 $formats = array(
347 '%s',
348 '%s',
349 '%s',
350 );
351
352 $wpdb->replace( $wpdb->options, $data, $formats );
353 }
354
355 /**
356 * Delete an option
357 *
358 * @since 1.5
359 *
360 * @param string $key The option_name to delete
361 *
362 * @return void
363 */
364 private function delete_data( $key ) {
365 global $wpdb;
366 $wpdb->delete( $wpdb->options, array(
367 'option_name' => $key,
368 ) );
369 }
370
371 }