PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.13.3
GiveWP – Donation Plugin and Fundraising Platform v2.13.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-donations.php 6 years ago class-give-tools-delete-import-donors.php 6 years ago class-give-tools-delete-test-donors.php 6 years ago class-give-tools-delete-test-transactions.php 6 years ago class-give-tools-recount-all-stats.php 6 years ago class-give-tools-recount-donor-stats.php 6 years ago class-give-tools-recount-form-stats.php 5 years ago class-give-tools-recount-income.php 5 years ago class-give-tools-recount-single-donor-stats.php 6 years ago class-give-tools-reset-stats.php 5 years ago tools-actions.php 7 years ago
class-give-tools-reset-stats.php
429 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, GiveWP
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 = [
82 'customers' => [],
83 'forms' => [],
84 'other' => [],
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 = [];
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 // Delete all the Give related donor and its meta.
117 $sql[] = "DELETE FROM {$wpdb->donors}";
118 $sql[] = "DELETE FROM {$wpdb->donormeta}";
119 break;
120 case 'forms':
121 $sql[] = "UPDATE {$meta_table['name']} SET meta_value = 0 WHERE meta_key = '_give_form_sales' AND {$meta_table['column']['id']} IN ($ids)";
122 $sql[] = "UPDATE {$meta_table['name']} SET meta_value = 0.00 WHERE meta_key = '_give_form_earnings' AND {$meta_table['column']['id']} IN ($ids)";
123 break;
124 case 'other':
125 // Delete main entries of forms and donations exists in posts table.
126 $sql[] = "DELETE FROM {$wpdb->posts} WHERE id IN ($ids)";
127
128 // Delete all the meta rows of form exists in form meta table.
129 $sql[] = "DELETE FROM {$wpdb->formmeta}";
130
131 // Delete all the meta rows of donation exists in donation meta table.
132 $sql[] = "DELETE FROM {$wpdb->prefix}give_donationmeta";
133
134 // Delete all the Give related sequential ordering entries for donations.
135 $sql[] = "DELETE FROM {$wpdb->prefix}give_sequential_ordering WHERE payment_id IN ($ids)";
136
137 // Delete all the Give related comments and its meta.
138 $sql[] = "DELETE FROM {$wpdb->give_comments}";
139 $sql[] = "DELETE FROM {$wpdb->give_commentmeta}";
140
141 // Delete all the Give sessions data.
142 $sql[] = "DELETE FROM {$wpdb->prefix}give_sessions";
143
144 // Delete Give related categories and tags data from taxonomy tables.
145 $sql[] = $wpdb->prepare(
146 "
147 DELETE FROM $wpdb->terms
148 WHERE $wpdb->terms.term_id IN
149 (
150 SELECT $wpdb->term_taxonomy.term_id
151 FROM $wpdb->term_taxonomy
152 WHERE $wpdb->term_taxonomy.taxonomy = %s
153 OR $wpdb->term_taxonomy.taxonomy = %s
154 )
155 ",
156 [ 'give_forms_category', 'give_forms_tag' ]
157 );
158
159 $sql[] = $wpdb->prepare(
160 "
161 DELETE FROM $wpdb->term_taxonomy
162 WHERE $wpdb->term_taxonomy.taxonomy = %s
163 OR $wpdb->term_taxonomy.taxonomy = %s
164 ",
165 [ 'give_forms_category', 'give_forms_tag' ]
166 );
167
168 break;
169 }
170
171 if ( ! in_array( $type, [ 'customers', 'forms', 'other' ] ) ) {
172 // Allows other types of custom post types to filter on their own post_type
173 // and add items to the query list, for the IDs found in their post type.
174 $sql = apply_filters( "give_reset_add_queries_{$type}", $sql, $ids );
175 }
176 }
177
178 if ( is_array( $sql ) && count( $sql ) > 0 ) {
179 foreach ( $sql as $query ) {
180 $wpdb->query( $query );
181 }
182 }
183
184 return true;
185
186 }// End if().
187
188 return false;
189
190 }
191
192 /**
193 * Return the calculated completion percentage.
194 *
195 * @since 1.5
196 * @return int
197 */
198 public function get_percentage_complete() {
199
200 $items = $this->get_stored_data( 'give_temp_reset_ids' );
201 $total = count( $items );
202
203 $percentage = 100;
204
205 if ( $total > 0 ) {
206 $percentage = ( ( $this->per_step * $this->step ) / $total ) * 100;
207 }
208
209 if ( $percentage > 100 ) {
210 $percentage = 100;
211 }
212
213 return $percentage;
214 }
215
216 /**
217 * Set the properties specific to the payments export.
218 *
219 * @since 1.5
220 *
221 * @param array $request The Form Data passed into the batch processing.
222 */
223 public function set_properties( $request ) {
224 }
225
226 /**
227 * Process a step
228 *
229 * @since 1.5
230 * @return bool
231 */
232 public function process_step() {
233
234 if ( ! $this->can_export() ) {
235 wp_die(
236 esc_html__( 'You do not have permission to reset data.', 'give' ),
237 esc_html__( 'Error', 'give' ),
238 [
239 'response' => 403,
240 ]
241 );
242 }
243
244 $had_data = $this->get_data();
245
246 if ( $had_data ) {
247 $this->done = false;
248
249 return true;
250 } else {
251 update_option( 'give_earnings_total', 0, false );
252 Give_Cache::delete( Give_Cache::get_key( 'give_estimated_monthly_stats' ) );
253
254 $this->delete_data( 'give_temp_reset_ids' );
255
256 $this->done = true;
257 $this->message = esc_html__( 'Donation forms, revenue, donations counts, and logs successfully reset.', 'give' );
258
259 return false;
260 }
261 }
262
263 /**
264 * Headers
265 */
266 public function headers() {
267 give_ignore_user_abort();
268 }
269
270 /**
271 * Perform the export
272 *
273 * @access public
274 * @since 1.5
275 * @return void
276 */
277 public function export() {
278
279 // Set headers
280 $this->headers();
281
282 give_die();
283 }
284
285 /**
286 * Pre Fetch
287 */
288 public function pre_fetch() {
289
290 if ( $this->step == 1 ) {
291 $this->delete_data( 'give_temp_reset_ids' );
292 }
293
294 $items = get_option( 'give_temp_reset_ids', false );
295
296 if ( false === $items ) {
297 $items = [];
298
299 $give_types_for_reset = [ 'give_forms', 'give_payment' ];
300 $give_types_for_reset = apply_filters( 'give_reset_store_post_types', $give_types_for_reset );
301
302 $args = apply_filters(
303 'give_tools_reset_stats_total_args',
304 [
305 'post_type' => $give_types_for_reset,
306 'post_status' => 'any',
307 'posts_per_page' => - 1,
308 ]
309 );
310
311 $posts = get_posts( $args );
312 foreach ( $posts as $post ) {
313 $items[] = [
314 'id' => (int) $post->ID,
315 'type' => $post->post_type,
316 ];
317 }
318
319 $donor_args = [
320 'number' => - 1,
321 ];
322 $donors = Give()->donors->get_donors( $donor_args );
323 foreach ( $donors as $donor ) {
324 $items[] = [
325 'id' => (int) $donor->id,
326 'type' => 'customer',
327 ];
328 }
329
330 // Allow filtering of items to remove with an unassociative array for each item
331 // The array contains the unique ID of the item, and a 'type' for you to use in the execution of the get_data method
332 $items = apply_filters( 'give_reset_items', $items );
333
334 $this->store_data( 'give_temp_reset_ids', $items );
335 }// End if().
336
337 }
338
339 /**
340 * Given a key, get the information from the Database Directly.
341 *
342 * @since 1.5
343 *
344 * @param string $key The option_name
345 *
346 * @return mixed Returns the data from the database.
347 */
348 private function get_stored_data( $key ) {
349 global $wpdb;
350 $value = $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s", $key ) );
351
352 if ( empty( $value ) ) {
353 return false;
354 }
355
356 $maybe_json = json_decode( $value );
357 if ( ! is_null( $maybe_json ) ) {
358 $value = json_decode( $value, true );
359 }
360
361 return (array) $value;
362 }
363
364 /**
365 * Give a key, store the value.
366 *
367 * @since 1.5
368 *
369 * @param string $key The option_name.
370 * @param mixed $value The value to store.
371 *
372 * @return void
373 */
374 private function store_data( $key, $value ) {
375 global $wpdb;
376
377 $value = is_array( $value ) ? wp_json_encode( $value ) : esc_attr( $value );
378
379 $data = [
380 'option_name' => $key,
381 'option_value' => $value,
382 'autoload' => 'no',
383 ];
384
385 $formats = [
386 '%s',
387 '%s',
388 '%s',
389 ];
390
391 $wpdb->replace( $wpdb->options, $data, $formats );
392 }
393
394 /**
395 * Delete an option
396 *
397 * @since 1.5
398 *
399 * @param string $key The option_name to delete
400 *
401 * @return void
402 */
403 private function delete_data( $key ) {
404 global $wpdb;
405 $wpdb->delete(
406 $wpdb->options,
407 [
408 'option_name' => $key,
409 ]
410 );
411 }
412
413 /**
414 * Unset the properties specific to the donors export.
415 *
416 * @since 2.3.0
417 *
418 * @param array $request
419 * @param Give_Batch_Export $export
420 */
421 public function unset_properties( $request, $export ) {
422 if ( $export->done ) {
423 // Delete all the donation ids.
424 $this->delete_data( 'give_temp_reset_ids' );
425 }
426 }
427
428 }
429