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