PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
4.16.7.1 4.16.7 4.16.6.1 4.16.6 4.16.5.1 4.16.5 4.16.4 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 / admin / plugins.php
give / includes / admin Last commit date
add-ons 5 days ago donors 2 weeks ago emails 2 weeks ago forms 1 month ago payments 4 weeks ago reports 1 year ago settings 3 months ago shortcodes 1 year ago tools 6 months ago upgrades 6 months ago views 1 year ago abstract-admin-settings-page.php 2 years ago admin-actions.php 1 month ago admin-filters.php 11 months ago admin-footer.php 2 years ago admin-pages.php 6 months ago class-addon-activation-banner.php 11 months ago class-admin-settings.php 1 year ago class-api-keys-table.php 4 years ago class-blank-slate.php 1 year ago class-give-admin.php 5 years ago class-give-html-elements.php 1 year ago class-i18n-module.php 4 years ago dashboard-widgets.php 3 years ago give-metabox-functions.php 3 years ago import-functions.php 1 year ago misc-functions.php 2 years ago plugins.php 5 days ago setting-page-functions.php 6 years ago
plugins.php
581 lines
1 <?php
2 /**
3 * Admin Plugins
4 *
5 * @package Give
6 * @subpackage Admin/Plugins
7 * @copyright Copyright (c) 2016, GiveWP
8 * @license https://opensource.org/licenses/gpl-license GNU Public License
9 * @since 1.4
10 */
11
12 // Exit if accessed directly.
13 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Plugins row action links
19 *
20 * @since 1.4
21 *
22 * @param array $actions An array of plugin action links.
23 *
24 * @return array An array of updated action links.
25 */
26 function give_plugin_action_links( $actions ) {
27 $new_actions = [
28 'settings' => sprintf(
29 '<a href="%1$s">%2$s</a>',
30 admin_url( 'edit.php?post_type=give_forms&page=give-settings' ),
31 __( 'Settings', 'give' )
32 ),
33 ];
34
35 return array_merge( $new_actions, $actions );
36 }
37
38 add_filter( 'plugin_action_links_' . GIVE_PLUGIN_BASENAME, 'give_plugin_action_links' );
39
40
41 /**
42 * Plugin row meta links
43 *
44 * @since 1.4
45 *
46 * @param array $plugin_meta An array of the plugin's metadata.
47 * @param string $plugin_file Path to the plugin file, relative to the plugins directory.
48 *
49 * @return array
50 */
51 function give_plugin_row_meta( $plugin_meta, $plugin_file ) {
52 if ( GIVE_PLUGIN_BASENAME !== $plugin_file ) {
53 return $plugin_meta;
54 }
55
56 $new_meta_links = [
57 sprintf(
58 '<a href="%1$s" target="_blank">%2$s</a>',
59 esc_url(
60 add_query_arg(
61 [
62 'utm_source' => 'plugins-page',
63 'utm_medium' => 'plugin-row',
64 'utm_campaign' => 'admin',
65 ],
66 'https://givewp.com/documentation/'
67 )
68 ),
69 __( 'Documentation', 'give' )
70 ),
71 sprintf(
72 '<a href="%1$s" target="_blank">%2$s</a>',
73 esc_url(
74 add_query_arg(
75 [
76 'utm_source' => 'plugins-page',
77 'utm_medium' => 'plugin-row',
78 'utm_campaign' => 'admin',
79 ],
80 'https://givewp.com/addons/'
81 )
82 ),
83 __( 'Add-ons', 'give' )
84 ),
85 ];
86
87 return array_merge( $plugin_meta, $new_meta_links );
88 }
89
90 add_filter( 'plugin_row_meta', 'give_plugin_row_meta', 10, 2 );
91
92
93 /**
94 * Get the Parent Page Menu Title in admin section.
95 * Based on get_admin_page_title WordPress Function.
96 *
97 * @since 1.8.17
98 *
99 * @global array $submenu
100 * @global string $plugin_page
101 *
102 * @return string $title Page title
103 */
104 function give_get_admin_page_menu_title() {
105 $title = '';
106 global $submenu, $plugin_page;
107
108 foreach ( array_keys( $submenu ) as $parent ) {
109 if ( 'edit.php?post_type=give_forms' !== $parent ) {
110 continue;
111 }
112
113 foreach ( $submenu[ $parent ] as $submenu_array ) {
114 if ( $plugin_page !== $submenu_array[2] ) {
115 continue;
116 }
117
118 $title = isset( $submenu_array[0] ) ?
119 $submenu_array[0] :
120 $submenu_array[3];
121 }
122 }
123
124 return $title;
125 }
126
127 /**
128 * Create new menu in plugin section that include all the add-on
129 *
130 * @since 2.1.0
131 *
132 * @param $plugin_menu
133 *
134 * @return mixed
135 */
136 function give_filter_addons_do_filter_addons( $plugin_menu ) {
137 global $plugins;
138
139 $give_addons = wp_list_pluck( give_get_plugins( [ 'only_add_on' => true ] ), 'Name' );
140
141 if ( ! empty( $give_addons ) ) {
142 foreach ( $plugins['all'] as $file => $plugin_data ) {
143
144 if ( in_array( $plugin_data['Name'], $give_addons ) ) {
145 $plugins['give'][ $file ] = $plugins['all'][ $file ];
146 $plugins['give'][ $file ]['plugin'] = $file;
147
148 // Replicate the next step.
149 if ( current_user_can( 'update_plugins' ) ) {
150 $current = get_site_transient( 'update_plugins' );
151
152 if ( isset( $current->response[ $file ] ) ) {
153 $plugins['give'][ $file ]['update'] = true;
154 $plugins['give'][ $file ] = array_merge( (array) $current->response[ $file ], $plugins['give'][ $file ] );
155 } elseif ( isset( $current->no_update[ $file ] ) ) {
156 $plugins['give'][ $file ] = array_merge( (array) $current->no_update[ $file ], $plugins['give'][ $file ] );
157 }
158 }
159 }
160 }
161 }
162
163 return $plugin_menu;
164
165 }
166
167 add_filter( 'show_advanced_plugins', 'give_filter_addons_do_filter_addons' );
168 add_filter( 'show_network_active_plugins', 'give_filter_addons_do_filter_addons' );
169
170 /**
171 * Keep activating the same add-on when admin activate or deactivate from Give Menu
172 *
173 * @since 2.2.0
174 *
175 * @param $action
176 * @param $result
177 */
178 function give_prepare_filter_addons_referer( $action, $result ) {
179 if ( ! function_exists( 'get_current_screen' ) ) {
180 return;
181 }
182 $screen = get_current_screen();
183 if ( is_object( $screen ) && $screen->base === 'plugins' && ! empty( $_REQUEST['plugin_status'] ) && $_REQUEST['plugin_status'] === 'give' ) {
184 global $status;
185 $status = 'give';
186 }
187 }
188
189 add_action( 'check_admin_referer', 'give_prepare_filter_addons_referer', 10, 2 );
190
191 /**
192 * Make the Give Menu as an default menu and update the Menu Name
193 *
194 * @since 2.1.0
195 *
196 * @param $views
197 *
198 * @return mixed
199 */
200 function give_filter_addons_filter_addons( $views ) {
201
202 global $status, $plugins;
203
204 if ( ! empty( $plugins['give'] ) ) {
205 $class = '';
206
207 if ( 'give' === $status ) {
208 $class = 'current';
209 }
210
211 $views['give'] = sprintf(
212 '<a class="%s" href="plugins.php?plugin_status=give"> %s <span class="count">(%s) </span></a>',
213 $class,
214 __( 'Give', 'give' ),
215 count( $plugins['give'] )
216 );
217 }
218
219 return $views;
220 }
221
222 add_filter( 'views_plugins', 'give_filter_addons_filter_addons' );
223 add_filter( 'views_plugins-network', 'give_filter_addons_filter_addons' );
224
225 /**
226 * Set the Give as the Main menu when admin click on the Give Menu in Plugin section.
227 *
228 * @since 2.1.0
229 *
230 * @param $plugins
231 *
232 * @return mixed
233 */
234 function give_prepare_filter_addons( $plugins ) {
235 global $status;
236
237 if ( isset( $_REQUEST['plugin_status'] ) && 'give' === $_REQUEST['plugin_status'] ) {
238 $status = 'give';
239 }
240
241 return $plugins;
242 }
243
244 add_filter( 'all_plugins', 'give_prepare_filter_addons' );
245
246
247 /**
248 * Display the upgrade notice message.
249 *
250 * @param array $data Array of plugin metadata.
251 * @param array $response An array of metadata about the available plugin update.
252 *
253 * @since 2.1
254 */
255 function give_in_plugin_update_message( $data, $response ) {
256 $new_version = $data['new_version'];
257 $current_version_parts = explode( '.', GIVE_VERSION );
258 $new_version_parts = explode( '.', $new_version );
259
260 // If it is a minor upgrade then return.
261 if ( version_compare( $current_version_parts[0] . '.' . $current_version_parts[1], $new_version_parts[0] . '.' . $new_version_parts[1], '=' ) ) {
262
263 return;
264 }
265
266 // Get the upgrade notice from the trunk.
267 $upgrade_notice = give_get_plugin_upgrade_notice( $new_version );
268
269 // Display upgrade notice.
270 echo apply_filters( 'give_in_plugin_update_message', $upgrade_notice ? '</p>' . wp_kses_post( $upgrade_notice ) . '<p class="dummy">' : '' );
271 }
272
273 // Display upgrade notice.
274 add_action( 'in_plugin_update_message-' . GIVE_PLUGIN_BASENAME, 'give_in_plugin_update_message', 10, 2 );
275
276
277 /**
278 * Get the upgrade notice from WordPress.org.
279 *
280 * Note: internal purpose use only
281 *
282 * @since 2.1
283 *
284 * @param string $new_version New verison of the plugin.
285 *
286 * @return string
287 */
288 function give_get_plugin_upgrade_notice( $new_version ) {
289
290 // Cache the upgrade notice.
291 $transient_name = "give_upgrade_notice_{$new_version}";
292 $upgrade_notice = get_transient( $transient_name );
293
294 if ( false === $upgrade_notice ) {
295 $response = wp_safe_remote_get( 'https://plugins.svn.wordpress.org/give/trunk/readme.txt' );
296
297 if ( ! is_wp_error( $response ) && ! empty( $response['body'] ) ) {
298 $upgrade_notice = give_parse_plugin_update_notice( $response['body'], $new_version );
299 set_transient( $transient_name, $upgrade_notice, DAY_IN_SECONDS );
300 }
301 }
302
303 return $upgrade_notice;
304 }
305
306
307 /**
308 * Parse update notice from readme file.
309 *
310 * Note: internal purpose use only
311 *
312 * @since 2.1
313 *
314 * @param string $content Content of the readme.txt file.
315 * @param string $new_version The version with current version is compared.
316 *
317 * @return string
318 */
319 function give_parse_plugin_update_notice( $content, $new_version ) {
320 $version_parts = explode( '.', $new_version );
321 $check_for_notices = [
322 $version_parts[0] . '.0',
323 $version_parts[0] . '.0.0',
324 $version_parts[0] . '.' . $version_parts[1] . '.' . '0',
325 ];
326
327 // Regex to extract Upgrade notice from the readme.txt file.
328 $notice_regexp = '~==\s*Upgrade Notice\s*==\s*=\s*(.*)\s*=(.*)(=\s*' . preg_quote( $new_version ) . '\s*=|$)~Uis';
329
330 $upgrade_notice = '';
331
332 foreach ( $check_for_notices as $check_version ) {
333 if ( version_compare( GIVE_VERSION, $check_version, '>' ) ) {
334 continue;
335 }
336
337 $matches = null;
338
339 if ( preg_match( $notice_regexp, $content, $matches ) ) {
340 $notices = (array) preg_split( '~[\r\n]+~', trim( $matches[2] ) );
341
342 if ( version_compare( trim( $matches[1] ), $check_version, '=' ) ) {
343 $upgrade_notice .= '<p class="give-plugin-upgrade-notice">';
344
345 foreach ( $notices as $index => $line ) {
346 $upgrade_notice .= preg_replace( '~\[([^\]]*)\]\(([^\)]*)\)~', '<a href="${2}">${1}</a>', $line );
347 }
348
349 $upgrade_notice .= '</p>';
350 }
351
352 if ( ! empty( $upgrade_notice ) ) {
353 break;
354 }
355 }
356 }
357
358 return wp_kses_post( $upgrade_notice );
359 }
360
361
362 /**
363 * Add styling to the plugin upgrade notice.
364 *
365 * @since 2.1
366 */
367 function give_plugin_notice_css() {
368 ?>
369 <style type="text/css">
370 #give-update .give-plugin-upgrade-notice {
371 font-weight: 400;
372 background: #fff8e5 !important;
373 border-left: 4px solid #ffb900;
374 border-top: 1px solid #ffb900;
375 padding: 9px 0 9px 12px !important;
376 margin: 0 -12px 0 -16px !important;
377 }
378
379 #give-update .give-plugin-upgrade-notice:before {
380 content: '\f348';
381 display: inline-block;
382 font: 400 18px/1 dashicons;
383 speak: none;
384 margin: 0 8px 0 -2px;
385 vertical-align: top;
386 }
387
388 #give-update .dummy {
389 display: none;
390 }
391 </style>
392 <?php
393 }
394
395 add_action( 'admin_head', 'give_plugin_notice_css' );
396
397 /**
398 * Renders the Give Deactivation Survey Form.
399 * Note: only for internal use
400 *
401 * @since 4.10.0 Updated the icon path to the new build directory.
402 * @since 2.2
403 */
404 function give_deactivation_popup() {
405 // Bailout.
406 if ( ! current_user_can( 'delete_plugins' ) ) {
407 give_die();
408 }
409
410 $results = [];
411
412 // Start output buffering.
413 ob_start();
414 ?>
415
416 <h2 id="deactivation-survey-title">
417 <img src="<?php echo esc_url( GIVE_PLUGIN_URL ); ?>/build/assets/dist/images/give-icon-full-circle.svg">
418 <span><?php esc_html_e( 'GiveWP Deactivation', 'give' ); ?></span>
419 </h2>
420 <form class="deactivation-survey-form" method="POST">
421 <p><?php esc_html_e( 'If you have a moment, please let us know why you are deactivating Give. All submissions are anonymous and we only use this feedback to improve this plugin.', 'give' ); ?></p>
422
423 <div>
424 <label class="give-field-description">
425 <input type="radio" name="give-survey-radios" value="1">
426 <?php esc_html_e( "I'm only deactivating temporarily", 'give' ); ?>
427 </label>
428 </div>
429
430 <div>
431 <label class="give-field-description">
432 <input type="radio" name="give-survey-radios" value="2">
433 <?php esc_html_e( 'I no longer need the plugin', 'give' ); ?>
434 </label>
435 </div>
436
437 <div>
438 <label class="give-field-description">
439 <input type="radio" name="give-survey-radios" value="3" data-has-field="true">
440 <?php esc_html_e( 'I found a better plugin', 'give' ); ?>
441 </label>
442
443 <div class="give-survey-extra-field">
444 <p><?php esc_html_e( 'What is the name of the plugin?', 'give' ); ?></p>
445 <input type="text" name="user-reason" class="widefat">
446 </div>
447 </div>
448
449 <div>
450 <label class="give-field-description">
451 <input type="radio" name="give-survey-radios" value="4">
452 <?php esc_html_e( 'I only needed the plugin for a short period', 'give' ); ?>
453 </label>
454 </div>
455
456 <div>
457 <label class="give-field-description">
458 <input type="radio" name="give-survey-radios" value="5" data-has-field="true">
459 <?php esc_html_e( 'The plugin broke my site', 'give' ); ?>
460 </label>
461
462 <div class="give-survey-extra-field">
463 <p>
464 <?php
465 printf(
466 '%1$s %2$s %3$s',
467 __( "We're sorry to hear that, check", 'give' ),
468 '<a href="https://wordpress.org/support/plugin/give">GiveWP Support</a>.',
469 __( 'Can you describe the issue?', 'give' )
470 );
471 ?>
472 </p>
473 <textarea disabled name="user-reason" class="widefat" rows="6"></textarea>
474 </div>
475 </div>
476
477 <div>
478 <label class="give-field-description">
479 <input type="radio" name="give-survey-radios" value="6" data-has-field="true">
480 <?php esc_html_e( 'The plugin suddenly stopped working', 'give' ); ?>
481 </label>
482
483 <div class="give-survey-extra-field">
484 <p>
485 <?php
486 printf(
487 '%1$s %2$s %3$s',
488 __( "We're sorry to hear that, check", 'give' ),
489 '<a href="https://wordpress.org/support/plugin/give">GiveWP Support</a>.',
490 __( 'Can you describe the issue?', 'give' )
491 );
492 ?>
493 </p>
494 <textarea disabled name="user-reason" class="widefat" rows="6"></textarea>
495 </div>
496 </div>
497
498 <div>
499 <label class="give-field-description">
500 <input type="radio" name="give-survey-radios" value="7" data-has-field="true">
501 <?php esc_html_e( 'Other', 'give' ); ?>
502 </label>
503
504 <div class="give-survey-extra-field">
505 <p><?php esc_html_e( "Please describe why you're deactivating Give", 'give' ); ?></p>
506 <textarea disabled name="user-reason" class="widefat" rows="6"></textarea>
507 </div>
508 </div>
509
510 <div id="survey-and-delete-data">
511 <p>
512 <label>
513 <input type="checkbox" name="confirm_reset_store" value="1">
514 <?php esc_html_e( 'Would you like to delete all GiveWP data?', 'give' ); ?>
515 </label>
516 <section class="give-field-description">
517 <?php esc_html_e( 'By default the custom roles, GiveWP options, and database entries are not deleted when you deactivate Give. If you are deleting GiveWP completely from your website and want those items removed as well check this option. Note: This will permanently delete all GiveWP data from your database.', 'give' ); ?>
518 </section>
519 </p>
520 </div>
521 <input type="hidden" name="give-export-class" value="Give_Tools_Reset_Stats">
522 <?php wp_nonce_field( 'give_ajax_export', 'give_ajax_export' ); ?>
523 </form>
524
525 <?php
526
527 // Echo content (deactivation form) from the output buffer.
528 $output = ob_get_clean();
529
530 $results['html'] = $output;
531
532 wp_send_json( $results );
533 }
534
535 add_action( 'wp_ajax_give_deactivation_popup', 'give_deactivation_popup' );
536
537 /**
538 * Ajax callback after the deactivation survey form has been submitted.
539 * Note: only for internal use
540 *
541 * @since 2.2
542 */
543 function give_deactivation_form_submit() {
544
545 if ( ! check_ajax_referer( 'deactivation_survey_nonce', 'nonce', false ) ) {
546 wp_send_json_error();
547 }
548
549 $form_data = give_clean( wp_parse_args( $_POST['form-data'] ) );
550
551 // Get the selected radio value.
552 $radio_value = isset( $form_data['give-survey-radios'] ) ? $form_data['give-survey-radios'] : 0;
553
554 // Get the reason if any radio button has an optional text field.
555 $user_reason = isset( $form_data['user-reason'] ) ? $form_data['user-reason'] : '';
556
557 // Get the value of the checkbox for deleting Give's data.
558 $delete_data = isset( $form_data['confirm_reset_store'] ) ? $form_data['confirm_reset_store'] : '';
559
560 // Send data to survey server. It doesn't matter if it fails.
561 wp_remote_post(
562 'http://survey.givewp.com/wp-json/give/v2/survey/',
563 [
564 'body' => [
565 'radio_value' => $radio_value,
566 'user_reason' => $user_reason,
567 ],
568 'timeout' => 0.1
569 ]
570 );
571
572 if ( '1' === $delete_data ) {
573 give_update_option( 'uninstall_on_delete', 'enabled' );
574 wp_send_json_success( [ 'delete_data' => true ] );
575 }
576
577 wp_send_json_success( [ 'delete_data' => false ] );
578 }
579
580 add_action( 'wp_ajax_deactivation_form_submit', 'give_deactivation_form_submit' );
581