Test Failed
Push — master ( 315839...9b266f )
by Devin
05:39
created

actions.php ➔ give_show_update_notification_on_multisite()   C

Complexity

Conditions 13
Paths 9

Size

Total Lines 74

Duplication

Lines 7
Ratio 9.46 %

Importance

Changes 0
Metric Value
cc 13
nc 9
nop 2
dl 7
loc 74
rs 5.8606
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * Admin Add-ons Actions
4
 *
5
 * @package     Give
6
 * @subpackage  Admin/Add-ons/Actions
7
 * @copyright   Copyright (c) 2019, GiveWP
8
 * @license     https://opensource.org/licenses/gpl-license GNU Public License
9
 * @since       2.5.0
10
 */
11
12
// Exit if accessed directly.
13
if ( ! defined( 'ABSPATH' ) ) {
14
	exit;
15
}
16
17
/**
18
 * Ajax addon upload handler
19
 *
20
 * Note: only for internal use
21
 *
22
 * @since 2.5.0
23
 */
24
function give_upload_addon_handler() {
25
	/* @var WP_Filesystem_Direct $wp_filesystem */
26
	global $wp_filesystem;
27
28
	$addon_authors = array( 'WordImpress', 'GiveWP' );
29
	$filename      = basename( $_FILES['file']['name'], '.zip' );
30
31
	check_admin_referer( 'give-upload-addon' );
32
33
	// Bailout if user does not has permission.
34
	if ( ! current_user_can( 'upload_plugins' ) ) {
35
		wp_send_json_error( array( 'errorMsg' => __( 'Sorry, you are not allowed to upload add-ons on this site.', 'give' ) ) );
36
	}
37
38
	// Bailout if not upload file or not uploading Give addon
39
	if ( empty( $_FILES ) || false === stripos( $filename, 'Give' ) ) {
40
		wp_send_json_error( array( 'errorMsg' => __( 'Please upload a valid add-on file.', 'give' ) ) );
41
	}
42
43
	$access_type = get_filesystem_method();
44
45
	if ( 'direct' !== $access_type ) {
46
		wp_send_json_error(
47
			array(
48
				'errorMsg' => sprintf(
49
					__( 'Sorry, you can not upload plugins because Give does not have direct access to the file system. Please <a href="%1$s" target="_blank">click here</a> to upload the add-on.', 'give' ),
50
					admin_url( 'plugin-install.php?tab=upload' )
51
				),
52
			)
53
		);
54
	}
55
56
	$file_type = wp_check_filetype( $_FILES['file']['name'], array( 'zip' => 'application/zip' ) );
57
58
	if ( empty( $file_type['ext'] ) ) {
59
		wp_send_json_error( array( 'errorMsg' =>  __( 'Only zip file type allowed to upload. Please upload a valid add-on file.', 'give' ) ) );
60
	}
61
62
	$give_addons_list   = give_get_plugins();
63
	$is_addon_installed = array();
64
65 View Code Duplication
	if ( ! empty( $give_addons_list ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
66
		foreach ( $give_addons_list as $addon => $give_addon ) {
67
			// Only show Give Core Activated Add-Ons.
68
			if ( ! in_array( $give_addon['AuthorName'], $addon_authors ) ) {
69
				continue;
70
			}
71
72
			if ( false !== stripos( $addon, $filename ) ) {
73
				$is_addon_installed = $give_addon;
74
			}
75
		}
76
	}
77
78
	// Bailout  if addon already installed
79
	if ( ! empty( $is_addon_installed ) ) {
80
		wp_send_json_error( array(
81
			'errorMsg'   => __( 'This add-on is already installed.', 'give' ),
82
			'pluginInfo' => $is_addon_installed,
83
		) );
84
	}
85
86
	$upload_status = wp_handle_upload( $_FILES['file'], array( 'test_form' => false ) );
87
88
	// Bailout if has any upload error
89
	if ( empty( $upload_status['file'] ) ) {
90
		wp_send_json_error( $upload_status );
91
	}
92
93
	// @todo: check how wordpress verify plugin files before uploading to plugin directory
94
95
	/* you can safely run request_filesystem_credentials() without any issues and don't need to worry about passing in a URL */
96
	$creds = request_filesystem_credentials( site_url() . '/wp-admin/', '', false, false, array() );
97
98
	/* initialize the API */
99
	if ( ! WP_Filesystem( $creds ) ) {
100
		/* any problems and we exit */
101
		wp_send_json_error(array(
102
			'errorMsg' => __( 'File system does not load correctly.', 'give' )
103
		));
104
	}
105
106
	$unzip_status = unzip_file( $upload_status['file'], $wp_filesystem->wp_plugins_dir() );
107
108
	// Remove file.
109
	@unlink( $upload_status['file'] );
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
110
111
	// Bailout if not able to unzip file successfully
112
	if ( is_wp_error( $unzip_status ) ) {
113
		wp_send_json_error( array(
114
			'errorMsg' => $unzip_status
115
		) );
116
	}
117
118
	// Delete cache and get current installed addon plugin path.
119
	wp_cache_delete( 'plugins', 'plugins' );
120
	$give_addons_list = get_plugins();
121
	$installed_addon  = array();
122
123 View Code Duplication
	if ( ! empty( $give_addons_list ) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
124
		foreach ( $give_addons_list as $addon => $give_addon ) {
125
			// Only show Give Core Activated Add-Ons.
126
			if ( ! in_array( $give_addon['AuthorName'], $addon_authors ) ) {
127
				continue;
128
			}
129
130
			if ( false !== stripos( $addon, $filename ) ) {
131
				$installed_addon         = $give_addon;
132
				$installed_addon['path'] = $addon;
133
			}
134
		}
135
	}
136
137
	wp_send_json_success( array(
138
		'pluginPath'         => $installed_addon['path'],
139
		'pluginName'         => $installed_addon['Name'],
140
		'nonce'              => wp_create_nonce( "give_activate-{$installed_addon['path']}" ),
141
		'licenseSectionHtml' => Give_License::render_licenses_list(),
142
	) );
143
}
144
145
add_action( 'wp_ajax_give_upload_addon', 'give_upload_addon_handler' );
146
147
/**
148
 * Ajax license inquiry handler
149
 *
150
 * Note: only for internal use
151
 *
152
 * @since 2.5.0
153
 */
154
function give_get_license_info_handler() {
155
	check_admin_referer( 'give-license-activator-nonce' );
156
157
	// check user permission.
158
	if ( ! current_user_can( 'manage_give_settings' ) ) {
159
		give_die();
160
	}
161
162
	$license_key                  = ! empty( $_POST['license'] ) ? give_clean( $_POST['license'] ) : '';
163
	$is_activating_single_license = ! empty( $_POST['single'] ) ? absint( $_POST['single'] ) : '';
164
	$is_reactivating_license      = ! empty( $_POST['reactivate'] ) ? absint( $_POST['reactivate'] ) : '';
165
	$plugin_slug                  = $is_activating_single_license ? give_clean( $_POST['addon'] ) : '';
166
	$licenses                     = get_option( 'give_licenses', array() );
167
168
169
	if ( ! $license_key ) {
170
		wp_send_json_error( array(
171
			'errorMsg' => __( 'Sorry, you entered an invalid key.', 'give' ),
172
		) );
173
174
	} else if (
175
		! $is_reactivating_license
176
		&& array_key_exists( $license_key, $licenses )
177
	) {
178
		// If admin already activated license but did not install add-on then send license info show notice to admin with download link.
179
		$license = $licenses[$license_key];
180
		if( empty( $license['is_all_access_pass'] ) ) {
181
			$plugin_data = Give_License::get_plugin_by_slug( $license['plugin_slug' ] );
182
183
			// Plugin license activated but does not install, sent notice which allow admin to download add-on.
184
			if( empty( $plugin_data ) ) {
185
				wp_send_json_success( $license );
186
			}
187
		}
188
189
		wp_send_json_error( array(
190
			'errorMsg' => __( 'This license key is already in use on this website.', 'give' ),
191
		) );
192
	}
193
194
195
	// Check license.
196
	$check_license_res = Give_License::request_license_api( array(
197
		'edd_action' => 'check_license',
198
		'license'    => $license_key,
199
	), true );
200
201
	// Make sure there are no errors.
202
	if ( is_wp_error( $check_license_res ) ) {
203
		wp_send_json_error( array(
204
			'errorMsg' => $check_license_res->get_error_message(),
205
		) );
206
	}
207
208
	// Check if license valid or not.
209
	if ( ! $check_license_res['success'] ) {
210
		wp_send_json_error( array(
211
			'errorMsg' => sprintf(
212
				__( 'Sorry, this license was unable to activate because the license status returned as <code>%2$s</code>. Please visit your <a href="%1$s" target="_blank">license dashboard</a> to check the details and access priority support.' ),
213
				Give_License::get_account_url(),
214
				$check_license_res['license']
215
			),
216
		) );
217
	}
218
219 View Code Duplication
	if(
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
220
		$is_activating_single_license
221
		&& ! empty( $check_license_res['plugin_slug'] )
222
		&& $plugin_slug !== $check_license_res['plugin_slug']
223
	) {
224
		wp_send_json_error( array(
225
			'errorMsg' => sprintf(
226
				__( 'Sorry, we are unable to activate this license because this key does not belong to this add-on. Please visit your <a href="%1$s" target="_blank">license dashboard</a> to check the details and access priority support.' ),
227
				Give_License::get_account_url()
228
			),
229
		) );
230
	}
231
232
	// Activate license.
233
	$activate_license_res = Give_License::request_license_api( array(
234
		'edd_action' => 'activate_license',
235
		'item_name'  => $check_license_res['item_name'],
236
		'license'    => $license_key,
237
	), true );
238
239
	if ( is_wp_error( $activate_license_res ) ) {
240
		wp_send_json_error( array(
241
			'errorMsg' => $check_license_res->get_error_message(),
242
		) );
243
	}
244
245
	// Return error if license activation is not success and admin is not reactivating add-on.
246 View Code Duplication
	if ( ! $is_reactivating_license && ! $activate_license_res['success']  ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
247
248
		$response['errorMsg'] = sprintf(
249
			__( 'Sorry, this license was unable to activate because the license status returned as <code>%2$s</code>. Please visit your <a href="%1$s" target="_blank">license dashboard</a> to check the details and access priority support.' ),
250
			Give_License::get_account_url(),
251
			$check_license_res['license']
252
		);
253
254
		wp_send_json_error( $response );
255
	}
256
257
	$check_license_res['license']          = $activate_license_res['license'];
258
	$check_license_res['site_count']       = $activate_license_res['site_count'];
259
	$check_license_res['activations_left'] = $activate_license_res['activations_left'];
260
261
	$licenses[ $check_license_res['license_key'] ] = $check_license_res;
262
	update_option( 'give_licenses', $licenses );
263
264
	// Get license section HTML.
265
	$response         = $check_license_res;
266
	$response['html'] = $is_activating_single_license && empty( $check_license_res['is_all_access_pass'] )
267
		? Give_License::html_by_plugin( Give_License::get_plugin_by_slug( $check_license_res['plugin_slug'] ) )
268
		: Give_License::render_licenses_list();
269
270
	// Return error if license activation is not success and admin is reactivating add-on.
271 View Code Duplication
	if ( $is_reactivating_license && ! $activate_license_res['success'] ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
272
273
		$response['errorMsg'] = sprintf(
274
			__( 'Sorry, this license was unable to activate because the license status returned as <code>%2$s</code>. Please visit your <a href="%1$s" target="_blank">license dashboard</a> to check the details and access priority support.' ),
275
			Give_License::get_account_url(),
276
			$check_license_res['license']
277
		);
278
279
		wp_send_json_error( $response );
280
	}
281
282
283
	// Tell WordPress to look for updates.
284
	give_refresh_licenses();
285
286
	wp_send_json_success( $response );
287
}
288
289
add_action( 'wp_ajax_give_get_license_info', 'give_get_license_info_handler' );
290
291
292
/**
293
 * Activate addon handler
294
 *
295
 * Note: only for internal use
296
 *
297
 * @since 2.5.0
298
 */
299
function give_activate_addon_handler() {
300
	$plugin_path = give_clean( $_POST['plugin'] );
301
302
	check_admin_referer( "give_activate-{$plugin_path}" );
303
304
	// check user permission.
305
	if ( ! current_user_can( 'manage_give_settings' ) ) {
306
		give_die();
307
	}
308
309
	$status = activate_plugin( $plugin_path );
310
311
	if ( is_wp_error( $status ) ) {
312
		wp_send_json_error( array( 'errorMsg' => $status->get_error_message() ) );
313
	}
314
315
	// Tell WordPress to look for updates.
316
	give_refresh_licenses();
317
318
	wp_send_json_success( array(
319
		'licenseSectionHtml' => Give_License::render_licenses_list(),
320
	) );
321
}
322
323
add_action( 'wp_ajax_give_activate_addon', 'give_activate_addon_handler' );
324
325
326
/**
327
 * deactivate addon handler
328
 *
329
 * Note: only for internal use
330
 *
331
 * @since 2.5.0
332
 */
333
function give_deactivate_license_handler() {
334
	$license        = give_clean( $_POST['license'] );
335
	$item_name      = give_clean( $_POST['item_name'] );
336
	$plugin_dirname = give_clean( $_POST['plugin_dirname'] );
337
338
	if ( ! $license || ! $item_name ) {
339
		wp_send_json_error();
340
	}
341
342
	check_admin_referer( "give-deactivate-license-{$item_name}" );
343
344
	// check user permission.
345
	if ( ! current_user_can( 'manage_give_settings' ) ) {
346
		give_die();
347
	}
348
349
	$give_licenses = get_option( 'give_licenses', array() );
350
351
	if ( empty( $give_licenses[ $license ] ) ) {
352
		wp_send_json_error( array(
353
				'errorMsg' => __( 'We are unable to deactivate invalid license', 'give' ),
354
			)
355
		);
356
	}
357
358
	/* @var array|WP_Error $response */
359
	$response = Give_License::request_license_api( array(
360
		'edd_action' => 'deactivate_license',
361
		'license'    => $license,
362
		'item_name'  => $item_name,
363
	), true );
364
365
	if ( is_wp_error( $response ) ) {
366
		wp_send_json_error( array(
367
			'errorMsg' => $response->get_error_message(),
368
			'response' => $license,
369
		) );
370
	}
371
372
	$is_all_access_pass = $give_licenses[ $license ]['is_all_access_pass'];
373
374
	if ( ! empty( $give_licenses[ $license ] ) ) {
375
		unset( $give_licenses[ $license ] );
376
		update_option( 'give_licenses', $give_licenses );
377
	}
378
379
	$response['html'] = $is_all_access_pass
380
		? Give_License::render_licenses_list()
381
		: Give_License::html_by_plugin( Give_License::get_plugin_by_slug( $plugin_dirname ) );
0 ignored issues
show
Bug introduced by
It seems like $plugin_dirname defined by give_clean($_POST['plugin_dirname']) on line 336 can also be of type array; however, Give_License::get_plugin_by_slug() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
382
383
	$response['msg'] = __( 'You have successfully deactivated the license.', 'give' );
384
385
	// Tell WordPress to look for updates.
386
	give_refresh_licenses();
387
388
	wp_send_json_success( $response );
389
}
390
391
add_action( 'wp_ajax_give_deactivate_license', 'give_deactivate_license_handler' );
392
393
394
/**
395
 * Refresh all addons licenses handler
396
 *
397
 * Note: only for internal use
398
 *
399
 * @since 2.5.0
400
 */
401
function give_refresh_all_licenses_handler() {
402
	check_admin_referer( 'give-refresh-all-licenses' );
403
404
	// check user permission.
405
	if ( ! current_user_can( 'manage_give_settings' ) ) {
406
		give_die();
407
	}
408
409
	$data = Give_License::refresh_license_status();
410
411
	// Update date and reset counter.
412
	if ( $data['compare'] === date( 'Ymd' ) && 5 <= $data['count'] ) {
413
		wp_send_json_error();
414
	}
415
416
	// Update date and reset counter.
417
	if ( $data['compare'] < date( 'Ymd' ) ) {
418
		$data['compare'] = date( 'Ymd' );
419
		$data['count']   = 0;
420
	}
421
422
	// Update time.
423
	$data['time'] = current_time( 'timestamp', 1 );
424
425
	++ $data['count'];
426
427
	update_option( 'give_licenses_refreshed_last_checked', $data, 'no' );
428
429
	give_refresh_licenses();
430
431
	$local_date = strtotime( get_date_from_gmt( date( 'Y-m-d H:i:s', $data['time'] ) ) );
432
	wp_send_json_success( array(
433
		'html'          => Give_License::render_licenses_list(),
434
		'refreshButton' => 5 <= $data['count'],
435
		'refreshStatus' => $data,
436
		'lastUpdateMsg' => sprintf(
437
			__( 'Last refreshed on %1$s at %2$s', 'give' ),
438
			date( give_date_format(), $local_date ),
439
			date( 'g:i a', $local_date )
440
		),
441
	) );
442
}
443
444
add_action( 'wp_ajax_give_refresh_all_licenses', 'give_refresh_all_licenses_handler' );
445
446
447
/**
448
 * Updates information on the "View version x.x details" page with custom data.
449
 * Note: only for internal use
450
 *
451
 * @param mixed  $_data
452
 * @param string $_action
453
 * @param object $_args
454
 *
455
 * @return object $_data
456
 * @since 2.5.0
457
 * @uses  api_request()
458
 *
459
 */
460
function give_plugins_api_filter( $_data, $_action = '', $_args = null ) {
461
	// Exit.
462
	if ( 'plugin_information' !== $_action ) {
463
		return $_data;
464
	}
465
466
467
	$plugin = Give_License::get_plugin_by_slug( $_args->slug );
468
469
	if (
470
		! $plugin
0 ignored issues
show
Bug Best Practice introduced by
The expression $plugin of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
471
		|| 'add-on' !== $plugin['Type']
472
		|| false === strpos( $_args->slug, 'give-' )
473
	) {
474
		return $_data;
475
	}
476
477
	$plugin_data = get_site_transient( 'update_plugins' );
478
479
	if ( ! $plugin_data ) {
480
		give_refresh_licenses();
481
	}
482
483
	$plugin_data = ! empty( $plugin_data->response[ $plugin['Path'] ] )
484
		? $plugin_data->response[ $plugin['Path'] ]
485
		: array();
486
487
	if ( ! $plugin_data ) {
488
		return $_data;
489
	}
490
491
	$_data = $plugin_data;
492
493
	return $_data;
494
}
495
496
add_filter( 'plugins_api', 'give_plugins_api_filter', 9999, 3 );
497
498
499
/**
500
 * Check add-ons updates when WordPress check plugin updates
501
 *
502
 * @since 2.5.0
503
 */
504
add_filter( 'pre_set_site_transient_update_plugins', 'give_check_addon_updates', 999, 1 );
505
506
507
/**
508
 * Show plugin update notification on multi-site
509
 *
510
 * @param string $file
511
 * @param array  $plugin
512
 *
513
 * @since 2.5.0
514
 */
515
function give_show_update_notification_on_multisite( $file, $plugin ) {
516
	if ( is_network_admin() ) {
517
		return;
518
	}
519
520
	if ( ! current_user_can( 'update_plugins' ) ) {
521
		return;
522
	}
523
524
	if ( ! is_multisite() ) {
525
		return;
526
	}
527
528 View Code Duplication
	if (
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
529
		! $plugin
0 ignored issues
show
Bug Best Practice introduced by
The expression $plugin of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
530
		|| empty( $plugin['slug'] )
531
		|| false === strpos( $plugin['slug'], 'give-' )
532
	) {
533
		return;
534
	}
535
536
	$plugin_data = Give_License::get_plugin_by_slug( $plugin['slug'] );
537
538
	// Only show notices for Give add-ons
539
	if ( 'add-on' !== $plugin_data['Type']  ) {
540
		return;
541
	}
542
543
	// Do not print any message if updates does not exist.
544
	$update_cache = get_site_transient( 'update_plugins' );
545
546
	if( ! isset( $update_cache->response[$file] ) ) {
547
		return;
548
	}
549
550
551
	if ( ! empty( $update_cache->response[ $plugin_data['Path'] ] ) && version_compare( $plugin_data['Version'], $plugin['new_version'], '<' ) ) {
552
		printf(
553
			'<tr class="plugin-update-tr %3$s" id="%1$s-update" data-slug="%1$s" data-plugin="%2$s">',
554
			$plugin['slug'],
555
			$file,
556
			'active' === $plugin_data['Status'] ? 'active' : 'inactive'
557
		);
558
559
		echo '<td colspan="3" class="plugin-update colspanchange">';
560
		echo '<div class="update-message notice inline notice-warning notice-alt"><p>';
561
562
		$changelog_link = self_admin_url( "plugin-install.php?tab=plugin-information&plugin={$plugin['slug']}&section=changelog&TB_iframe=true&width=772&height=299" );
563
564
		if ( empty( $plugin['download_link'] ) ) {
565
			printf(
566
				__( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s.', 'give' ),
567
				esc_html( $plugin_data['Name'] ),
568
				'<a target="_blank" class="thickbox open-plugin-details-modal" href="' . esc_url( $changelog_link ) . '">',
569
				esc_html( $plugin['new_version'] ),
570
				'</a>'
571
			);
572
		} else {
573
			printf(
574
				__( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s or %5$supdate now%6$s.', 'give' ),
575
				esc_html( $plugin_data['Name'] ),
576
				'<a target="_blank" class="thickbox open-plugin-details-modal" href="' . esc_url( $changelog_link ) . '">',
577
				esc_html( $plugin['new_version'] ),
578
				'</a>',
579
				'<a target="_blank" class="update-link" href="' . esc_url( wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $file, 'upgrade-plugin_' . $file ) ) . '">',
580
				'</a>'
581
			);
582
		}
583
584
		do_action( "in_plugin_update_message-{$file}", $plugin, $plugin );
585
586
		echo '</p></div></td></tr>';
587
	}
588
}
589
590
add_action( 'after_plugin_row', 'give_show_update_notification_on_multisite', 10, 2 );
591
592
/**
593
 * Show plugin update notification on single site
594
 *
595
 * @param $file
596
 * @param $plugin
597
 *
598
 * @since 2.5.0
599
 */
600
function give_show_update_notification_on_single_site( $file, $plugin ) {
601
	if ( ! current_user_can( 'update_plugins' ) || is_multisite() ) {
602
		return;
603
	}
604
605
606 View Code Duplication
	if (
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
607
		! $plugin
608
		|| empty( $plugin['slug'] )
609
		|| false === strpos( $plugin['slug'], 'give-' )
610
	) {
611
		return;
612
	}
613
614
	$plugin_data = Give_License::get_plugin_by_slug( $plugin['slug'] );
615
616
	// Only show notices for Give add-ons
617
	if (
618
		'add-on' !== $plugin_data['Type']
619
		|| $plugin_data['License']
620
	) {
621
		return;
622
	}
623
624
	// Do not print any message if updates does not exist.
625
	$update_plugins = get_site_transient( 'update_plugins' );
626
	if( ! isset( $update_plugins->response[$file] ) ) {
627
		return;
628
	}
629
630
631
	// Remove core update notice.
632
	remove_action( "after_plugin_row_{$file}", 'wp_plugin_update_row' );
633
634
	$update_notice_wrap = '<tr class="plugin-update-tr %3$s"><td colspan="3" class="colspanchange"><div class="update-message notice inline notice-warning notice-alt give-invalid-license"><p>%1$s %2$s</p></div></td></tr>';
635
	$changelog_link     = self_admin_url( "plugin-install.php?tab=plugin-information&plugin={$plugin['slug']}&section=changelog&TB_iframe=true&width=772&height=299" );
636
637
	echo sprintf(
638
		$update_notice_wrap,
639
		sprintf(
640
			__( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s.', 'give' ),
641
			esc_html( $plugin_data['Name'] ),
642
			'<a target="_blank" class="thickbox open-plugin-details-modal" href="' . esc_url( $changelog_link ) . '">',
643
			esc_html( $plugin['new_version'] ),
644
			'</a>'
645
		),
646
		sprintf(
647
			'Please <a href="%1$s" target="_blank">activate your license</a> to receive updates and support.',
648
			esc_url( admin_url( 'edit.php?post_type=give_forms&page=give-settings&tab=licenses' ) )
649
		),
650
		'active' === $plugin_data['Status'] ? 'active' : 'inactive'
651
	);
652
}
653
654
add_action( 'after_plugin_row', 'give_show_update_notification_on_single_site', 1, 2 );
655
656
657
658