Issues (4296)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

includes/class-give-cache.php (23 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * Class for managing cache
4
 * Note: only use for internal purpose.
5
 *
6
 * @package     Give
7
 * @subpackage  Classes/Give_Cache
8
 * @copyright   Copyright (c) 2017, WordImpress
9
 * @license     https://opensource.org/licenses/gpl-license GNU Public License
10
 * @since       1.8.7
11
 */
12
13
// Exit if accessed directly.
14
if ( ! defined( 'ABSPATH' ) ) {
15
	exit;
16
}
17
18
class Give_Cache {
0 ignored issues
show
Since you have declared the constructor as private, maybe you should also declare the class as final.
Loading history...
19
	/**
20
	 * Instance.
21
	 *
22
	 * @since  1.8.7
23
	 * @access private
24
	 * @var Give_Cache
25
	 */
26
	static private $instance;
27
28
	/**
29
	 * Flag to check if caching enabled or not.
30
	 *
31
	 * @since  2.0
32
	 * @access private
33
	 * @var
34
	 */
35
	private $is_cache;
36
37
	/**
38
	 * Singleton pattern.
39
	 *
40
	 * @since  1.8.7
41
	 * @access private
42
	 * Give_Cache constructor.
43
	 */
44
	private function __construct() {
45
	}
46
47
48
	/**
49
	 * Get instance.
50
	 *
51
	 * @since  1.8.7
52
	 * @access public
53
	 * @return static
54
	 */
55
	public static function get_instance() {
56
		if ( ! isset( self::$instance ) && ! ( self::$instance instanceof Give_Cache ) ) {
57
			self::$instance = new Give_Cache();
58
		}
59
60
		return self::$instance;
61
	}
62
63
	/**
64
	 * Setup hooks.
65
	 *
66
	 * @since  1.8.7
67
	 * @access public
68
	 */
69
	public function setup() {
70
		// Currently enable cache only for backend.
71
		self::$instance->is_cache = ( defined( 'GIVE_CACHE' ) ? GIVE_CACHE : give_is_setting_enabled( give_get_option( 'cache', 'enabled' ) ) ) && is_admin();
72
73
		// weekly delete all expired cache.
74
		Give_Cron::add_weekly_event( array( $this, 'delete_all_expired' ) );
75
76
		add_action( 'save_post_give_forms', array( $this, 'delete_form_related_cache' ) );
77
		add_action( 'save_post_give_payment', array( $this, 'delete_payment_related_cache' ) );
78
		add_action( 'give_deleted_give-donors_cache', array( $this, 'delete_donor_related_cache' ), 10, 3 );
79
		add_action( 'give_deleted_give-donations_cache', array( $this, 'delete_donations_related_cache' ), 10, 3 );
80
81
		add_action( 'give_save_settings_give_settings', array( __CLASS__, 'flush_cache' ) );
82
83
		add_action( 'wp', array( __CLASS__,  'prevent_caching' ) );
84
		add_action( 'admin_notices', array( $this, '__notices' ) );
85
	}
86
87
	/**
88
	 * Prevent caching on certain pages
89
	 *
90
	 * @since  2.0.5
91
	 * @access public
92
	 * @credit WooCommerce
93
	 */
94
	public static function prevent_caching() {
95
		if ( ! is_blog_installed() ) {
96
			return;
97
		}
98
99
		$page_ids = array_filter( array(
100
			give_get_option( 'success_page' ),
101
			give_get_option( 'failure_page' ),
102
			give_get_option( 'history_page' ),
103
		) );
104
105
		if (
106
			is_page( $page_ids )
107
			|| is_singular( 'give_forms' )
108
		) {
109
			self::set_nocache_constants();
110
			nocache_headers();
111
		}
112
	}
113
114
	/**
115
	 * Set constants to prevent caching by some plugins.
116
	 *
117
	 * @since  2.0.5
118
	 * @access public
119
	 * @credit WooCommerce
120
	 *
121
	 * @param  mixed $return Value to return. Previously hooked into a filter.
122
	 *
123
	 * @return mixed
124
	 */
125
	public static function set_nocache_constants( $return = true ) {
126
		give_maybe_define_constant( 'DONOTCACHEPAGE', true );
0 ignored issues
show
true is of type boolean, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
127
		give_maybe_define_constant( 'DONOTCACHEOBJECT', true );
0 ignored issues
show
true is of type boolean, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
128
		give_maybe_define_constant( 'DONOTCACHEDB', true );
0 ignored issues
show
true is of type boolean, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
129
130
		return $return;
131
	}
132
133
	/**
134
	 * Notices function.
135
	 *
136
	 * @since  2.0.5
137
	 * @access public
138
	 * @credit WooCommerce
139
	 */
140
	public function __notices() {
0 ignored issues
show
Method name "Give_Cache::__notices" is invalid; only PHP magic methods should be prefixed with a double underscore
Loading history...
141
		if ( ! function_exists( 'w3tc_pgcache_flush' ) || ! function_exists( 'w3_instance' ) ) {
142
			return;
143
		}
144
145
		$config   = w3_instance( 'W3_Config' );
146
		$enabled  = $config->get_integer( 'dbcache.enabled' );
147
		$settings = array_map( 'trim', $config->get_array( 'dbcache.reject.sql' ) );
148
149
		if ( $enabled && ! in_array( 'give', $settings, true ) ) {
150
			?>
151
			<div class="error">
152
				<p><?php echo wp_kses_post( sprintf( __( 'In order for <strong>database caching</strong> to work with Give you must add %1$s to the "Ignored query stems" option in <a href="%2$s">W3 Total Cache settings</a>.', 'give' ), '<code>give</code>', esc_url( admin_url( 'admin.php?page=w3tc_dbcache#dbcache_reject_sql' ) ) ) ); ?></p>
153
			</div>
154
			<?php
155
		}
156
	}
157
158
	/**
159
	 * Get cache key.
160
	 *
161
	 * @since  1.8.7
162
	 *
163
	 * @param  string $action     Cache key prefix.
164
	 * @param  array  $query_args (optional) Query array.
165
	 * @param  bool   $is_prefix
166
	 *
167
	 * @return string
168
	 */
169
	public static function get_key( $action, $query_args = null, $is_prefix = true ) {
170
		// Bailout.
171
		if ( empty( $action ) ) {
172
			return new WP_Error( 'give_invalid_cache_key_action', __( 'Do not pass empty action to generate cache key.', 'give' ) );
173
		}
174
175
		// Set cache key.
176
		$cache_key = $is_prefix ? "give_cache_{$action}" : $action;
177
178
		// Bailout.
179
		if ( ! empty( $query_args ) ) {
180
			$cache_key = "{$cache_key}_" . substr( md5( serialize( $query_args ) ), 0, 15 );
181
		}
182
183
		/**
184
		 * Filter the cache key name.
185
		 *
186
		 * @since 2.0
187
		 */
188
		return apply_filters( 'give_get_cache_key', $cache_key, $action, $query_args );
189
	}
190
191
	/**
192
	 * Get cache.
193
	 *
194
	 * @since  1.8.7
195
	 *
196
	 * @param  string $cache_key
197
	 * @param  bool   $custom_key
198
	 * @param  mixed  $query_args
199
	 *
200
	 * @return mixed
201
	 */
202
	public static function get( $cache_key, $custom_key = false, $query_args = array() ) {
203
		if ( ! self::is_valid_cache_key( $cache_key ) ) {
204
			if( empty( $cache_key ) ) {
0 ignored issues
show
Space after opening control structure is required
Loading history...
No space before opening parenthesis is prohibited
Loading history...
205
				return new WP_Error( 'give_empty_cache_key', __( 'Do not pass invalid empty cache key', 'give' ) );
206
			}elseif ( ! $custom_key ) {
207
				return new WP_Error( 'give_invalid_cache_key', __( 'Cache key format should be give_cache_*', 'give' ) );
208
			}
209
210
			$cache_key = self::get_key( $cache_key, $query_args );
211
		}
212
213
		$option = get_option( $cache_key );
214
215
		// Backward compatibility (<1.8.7).
216
		if ( ! is_array( $option ) || empty( $option ) || ! array_key_exists( 'expiration', $option ) ) {
217
			return $option;
218
		}
219
220
		// Get current time.
221
		$current_time = current_time( 'timestamp', 1 );
222
223
		if ( empty( $option['expiration'] ) || ( $current_time < $option['expiration'] ) ) {
224
			$option = $option['data'];
225
		} else {
226
			$option = false;
227
		}
228
229
		return $option;
230
	}
231
232
	/**
233
	 * Set cache.
234
	 *
235
	 * @since  1.8.7
236
	 *
237
	 * @param  string   $cache_key
238
	 * @param  mixed    $data
239
	 * @param  int|null $expiration Timestamp should be in GMT format.
240
	 * @param  bool     $custom_key
241
	 * @param  mixed    $query_args
242
	 *
243
	 * @return mixed
244
	 */
245
	public static function set( $cache_key, $data, $expiration = null, $custom_key = false, $query_args = array() ) {
246
		if ( ! self::is_valid_cache_key( $cache_key ) ) {
247
			if ( ! $custom_key ) {
248
				return new WP_Error( 'give_invalid_cache_key', __( 'Cache key format should be give_cache_*', 'give' ) );
249
			}
250
251
			$cache_key = self::get_key( $cache_key, $query_args );
252
		}
253
254
		$option_value = array(
255
			'data'       => $data,
256
			'expiration' => ! is_null( $expiration )
257
				? ( $expiration + current_time( 'timestamp', 1 ) )
258
				: null,
259
		);
260
261
		$result = update_option( $cache_key, $option_value, false );
262
263
		return $result;
264
	}
265
266
	/**
267
	 * Delete cache.
268
	 *
269
	 * Note: only for internal use
270
	 *
271
	 * @since  1.8.7
272
	 *
273
	 * @param  string|array $cache_keys
274
	 *
275
	 * @return bool|WP_Error
276
	 */
277
	public static function delete( $cache_keys ) {
278
		$result       = true;
279
		$invalid_keys = array();
280
281
		if ( ! empty( $cache_keys ) ) {
282
			$cache_keys = is_array( $cache_keys ) ? $cache_keys : array( $cache_keys );
283
284
			foreach ( $cache_keys as $cache_key ) {
285
				if ( ! self::is_valid_cache_key( $cache_key ) ) {
286
					$invalid_keys[] = $cache_key;
287
					$result         = false;
288
				}
289
290
				delete_option( $cache_key );
291
			}
292
		}
293
294
		if ( ! $result ) {
295
			$result = new WP_Error(
296
				'give_invalid_cache_key',
297
				__( 'Cache key format should be give_cache_*', 'give' ),
298
				$invalid_keys
299
			);
300
		}
301
302
		return $result;
303
	}
304
305
	/**
306
	 * Delete all logging cache.
307
	 *
308
	 * Note: only for internal use
309
	 *
310
	 * @since  1.8.7
311
	 * @access public
312
	 * @global wpdb $wpdb
313
	 *
314
	 * @param bool  $force If set to true then all cached values will be delete instead of only expired
315
	 *
316
	 * @return bool
317
	 */
318
	public static function delete_all_expired( $force = false ) {
319
		global $wpdb;
320
		$options = $wpdb->get_results(
0 ignored issues
show
Usage of a direct database call is discouraged.
Loading history...
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
321
			$wpdb->prepare(
322
				"SELECT option_name, option_value
323
						FROM {$wpdb->options}
324
						Where option_name
325
						LIKE '%%%s%%'",
326
				'give_cache'
327
			),
328
			ARRAY_A
329
		);
330
331
		// Bailout.
332
		if ( empty( $options ) ) {
333
			return false;
334
		}
335
336
		$current_time = current_time( 'timestamp', 1 );
337
338
		// Delete log cache.
339
		foreach ( $options as $option ) {
340
			$option['option_value'] = maybe_unserialize( $option['option_value'] );
341
342
			if (
343
				(
344
					! self::is_valid_cache_key( $option['option_name'] )
345
					|| ! is_array( $option['option_value'] ) // Backward compatibility (<1.8.7).
346
					|| ! array_key_exists( 'expiration', $option['option_value'] ) // Backward compatibility (<1.8.7).
347
					|| empty( $option['option_value']['expiration'] )
348
					|| ( $current_time < $option['option_value']['expiration'] )
349
				)
350
				&& ! $force
351
			) {
352
				continue;
353
			}
354
355
			self::delete( $option['option_name'] );
356
		}
357
	}
358
359
360
	/**
361
	 * Get list of options like.
362
	 *
363
	 * Note: only for internal use
364
	 *
365
	 * @since  1.8.7
366
	 * @access public
367
	 *
368
	 * @param string $option_name
369
	 * @param bool   $fields
370
	 *
371
	 * @return array
372
	 */
373
	public static function get_options_like( $option_name, $fields = false ) {
374
		global $wpdb;
375
376
		$field_names = $fields ? 'option_name, option_value' : 'option_name';
377
378
		if ( $fields ) {
379
			$options = $wpdb->get_results(
0 ignored issues
show
Usage of a direct database call is discouraged.
Loading history...
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
380
				$wpdb->prepare(
381
					"SELECT {$field_names }
382
						FROM {$wpdb->options}
383
						Where option_name
384
						LIKE '%%%s%%'",
385
					"give_cache_{$option_name}"
386
				),
387
				ARRAY_A
388
			);
389
		} else {
390
			$options = $wpdb->get_col(
0 ignored issues
show
Usage of a direct database call is discouraged.
Loading history...
Usage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set.
Loading history...
391
				$wpdb->prepare(
392
					"SELECT *
393
						FROM {$wpdb->options}
394
						Where option_name
395
						LIKE '%%%s%%'",
396
					"give_cache_{$option_name}"
397
				),
398
				1
399
			);
400
		}
401
402
		if ( ! empty( $options ) && $fields ) {
403
			foreach ( $options as $index => $option ) {
404
				$option['option_value'] = maybe_unserialize( $option['option_value'] );
405
				$options[ $index ]      = $option;
406
			}
407
		}
408
409
		return $options;
410
	}
411
412
	/**
413
	 * Check cache key validity.
414
	 *
415
	 * @since  1.8.7
416
	 * @access public
417
	 *
418
	 * @param $cache_key
419
	 *
420
	 * @return bool
421
	 */
422
	public static function is_valid_cache_key( $cache_key ) {
423
		$is_valid = ( false !== strpos( $cache_key, 'give_cache_' ) );
424
0 ignored issues
show
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
425
426
		/**
427
		 * Filter the flag which tell about cache key valid or not
428
		 *
429
		 * @since 2.0
430
		 */
431
		return apply_filters( 'give_is_valid_cache_key', $is_valid, $cache_key );
432
	}
433
434
435
	/**
436
	 * Get cache from group
437
	 *
438
	 * @since  2.0
439
	 * @access public
440
	 *
441
	 * @param int    $id
442
	 * @param string $group
443
	 *
444
	 * @return mixed
445
	 */
446
	public static function get_group( $id, $group = '' ) {
447
		$cached_data = null;
448
449
		// Bailout.
450
		if ( self::$instance->is_cache && ! empty( $id ) ) {
451
			$group = self::$instance->filter_group_name( $group );
452
453
			$cached_data = wp_cache_get( $id, $group );
454
			$cached_data = false !== $cached_data ? $cached_data : null;
455
		}
456
457
		return $cached_data;
458
	}
459
460
	/**
461
	 * Cache small chunks inside group
462
	 *
463
	 * @since  2.0
464
	 * @access public
465
	 *
466
	 * @param int    $id
467
	 * @param mixed  $data
468
	 * @param string $group
469
	 * @param int    $expire
470
	 *
471
	 * @return bool
472
	 */
473
	public static function set_group( $id, $data, $group = '', $expire = 0 ) {
474
		$status = false;
475
476
		// Bailout.
477
		if ( ! self::$instance->is_cache || empty( $id ) ) {
478
			return $status;
479
		}
480
481
		$group = self::$instance->filter_group_name( $group );
482
483
		$status = wp_cache_set( $id, $data, $group, $expire );
484
485
		return $status;
486
	}
487
488
	/**
489
	 * Cache small db query chunks inside group
490
	 *
491
	 * @since  2.0
492
	 * @access public
493
	 *
494
	 * @param int   $id
495
	 * @param mixed $data
496
	 *
497
	 * @return bool
498
	 */
499
	public static function set_db_query( $id, $data ) {
500
		$status = false;
501
502
		// Bailout.
503
		if ( ! self::$instance->is_cache || empty( $id ) ) {
504
			return $status;
505
		}
506
507
		return self::set_group( $id, $data, 'give-db-queries', 0 );
508
	}
509
510
	/**
511
	 * Get cache from group
512
	 *
513
	 * @since  2.0
514
	 * @access public
515
	 *
516
	 * @param string $id
517
	 *
518
	 * @return mixed
519
	 */
520
	public static function get_db_query( $id ) {
521
		return self::get_group( $id, 'give-db-queries' );
522
	}
523
524
	/**
525
	 * Delete group cache
526
	 *
527
	 * @since  2.0
528
	 * @access public
529
	 *
530
	 * @param int|array $ids
531
	 * @param string    $group
532
	 * @param int       $expire
533
	 *
534
	 * @return bool
535
	 */
536
	public static function delete_group( $ids, $group = '', $expire = 0 ) {
537
		$status = false;
538
539
		// Bailout.
540
		if ( ! self::$instance->is_cache || empty( $ids ) ) {
541
			return $status;
542
		}
543
544
		$group_prefix = $group;
545
		$group = self::$instance->filter_group_name( $group );
546
547
		// Delete single or multiple cache items from cache.
548
		if ( ! is_array( $ids ) ) {
549
			$status = wp_cache_delete( $ids, $group );
550
			self::$instance->get_incrementer( true );
551
552
			/**
553
			 * Fire action when cache deleted for specific id.
554
			 *
555
			 * @since 2.0
556
			 *
557
			 * @param string $ids
558
			 * @param string $group
559
			 * @param int    $expire
560
			 */
561
			do_action( "give_deleted_{$group_prefix}_cache", $ids, $group, $expire, $status );
562
563
		} else {
564
			foreach ( $ids as $id ) {
565
				$status = wp_cache_delete( $id, $group );
566
				self::$instance->get_incrementer( true );
567
568
				/**
569
				 * Fire action when cache deleted for specific id .
570
				 *
571
				 * @since 2.0
572
				 *
573
				 * @param string $ids
574
				 * @param string $group
575
				 * @param int    $expire
576
				 */
577
				do_action( "give_deleted_{$group_prefix}_cache", $id, $group, $expire, $status );
578
			}
579
		}
580
581
		return $status;
582
	}
583
584
585
	/**
586
	 * Delete form related cache
587
	 * Note: only use for internal purpose.
588
	 *
589
	 * @since  2.0
590
	 * @access public
591
	 *
592
	 * @param int $form_id
593
	 */
594
	public function delete_form_related_cache( $form_id ) {
595
		// If this is just a revision, don't send the email.
596
		if ( wp_is_post_revision( $form_id ) ) {
597
			return;
598
		}
599
600
		$donation_query = new Give_Payments_Query(
601
			array(
602
				'number'     => - 1,
603
				'give_forms' => $form_id,
604
				'output'     => '',
605
				'fields'     => 'ids',
606
			)
607
		);
608
609
		$donations = $donation_query->get_payments();
610
611
		if ( ! empty( $donations ) ) {
612
			/* @var Give_Payment $donation */
613
			foreach ( $donations as $donation_id ) {
614
				wp_cache_delete( $donation_id, $this->filter_group_name( 'give-donations' ) );
615
				wp_cache_delete( give_get_payment_donor_id( $donation_id ), $this->filter_group_name( 'give-donors' ) );
616
			}
617
		}
618
619
		self::$instance->get_incrementer( true );
620
	}
621
622
	/**
623
	 * Delete payment related cache
624
	 * Note: only use for internal purpose.
625
	 *
626
	 * @since  2.0
627
	 * @access public
628
	 *
629
	 * @param int $donation_id
630
	 */
631
	public function delete_payment_related_cache( $donation_id ) {
632
		// If this is just a revision, don't send the email.
633
		if ( wp_is_post_revision( $donation_id ) ) {
634
			return;
635
		}
636
637
		if ( $donation_id && ( $donor_id = give_get_payment_donor_id( $donation_id ) ) ) {
638
			wp_cache_delete( $donor_id, $this->filter_group_name( 'give-donors' ) );
639
		}
640
641
		wp_cache_delete( $donation_id, $this->filter_group_name( 'give-donations' ) );
642
643
		self::$instance->get_incrementer( true );
644
	}
645
646
	/**
647
	 * Delete donor related cache
648
	 * Note: only use for internal purpose.
649
	 *
650
	 * @since  2.0
651
	 * @access public
652
	 *
653
	 * @param string $id
654
	 * @param string $group
655
	 * @param int    $expire
656
	 */
657
	public function delete_donor_related_cache( $id, $group, $expire ) {
0 ignored issues
show
The parameter $group is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
The parameter $expire is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
658
		$donation_ids = Give()->donors->get_column( 'payment_ids', $id );
659
660
		if ( ! empty( $donation_ids ) ) {
661
			$donation_ids = array_map( 'trim', (array) explode( ',', trim( $donation_ids  ) ) );
0 ignored issues
show
Expected 1 spaces before closing bracket; 2 found
Loading history...
662
663
			foreach ( $donation_ids as $donation ) {
664
				wp_cache_delete( $donation, $this->filter_group_name( 'give-donations' ) );
665
			}
666
		}
667
668
		self::$instance->get_incrementer( true );
669
	}
670
671
	/**
672
	 * Delete donations related cache
673
	 * Note: only use for internal purpose.
674
	 *
675
	 * @since  2.0
676
	 * @access public
677
	 *
678
	 * @param string $id
679
	 * @param string $group
680
	 * @param int    $expire
681
	 */
682
	public function delete_donations_related_cache( $id, $group, $expire ) {
0 ignored issues
show
The parameter $group is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
The parameter $expire is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
683
		if ( $id && ( $donor_id = give_get_payment_donor_id( $id ) ) ) {
684
			wp_cache_delete( $donor_id, $this->filter_group_name( 'give-donors' ) );
685
		}
686
687
		self::$instance->get_incrementer( true );
688
	}
689
690
691
	/**
692
	 * Get unique incrementer.
693
	 *
694
	 * @see    https://core.trac.wordpress.org/ticket/4476
695
	 * @see    https://www.tollmanz.com/invalidation-schemes/
696
	 *
697
	 * @since  2.0
698
	 * @access public
699
	 *
700
	 * @param bool   $refresh
701
	 * @param string $incrementer_key
702
	 *
703
	 * @return string
704
	 */
705
	public function get_incrementer( $refresh = false, $incrementer_key = 'give-cache-incrementer-db-queries' ) {
706
		$incrementer_value = wp_cache_get( $incrementer_key );
707
708
		if ( false === $incrementer_value || true === $refresh ) {
709
			$incrementer_value = microtime( true );
710
			wp_cache_set( $incrementer_key, $incrementer_value );
711
		}
712
713
		return $incrementer_value;
714
	}
715
716
717
	/**
718
	 * Flush cache on cache setting enable/disable
719
	 * Note: only for internal use
720
	 *
721
	 * @since  2.0
722
	 * @access public
723
	 *
724
	 * @param bool $force Delte cache forcefully.
725
	 *
726
	 * @return bool
727
	 */
728
	public static function flush_cache( $force = false ) {
729
		if (
730
			$force
731
			|| ( Give_Admin_Settings::is_saving_settings() && isset( $_POST['cache'] ) && give_is_setting_enabled( give_clean( $_POST['cache'] ) ) )
0 ignored issues
show
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
Detected usage of a non-sanitized input variable: $_POST
Loading history...
732
			|| ( wp_doing_ajax() &&  isset( $_GET['action'] ) && 'give_cache_flush' === give_clean( $_GET['action'] ) )
0 ignored issues
show
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
Detected usage of a non-sanitized input variable: $_GET
Loading history...
733
		) {
734
			self::$instance->get_incrementer( true );
735
			self::$instance->get_incrementer( true, 'give-cache-incrementer' );
736
737
			/**
738
			 * Fire the action when all cache deleted.
739
			 *
740
			 * @since 2.1.0
741
			 */
742
			do_action( 'give_flushed_cache' );
743
744
			return true;
745
		}
746
747
		return false;
748
	}
749
750
751
	/**
752
	 * Filter the group name
753
	 *
754
	 * @since  2.0
755
	 * @access private
756
	 *
757
	 * @param $group
758
	 *
759
	 * @return mixed
760
	 */
761
	private function filter_group_name( $group ) {
762
		/**
763
		 * Filter the group name
764
		 *
765
		 * @since 2.1.0
766
		 */
767
		$filtered_group = apply_filters( 'give_cache_filter_group_name', '', $group );
768
769
		if ( empty( $filtered_group ) ) {
770
771
			switch ( $group ) {
772
				case 'give-db-queries':
773
					$incrementer = self::$instance->get_incrementer();
774
					break;
775
776
				default:
777
					$incrementer = self::$instance->get_incrementer( false, 'give-cache-incrementer' );
778
779
			}
780
781
			$currenct_blog_id = get_current_blog_id();
782
			$filtered_group   = "{$group}_{$currenct_blog_id}_{$incrementer}";
783
		}
784
785
		return $filtered_group;
786
	}
787
788
789
	/**
790
	 * Disable cache.
791
	 *
792
	 * @since  2.0
793
	 * @access public
794
	 */
795
	public static function disable() {
796
		self::get_instance()->is_cache = false;
797
	}
798
799
	/**
800
	 * Enable cache.
801
	 *
802
	 * @since  2.0
803
	 * @access public
804
	 */
805
	public static function enable() {
806
		self::get_instance()->is_cache = true;
807
	}
808
}
809
810
// Initialize
811
Give_Cache::get_instance()->setup();
812