PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.1.2
GiveWP – Donation Plugin and Fundraising Platform v2.1.2
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 / class-give-stats.php
give / includes Last commit date
admin 8 years ago api 8 years ago deprecated 8 years ago donors 8 years ago emails 8 years ago forms 8 years ago gateways 8 years ago libraries 8 years ago payments 8 years ago actions.php 8 years ago ajax-functions.php 8 years ago class-give-async-process.php 8 years ago class-give-background-updater.php 8 years ago class-give-cache.php 8 years ago class-give-cli-commands.php 8 years ago class-give-cron.php 8 years ago class-give-db-donor-meta.php 8 years ago class-give-db-donors.php 8 years ago class-give-db-form-meta.php 8 years ago class-give-db-logs-meta.php 8 years ago class-give-db-logs.php 8 years ago class-give-db-meta.php 8 years ago class-give-db-payment-meta.php 8 years ago class-give-db-sequential-ordering.php 8 years ago class-give-db.php 8 years ago class-give-donate-form.php 8 years ago class-give-donor.php 8 years ago class-give-email-access.php 8 years ago class-give-gravatars.php 8 years ago class-give-html-elements.php 8 years ago class-give-license-handler.php 8 years ago class-give-logging.php 8 years ago class-give-roles.php 8 years ago class-give-scripts.php 8 years ago class-give-session.php 8 years ago class-give-stats.php 8 years ago class-give-template-loader.php 8 years ago class-give-tooltips.php 8 years ago class-give-translation.php 8 years ago class-notices.php 8 years ago country-functions.php 8 years ago currency-functions.php 8 years ago error-tracking.php 8 years ago filters.php 8 years ago formatting.php 8 years ago import-functions.php 8 years ago install.php 8 years ago login-register.php 8 years ago misc-functions.php 8 years ago plugin-compatibility.php 8 years ago post-types.php 8 years ago price-functions.php 8 years ago process-donation.php 8 years ago shortcodes.php 8 years ago template-functions.php 8 years ago user-functions.php 8 years ago
class-give-stats.php
570 lines
1 <?php
2 /**
3 * Stats
4 *
5 * @package Give
6 * @subpackage Classes/Give_Stats
7 * @copyright Copyright (c) 2016, Give
8 * @license https://opensource.org/licenses/gpl-license GNU Public License
9 * @since 1.0
10 */
11
12 // Exit if accessed directly.
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Give_Stats Class
19 *
20 * Base class for other stats classes. Primarily for setting up dates and ranges.
21 *
22 * @since 1.0
23 */
24 class Give_Stats {
25
26 /**
27 * The start date for the period we're getting stats for
28 *
29 * Can be a timestamp, formatted date, date string (such as August 3, 2013),
30 * or a predefined date string, such as last_week or this_month
31 *
32 * Predefined date options are: today, yesterday, this_week, last_week, this_month, last_month
33 * this_quarter, last_quarter, this_year, last_year
34 *
35 * @since 1.0
36 * @access public
37 *
38 * @var string
39 */
40 public $start_date;
41
42 /**
43 * The end date for the period we're getting stats for
44 *
45 * Can be a timestamp, formatted date, date string (such as August 3, 2013),
46 * or a predefined date string, such as last_week or this_month
47 *
48 * Predefined date options are: today, yesterday, this_week, last_week, this_month, last_month
49 * this_quarter, last_quarter, this_year, last_year
50 *
51 * The end date is optional
52 *
53 * @since 1.0
54 * @access public
55 *
56 * @var string
57 */
58 public $end_date;
59
60 /**
61 * Flag to determine if current query is based on timestamps
62 *
63 * @since 1.0
64 * @access public
65 *
66 * @var string
67 */
68 public $timestamp;
69
70 /**
71 * Class Constructor
72 *
73 * Set up the Give Stats Class.
74 *
75 * @since 1.0
76 * @access public
77 *
78 * @return void
79 */
80 public function __construct() {
81 /* nothing here. Call get_sales() and get_earnings() directly */
82 }
83
84 /**
85 * Get Predefined Dates
86 *
87 * Retrieve the predefined date periods permitted.
88 *
89 * @since 1.0
90 * @access public
91 *
92 * @return array Predefined dates.
93 */
94 public function get_predefined_dates() {
95 $predefined = array(
96 'today' => esc_html__( 'Today', 'give' ),
97 'yesterday' => esc_html__( 'Yesterday', 'give' ),
98 'this_week' => esc_html__( 'This Week', 'give' ),
99 'last_week' => esc_html__( 'Last Week', 'give' ),
100 'this_month' => esc_html__( 'This Month', 'give' ),
101 'last_month' => esc_html__( 'Last Month', 'give' ),
102 'this_quarter' => esc_html__( 'This Quarter', 'give' ),
103 'last_quarter' => esc_html__( 'Last Quarter', 'give' ),
104 'this_year' => esc_html__( 'This Year', 'give' ),
105 'last_year' => esc_html__( 'Last Year', 'give' ),
106 );
107
108 return apply_filters( 'give_stats_predefined_dates', $predefined );
109 }
110
111 /**
112 * Setup the dates passed to our constructor.
113 *
114 * This calls the convert_date() member function to ensure the dates are formatted correctly.
115 *
116 * @since 1.0
117 * @access public
118 *
119 * @param string $_start_date Start date. Default is 'this_month'.
120 * @param bool $_end_date End date. Default is false.
121 *
122 * @return void
123 */
124 public function setup_dates( $_start_date = 'this_month', $_end_date = false ) {
125
126 if ( empty( $_start_date ) ) {
127 $_start_date = 'this_month';
128 }
129
130 if ( empty( $_end_date ) ) {
131 $_end_date = $_start_date;
132 }
133
134 $this->start_date = $this->convert_date( $_start_date );
135 $this->end_date = $this->convert_date( $_end_date, true );
136 }
137
138 /**
139 * Convert Date
140 *
141 * Converts a date to a timestamp.
142 *
143 * @since 1.0
144 * @access public
145 *
146 * @param string $date Date.
147 * @param bool $end_date End date. Default is false.
148 *
149 * @return array|WP_Error If the date is invalid, a WP_Error object will be returned.
150 */
151 public function convert_date( $date, $end_date = false ) {
152
153 $this->timestamp = false;
154 $second = $end_date ? 59 : 0;
155 $minute = $end_date ? 59 : 0;
156 $hour = $end_date ? 23 : 0;
157 $day = 1;
158 $month = date( 'n', current_time( 'timestamp' ) );
159 $year = date( 'Y', current_time( 'timestamp' ) );
160
161 if ( array_key_exists( (string) $date, $this->get_predefined_dates() ) ) {
162
163 // This is a predefined date rate, such as last_week
164 switch ( $date ) {
165
166 case 'this_month' :
167
168 if ( $end_date ) {
169
170 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
171 $hour = 23;
172 $minute = 59;
173 $second = 59;
174 }
175
176 break;
177
178 case 'last_month' :
179
180 if ( $month == 1 ) {
181
182 $month = 12;
183 $year --;
184
185 } else {
186
187 $month --;
188
189 }
190
191 if ( $end_date ) {
192 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
193 }
194
195 break;
196
197 case 'today' :
198
199 $day = date( 'd', current_time( 'timestamp' ) );
200
201 if ( $end_date ) {
202 $hour = 23;
203 $minute = 59;
204 $second = 59;
205 }
206
207 break;
208
209 case 'yesterday' :
210
211 $day = date( 'd', current_time( 'timestamp' ) ) - 1;
212
213 // Check if Today is the first day of the month (meaning subtracting one will get us 0)
214 if ( $day < 1 ) {
215
216 // If current month is 1
217 if ( 1 == $month ) {
218
219 $year -= 1; // Today is January 1, so skip back to last day of December
220 $month = 12;
221 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
222
223 } else {
224
225 // Go back one month and get the last day of the month
226 $month -= 1;
227 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
228
229 }
230 }
231
232 break;
233
234 case 'this_week' :
235
236 $days_to_week_start = ( date( 'w', current_time( 'timestamp' ) ) - 1 ) * 60 * 60 * 24;
237 $today = date( 'j', current_time( 'timestamp' ) ) * 60 * 60 * 24;
238
239 if ( $today <= $days_to_week_start ) {
240
241 if ( $month > 1 ) {
242 $month -= 1;
243 } else {
244 $month = 12;
245 }
246
247 }
248
249 if ( ! $end_date ) {
250
251 // Getting the start day
252
253 $day = date( 'd', current_time( 'timestamp' ) - $days_to_week_start ) - 1;
254 $day += get_option( 'start_of_week' );
255
256 } else {
257
258 // Getting the end day
259
260 $day = date( 'd', current_time( 'timestamp' ) - $days_to_week_start ) - 1;
261 $day += get_option( 'start_of_week' ) + 6;
262
263 }
264
265 break;
266
267 case 'last_week' :
268
269 $days_to_week_start = ( date( 'w', current_time( 'timestamp' ) ) - 1 ) * 60 * 60 * 24;
270 $today = date( 'j', current_time( 'timestamp' ) ) * 60 * 60 * 24;
271
272 if ( $today <= $days_to_week_start ) {
273
274 if ( $month > 1 ) {
275 $month -= 1;
276 } else {
277 $month = 12;
278 }
279
280 }
281
282 if ( ! $end_date ) {
283
284 // Getting the start day
285
286 $day = date( 'd', current_time( 'timestamp' ) - $days_to_week_start ) - 8;
287 $day += get_option( 'start_of_week' );
288
289 } else {
290
291 // Getting the end day
292
293 $day = date( 'd', current_time( 'timestamp' ) - $days_to_week_start ) - 8;
294 $day += get_option( 'start_of_week' ) + 6;
295
296 }
297
298 break;
299
300 case 'this_quarter' :
301
302 $month_now = date( 'n', current_time( 'timestamp' ) );
303
304 if ( $month_now <= 3 ) {
305
306 if ( ! $end_date ) {
307 $month = 1;
308 } else {
309 $month = 3;
310 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
311 $hour = 23;
312 $minute = 59;
313 $second = 59;
314 }
315
316 } else if ( $month_now <= 6 ) {
317
318 if ( ! $end_date ) {
319 $month = 4;
320 } else {
321 $month = 6;
322 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
323 $hour = 23;
324 $minute = 59;
325 $second = 59;
326 }
327
328 } else if ( $month_now <= 9 ) {
329
330 if ( ! $end_date ) {
331 $month = 7;
332 } else {
333 $month = 9;
334 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
335 $hour = 23;
336 $minute = 59;
337 $second = 59;
338 }
339
340 } else {
341
342 if ( ! $end_date ) {
343 $month = 10;
344 } else {
345 $month = 12;
346 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
347 $hour = 23;
348 $minute = 59;
349 $second = 59;
350 }
351
352 }
353
354 break;
355
356 case 'last_quarter' :
357
358 $month_now = date( 'n', current_time( 'timestamp' ) );
359
360 if ( $month_now <= 3 ) {
361
362 if ( ! $end_date ) {
363 $month = 10;
364 } else {
365 $year -= 1;
366 $month = 12;
367 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
368 $hour = 23;
369 $minute = 59;
370 $second = 59;
371 }
372
373 } else if ( $month_now <= 6 ) {
374
375 if ( ! $end_date ) {
376 $month = 1;
377 } else {
378 $month = 3;
379 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
380 $hour = 23;
381 $minute = 59;
382 $second = 59;
383 }
384
385 } else if ( $month_now <= 9 ) {
386
387 if ( ! $end_date ) {
388 $month = 4;
389 } else {
390 $month = 6;
391 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
392 $hour = 23;
393 $minute = 59;
394 $second = 59;
395 }
396
397 } else {
398
399 if ( ! $end_date ) {
400 $month = 7;
401 } else {
402 $month = 9;
403 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
404 $hour = 23;
405 $minute = 59;
406 $second = 59;
407 }
408
409 }
410
411 break;
412
413 case 'this_year' :
414
415 if ( ! $end_date ) {
416 $month = 1;
417 } else {
418 $month = 12;
419 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
420 $hour = 23;
421 $minute = 59;
422 $second = 59;
423 }
424
425 break;
426
427 case 'last_year' :
428
429 $year -= 1;
430 if ( ! $end_date ) {
431 $month = 1;
432 } else {
433 $month = 12;
434 $day = cal_days_in_month( CAL_GREGORIAN, $month, $year );
435 $hour = 23;
436 $minute = 59;
437 $second = 59;
438 }
439
440 break;
441
442 }
443
444
445 } else if ( is_numeric( $date ) ) {
446
447 // return $date unchanged since it is a timestamp
448 $this->timestamp = true;
449
450 } else if ( false !== strtotime( $date ) ) {
451
452 $date = strtotime( $date, current_time( 'timestamp' ) );
453 $year = date( 'Y', $date );
454 $month = date( 'm', $date );
455 $day = date( 'd', $date );
456
457 } else {
458
459 return new WP_Error( 'invalid_date', esc_html__( 'Improper date provided.', 'give' ) );
460
461 }
462
463 if ( false === $this->timestamp ) {
464 // Create an exact timestamp
465 $date = mktime( $hour, $minute, $second, $month, $day, $year );
466 }
467
468 return apply_filters( 'give_stats_date', $date, $end_date, $this );
469
470 }
471
472 /**
473 * Count Where
474 *
475 * Modifies the WHERE flag for payment counts.
476 *
477 * @since 1.0
478 * @access public
479 *
480 * @param string $where SQL WHERE statment.
481 *
482 * @return string
483 */
484 public function count_where( $where = '' ) {
485 // Only get payments in our date range
486
487 $start_where = '';
488 $end_where = '';
489
490 if ( $this->start_date ) {
491
492 if ( $this->timestamp ) {
493 $format = 'Y-m-d H:i:s';
494 } else {
495 $format = 'Y-m-d 00:00:00';
496 }
497
498 $start_date = date( $format, $this->start_date );
499 $start_where = " AND p.post_date >= '{$start_date}'";
500 }
501
502 if ( $this->end_date ) {
503
504 if ( $this->timestamp ) {
505 $format = 'Y-m-d H:i:s';
506 } else {
507 $format = 'Y-m-d 23:59:59';
508 }
509
510 $end_date = date( $format, $this->end_date );
511
512 $end_where = " AND p.post_date <= '{$end_date}'";
513 }
514
515 $where .= "{$start_where}{$end_where}";
516
517 return $where;
518 }
519
520 /**
521 * Payment Where
522 *
523 * Modifies the WHERE flag for payment queries.
524 *
525 * @since 1.0
526 * @access public
527 *
528 * @param string $where SQL WHERE statment.
529 *
530 * @return string
531 */
532 public function payments_where( $where = '' ) {
533
534 global $wpdb;
535
536 $start_where = '';
537 $end_where = '';
538
539 if ( ! is_wp_error( $this->start_date ) ) {
540
541 if ( $this->timestamp ) {
542 $format = 'Y-m-d H:i:s';
543 } else {
544 $format = 'Y-m-d 00:00:00';
545 }
546
547 $start_date = date( $format, $this->start_date );
548 $start_where = " AND $wpdb->posts.post_date >= '{$start_date}'";
549 }
550
551 if ( ! is_wp_error( $this->end_date ) ) {
552
553 if ( $this->timestamp ) {
554 $format = 'Y-m-d H:i:s';
555 } else {
556 $format = 'Y-m-d 23:59:59';
557 }
558
559 $end_date = date( $format, $this->end_date );
560
561 $end_where = " AND $wpdb->posts.post_date <= '{$end_date}'";
562 }
563
564 $where .= "{$start_where}{$end_where}";
565
566 return $where;
567 }
568
569 }
570