PluginProbe
Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) / 1.8.13
Charitable – Donation & Fundraising Platform (Donation Forms, Recurring Donations & Fundraising Campaigns) v1.8.13
1.8.13 1.8.12.3 1.8.12.2 1.8.12.1 1.8.12 1.8.11.3 1.8.11.2 1.8.11.1 1.8.11 1.6.6 1.6.60 1.6.7 1.6.8 1.6.9 1.7.0 1.7.0.1 1.7.0.11 1.7.0.12 1.7.0.14 1.7.0.2 1.7.0.3 1.7.0.5 1.7.0.6 1.7.0.7 1.7.0.9 All 211 releases
← All changes | includes/admin/settings/class-charitable-advanced-settings.php +282 -59 1.7.0.7 → 1.8.13 View file →
@@ -3,12 +3,12 @@
3 3 * Charitable Advanced Settings UI.
4 4 *
5 5 * @package Charitable/Classes/Charitable_Advanced_Settings
6 6 * @author David Bisset
7 - * @copyright Copyright (c) 2022, WP Charitable LLC
7 + * @copyright Copyright (c) 2023, WP Charitable LLC
8 8 * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
9 9 * @since 1.0.0
10 - * @version 1.2.0
10 + * @version 1.8.1
11 11 */
12 12
13 13 // Exit if accessed directly.
14 14 if ( ! defined( 'ABSPATH' ) ) {
@@ -57,9 +57,10 @@
57 57
58 58 /**
59 59 * Add the advanced tab settings fields.
60 60 *
61 - * @since 1.0.0
61 + * @since 1.0.0
62 + * @since 1.8.1.4 Added the 'charitable_settings_advanced_fields' filter.
62 63 *
63 64 * @return array<string,array>
64 65 */
65 66 public function add_advanced_fields() {
@@ -66,61 +67,82 @@
66 67 if ( ! charitable_is_settings_view( 'advanced' ) ) {
67 68 return array();
68 69 }
69 70
70 - return array(
71 - 'section' => array(
72 - 'title' => '',
73 - 'type' => 'hidden',
74 - 'priority' => 10000,
75 - 'value' => 'advanced',
76 - ),
77 - 'section_dangerous' => array(
78 - 'title' => __( 'Dangerous Settings', 'charitable' ),
79 - 'type' => 'heading',
80 - 'class' => 'section-heading dangerous-settings',
81 - 'priority' => 100,
82 - ),
83 - 'delete_data_on_uninstall' => array(
84 - 'label_for' => __( 'Reset Data', 'charitable' ),
85 - 'type' => 'checkbox',
86 - 'help' => __( 'DELETE ALL DATA when uninstalling the plugin.', 'charitable' ),
87 - 'priority' => 105,
88 - ),
89 - 'clear_expire_options' => array(
90 - 'label_for' => __( 'Clear Cache', 'charitable' ),
91 - 'type' => 'checkbox',
92 - 'help' => __( 'This can remove and refresh Charitable items in the database.', 'charitable' ),
93 - 'priority' => 120,
94 - ),
95 - 'section' => array(
96 - 'title' => '',
97 - 'type' => 'hidden',
98 - 'priority' => 10000,
99 - 'value' => 'licenses',
100 - 'save' => false,
101 - ),
102 - 'section_licenses' => array(
103 - 'title' => __( 'Legacy Licenses', 'charitable' ),
104 - 'type' => 'heading',
105 - 'class' => 'section-heading',
106 - 'priority' => 202,
107 - ),
108 - 'licenses' => array(
109 - 'title' => false,
110 - 'callback' => array( $this, 'render_licenses_table' ),
111 - 'priority' => 204,
112 - ),
71 + return apply_filters(
72 + 'charitable_settings_advanced_fields',
73 + array(
74 + 'section_hidden_advanced' => array(
75 + 'title' => '',
76 + 'type' => 'hidden',
77 + 'priority' => 10000,
78 + 'value' => 'advanced',
79 + ),
80 + 'section_dangerous' => array(
81 + 'title' => __( 'Advanced Settings', 'charitable' ),
82 + 'type' => 'heading',
83 + 'class' => 'section-heading',
84 + 'priority' => 100,
85 + ),
86 + 'delete_data_on_uninstall' => array(
87 + 'label_for' => __( 'Reset Data', 'charitable' ),
88 + 'type' => 'checkbox',
89 + 'help' => '<span style="color:red;font-weight:bold;">' . __( 'DELETE ALL DATA', 'charitable' ) . '</span> ' . __( 'when uninstalling the plugin.', 'charitable' ),
90 + 'priority' => 105,
91 + ),
92 + 'clear_expire_options' => array(
93 + 'label_for' => __( 'Clear Cache', 'charitable' ),
94 + 'type' => 'checkbox',
95 + 'help' => __( 'This removes and refreshes temporarily stored items in the database specific to Charitable.', 'charitable' ),
96 + 'priority' => 120,
97 + ),
98 + 'clear_activity_database' => array(
99 + 'label_for' => __( 'Activity Database', 'charitable' ),
100 + 'type' => 'select',
101 + 'options' => array(
102 + '' => __( 'No action', 'charitable' ), // phpcs:ignore
103 + 'clear' => __( 'Clear database records', 'charitable' ),
104 + 'remove' => __( 'Remove database tables', 'charitable' ),
105 + ),
106 + 'help' => __( 'This clears or removes the custom database tables related to activities tracked by Charitable.', 'charitable' ),
107 + 'priority' => 150,
108 + ),
109 + 'disable_campaign_legacy_mode' => array(
110 + 'label_for' => __( 'Disable Legacy Mode', 'charitable' ),
111 + 'type' => 'checkbox',
112 + 'help' => /* translators: %1$s: URL to the documentation. */
113 + sprintf( __( 'Determines ability for admin users to add new legacy campaigns. <a href="%1$s">Learn More</a>.', 'charitable' ), 'https://www.wpcharitable.com/documentation/legacy-campaigns/' ),
114 + 'priority' => 155,
115 + 'default' => true,
116 + ),
117 + 'charitable_usage_tracking' => array(
118 + 'label_for' => __( 'Usage Tracking', 'charitable' ),
119 + 'type' => 'checkbox',
120 + 'help' => /* translators: %1$s: URL to the documentation. */
121 + sprintf( __( 'Allows us to better help you as we know which WordPress configurations, themes and plugins we should test. <a href="%1$s">Learn More</a>.', 'charitable' ), 'https://www.wpcharitable.com/documentation/usage-tracking/' ),
122 + 'priority' => 155,
123 + 'default' => false,
124 + ),
125 + 'section_hidden_licenses' => array(
126 + 'title' => '',
127 + 'type' => 'hidden',
128 + 'priority' => 10000,
129 + 'value' => 'licenses',
130 + 'save' => false,
131 + ),
132 + 'section_licenses' => array(
133 + 'title' => __( 'Legacy Licenses', 'charitable' ),
134 + 'type' => 'heading',
135 + 'class' => 'section-heading',
136 + 'priority' => 202,
137 + ),
138 + 'licenses' => array(
139 + 'title' => false,
140 + 'callback' => array( $this, 'render_licenses_table' ),
141 + 'priority' => 204,
142 + ),
143 + )
113 144 );
114 -
115 - foreach ( charitable_get_helper( 'licenses' )->get_products() as $key => $product ) {
116 - $fields[ $key ] = array(
117 - 'type' => 'text',
118 - 'render' => false,
119 - 'priority' => 206,
120 - );
121 - }
122 -
123 145 }
124 146
125 147 /**
126 148 * Add the licenses group.
@@ -146,11 +168,15 @@
146 168 charitable_admin_view( 'settings/licenses' );
147 169 }
148 170
149 171 /**
150 - * Removes select options that might be causing trouble or unwanted notices, mostly items that we done pre-1.7.0.
172 + * Removes select options that might be causing trouble or unwanted notices, mostly items that we done pre-1.7.0. Also known as 'clear cache' or 'clearing cache'.
151 173 *
152 174 * @since 1.7.0.7
175 + * @version 1.8.1.12 Added expiringlicense and expiredlicense.
176 + * @version 1.8.3 Added charitable_notifications.
177 + * @version 1.8.3.1 Added charitable_cache_cleared.
178 + * @version 1.8.6 Added charitable_splash_version.
153 179 *
154 180 * @param mixed[] $values The parsed values combining old values & new values.
155 181 * @param mixed[] $new_values The newly submitted values.
156 182 * @return mixed[]
@@ -162,15 +188,69 @@
162 188 return $values;
163 189 }
164 190
165 191 // Remove the options.
166 - delete_option( 'charitable_doing_upgrade', false );
192 + delete_option( 'charitable_doing_upgrade' );
193 + delete_option( 'charitable_third_party_warnings' );
194 + delete_option( 'charitable_campaign_builder_templates' ); // v1.8.0.
195 + delete_option( 'charitable_growth_tool_notices' ); // v1.8.1.6.
196 + delete_option( 'charitable_lite_settings_upgrade' );
197 + delete_option( 'charitable_lite_reports_upgrade' );
198 + delete_option( 'charitable_builder_onboarding' ); // v1.8.1.12.
199 + delete_option( 'charitable_onboarding_checklist' ); // v1.8.2.
200 + delete_option( 'charitable_notifications' ); // v1.8.3.
201 + delete_option( 'charitable_usage_tracking_last_checkin' ); // v1.8.4.
202 + delete_option( 'charitable_tracking_last_checkin' ); // v1.8.4.
203 + delete_option( 'charitable_telemetry_send_failures' ); // v1.8.12.
204 + delete_option( 'charitable_splash_version' ); // v1.8.6.
167 205
206 + // Delete transients (related to notices).
207 + $notice_slugs = array( 'campaign-builder', 'dashboard-reporting', 'five-star-review', 'expiringlicense', 'expiredlicense' );
208 + foreach ( $notice_slugs as $slug ) {
209 + delete_transient( 'charitable_' . $slug . '_banner' );
210 + }
211 +
212 + // Delete transients (related to dashboard).
213 + delete_transient( 'wpch_dashboard_data_args' ); // v1.8.1.
214 +
215 + // Delete transients (related to notices).
216 + delete_transient( 'charitable_dashboard_notices' ); // v1.8.1.6.
217 +
218 + // Delete transients (related to security checks and logs).
219 + delete_transient( 'charitable_donation_security_checks' ); // v1.8.1.6.
220 +
221 + // Delete transients (related to notifications).
222 + delete_transient( 'charitable_autoshow_plugin_notifications' ); // v1.8.3.
223 +
224 + // Delete transients (related to plugin versions).
225 + delete_transient( '_charitable_plugin_versions' ); // v1.8.6.2.
226 +
227 + // Delete all transients whose names start with "charitable-report".
228 + charitable_delete_transients_from_keys( charitable_search_database_for_transients_by_prefix( 'charitable-report', '-' ) );
229 +
230 + // Delete settings stored in user meta.
231 + $user_meta_keys = array( 'charitable-pointer-slug-dismissed', 'charitable_dismissed_addons' ); // v1.8.1.5.
232 + foreach ( $user_meta_keys as $meta_key ) {
233 + delete_metadata( 'user', 0, $meta_key, '', true );
234 + }
235 +
236 + // Licenses info, added in v1.8.1.6.
237 + delete_site_option( 'wpc_plugin_versions' );
238 + wp_cache_delete( 'plugin_versions', 'charitable' ); // Depreciated item.
239 + $empty_transient = new \stdClass();
240 + set_site_transient( 'update_plugins', $empty_transient ); // Depreciated item.
241 +
242 + // Clear Stripe webhook failure counter so stale notices don't persist after fixing the root cause.
243 + delete_transient( 'charitable_stripe_webhook_verification_failures' );
244 +
168 245 // Allow an addon to hook into this.
169 - do_action( 'charitable_clear_expired_options' );
246 + do_action( 'charitable_after_clear_expired_options' );
170 247
171 248 charitable_get_admin_notices()->add_notice( 'Charitable cache has been cleared.', 'success', false, true );
172 249
250 + // Document when the cache was cleared last.
251 + update_option( 'charitable_cache_cleared', time() );
252 +
173 253 $values['clear_expire_options'] = false;
174 254
175 255 return $values;
176 256 }
@@ -175,11 +255,126 @@
175 255 return $values;
176 256 }
177 257
178 258 /**
259 + * Removes activity tables - "clears" them but also allows Charitable to turn around and reinstall them.
260 + *
261 + * @since 1.8.1
262 + *
263 + * @param mixed[] $values The parsed values combining old values & new values.
264 + * @param mixed[] $new_values The newly submitted values.
265 + * @return mixed[]
266 + */
267 + public function clear_activity_database( $values, $new_values ) {
268 +
269 + /* If this option isn't in the return values or isn't checked off, leave. */
270 + if ( ! isset( $new_values['clear_activity_database'] ) || '' === trim( $new_values['clear_activity_database'] ) ) {
271 + return $values;
272 + }
273 +
274 + switch ( sanitize_text_field( $new_values['clear_activity_database'] ) ) {
275 + case 'clear':
276 + // Check and see if method exists.
277 + if ( method_exists( charitable_get_table( 'donation_activities' ), 'clear_table' ) ) {
278 + charitable_get_table( 'donation_activities' )->clear_table();
279 + }
280 + if ( method_exists( charitable_get_table( 'campaign_activities' ), 'clear_table' ) ) {
281 + charitable_get_table( 'campaign_activities' )->clear_table();
282 + }
283 +
284 + // Allow an addon to hook into this.
285 + do_action( 'charitable_after_clear_activity_database' );
286 +
287 + charitable_get_admin_notices()->add_notice( 'Charitable activity have been cleared.', 'success', false, true );
288 +
289 + $values['clear_activity_database'] = false;
290 +
291 + break;
292 +
293 + case 'remove':
294 + // Check and see if method exists.
295 + if ( method_exists( charitable_get_table( 'donation_activities' ), 'remove_table' ) ) {
296 + charitable_get_table( 'donation_activities' )->remove_table();
297 + }
298 + if ( method_exists( charitable_get_table( 'campaign_activities' ), 'remove_table' ) ) {
299 + charitable_get_table( 'campaign_activities' )->remove_table();
300 + }
301 +
302 + // Remove the upgrade option.
303 + $ugprade_log_key = Charitable_Upgrade::get_instance()->get_upgrade_log_key();
304 + $log = get_option( $ugprade_log_key );
305 + if ( is_array( $log ) && array_key_exists( 'create_activity_tables', $log ) ) {
306 + unset( $log['create_activity_tables'] );
307 + update_option( $ugprade_log_key, $log );
308 + }
309 +
310 + // Allow an addon to hook into this.
311 + do_action( 'charitable_after_remove_activity_database' );
312 +
313 + charitable_get_admin_notices()->add_notice( 'Charitable activity tables have been removed.', 'success', false, true );
314 +
315 + $values['clear_activity_database'] = false;
316 +
317 + break;
318 +
319 + default:
320 + // do nothing.
321 + break;
322 + }
323 +
324 + return $values;
325 + }
326 +
327 + /**
328 + * Enable or disable minification.
329 + *
330 + * @since 1.8.1.9
331 + *
332 + * @param mixed[] $values The parsed values combining old values & new values.
333 + * @param mixed[] $new_values The newly submitted values.
334 + * @return mixed[]
335 + */
336 + public function minification_settings( $values, $new_values ) {
337 +
338 + /* If this option isn't in the return values or isn't checked off, leave. */
339 + if ( ! isset( $new_values['script_minification'] ) || '' === trim( $new_values['script_minification'] ) ) {
340 + return $values;
341 + }
342 +
343 + switch ( sanitize_text_field( $new_values['script_minification'] ) ) {
344 + case 'enable':
345 + // Allow an addon to hook into this.
346 + do_action( 'charitable_after_enable_minification' );
347 +
348 + charitable_get_admin_notices()->add_notice( 'Charitable minification has been enabled.', 'success', false, true );
349 +
350 + $values['script_minification'] = 'scripts-enabled';
351 +
352 + break;
353 +
354 + case 'disable':
355 + // Allow an addon to hook into this.
356 + do_action( 'charitable_after_disable_minification' );
357 +
358 + charitable_get_admin_notices()->add_notice( 'Charitable minification has been disabled.', 'success', false, true );
359 +
360 + $values['script_minification'] = 'scripts-disabled';
361 +
362 + break;
363 +
364 + default:
365 + // do nothing.
366 + break;
367 + }
368 +
369 + return $values;
370 + }
371 +
372 + /**
179 373 * Checks for updated license and invalidates status field if not set.
180 374 *
181 375 * @since 1.0.0
376 + * @version 1.8.6.2 - clear transient _charitable_plugin_versions
182 377 *
183 378 * @param mixed[] $values The parsed values combining old values & new values.
184 379 * @param mixed[] $new_values The newly submitted values.
185 380 * @return mixed[]
@@ -189,11 +384,14 @@
189 384 if ( ! isset( $new_values['licenses'] ) ) {
190 385 return $values;
191 386 }
192 387
193 - $re_check = array_key_exists( 'recheck', $_POST );
388 + $re_check = array_key_exists( 'recheck', $_POST ); // phpcs:ignore
194 389 $licenses = $new_values['licenses'];
195 390
391 + // Delete transients (related to plugin versions).
392 + delete_transient( '_charitable_plugin_versions' );
393 +
196 394 foreach ( $licenses as $product_key => $license ) {
197 395 $license = trim( $license );
198 396
199 397 if ( empty( $license ) ) {
@@ -212,9 +410,34 @@
212 410
213 411 return $values;
214 412 }
215 413
414 + /**
415 + * Enables/disables usage tracking, used for testing and debugging.
416 + *
417 + * @since 1.8.4
418 + *
419 + * @param mixed[] $values The parsed values combining old values & new values.
420 + * @param mixed[] $new_values The newly submitted values.
421 + */
422 + public function update_user_tracking_option( $values, $new_values ) {
216 423
424 + /* If this option isn't in the return values or isn't checked off then the user has opted out, leave. */
425 + if ( ! isset( $new_values['charitable_usage_tracking'] ) || 0 === intval( $new_values['charitable_usage_tracking'] ) || '' === trim( $new_values['charitable_usage_tracking'] ) ) {
426 + // remove the option.
427 + $values['charitable_usage_tracking'] = false;
428 + delete_option( 'charitable_usage_tracking' );
429 + } else {
430 + // add the option.
431 + $values['charitable_usage_tracking'] = true;
432 + update_option( 'charitable_usage_tracking', 1 );
433 + // Send initial usage information just once (after that scheduled), now that we have permission.
434 + if ( class_exists( 'Charitable_Tracking' ) ) {
435 + Charitable_Tracking::get_instance()->send_checkins( false, true );
436 + }
437 + }
217 438
439 + return $values;
440 + }
218 441 }
219 442
220 443 endif;