PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.0.5
GiveWP – Donation Plugin and Fundraising Platform v2.0.5
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 / upgrades / upgrade-functions.php
give / includes / admin / upgrades Last commit date
views 8 years ago class-give-updates.php 8 years ago upgrade-functions.php 8 years ago
upgrade-functions.php
2610 lines
1 <?php
2 /**
3 * Upgrade Functions
4 *
5 * @package Give
6 * @subpackage Admin/Upgrades
7 * @copyright Copyright (c) 2016, WordImpress
8 * @license https://opensource.org/licenses/gpl-license GNU Public License
9 * @since 1.0
10 *
11 * NOTICE: When adding new upgrade notices, please be sure to put the action into the upgrades array during install:
12 * /includes/install.php @ Appox Line 156
13 */
14
15 // Exit if accessed directly.
16 if ( ! defined( 'ABSPATH' ) ) {
17 exit;
18 }
19
20 /**
21 * Perform automatic database upgrades when necessary.
22 *
23 * @since 1.6
24 * @return void
25 */
26 function give_do_automatic_upgrades() {
27 $did_upgrade = false;
28 $give_version = preg_replace( '/[^0-9.].*/', '', get_option( 'give_version' ) );
29
30 if ( ! $give_version ) {
31 // 1.0 is the first version to use this option so we must add it.
32 $give_version = '1.0';
33 }
34
35 switch ( true ) {
36
37 case version_compare( $give_version, '1.6', '<' ) :
38 give_v16_upgrades();
39 $did_upgrade = true;
40
41 case version_compare( $give_version, '1.7', '<' ) :
42 give_v17_upgrades();
43 $did_upgrade = true;
44
45 case version_compare( $give_version, '1.8', '<' ) :
46 give_v18_upgrades();
47 $did_upgrade = true;
48
49 case version_compare( $give_version, '1.8.7', '<' ) :
50 give_v187_upgrades();
51 $did_upgrade = true;
52
53 case version_compare( $give_version, '1.8.8', '<' ) :
54 give_v188_upgrades();
55 $did_upgrade = true;
56
57 case version_compare( $give_version, '1.8.9', '<' ) :
58 give_v189_upgrades();
59 $did_upgrade = true;
60
61 case version_compare( $give_version, '1.8.12', '<' ) :
62 give_v1812_upgrades();
63 $did_upgrade = true;
64
65 case version_compare( $give_version, '1.8.13', '<' ) :
66 give_v1813_upgrades();
67 $did_upgrade = true;
68
69 case version_compare( $give_version, '1.8.17', '<' ) :
70 give_v1817_upgrades();
71 $did_upgrade = true;
72
73 case version_compare( $give_version, '1.8.18', '<' ) :
74 give_v1818_upgrades();
75 $did_upgrade = true;
76
77 case version_compare( $give_version, '2.0', '<' ) :
78 give_v20_upgrades();
79 $did_upgrade = true;
80
81 case version_compare( $give_version, '2.0.1', '<' ) :
82 // Do nothing on fresh install.
83 if ( ! doing_action( 'give_upgrades' ) ) {
84 give_v201_create_tables();
85 Give_Updates::get_instance()->__health_background_update( Give_Updates::get_instance() );
86 Give_Updates::$background_updater->dispatch();
87 }
88
89 $did_upgrade = true;
90
91 case version_compare( $give_version, '2.0.2', '<' ) :
92 // Remove 2.0.1 update to rerun on 2.0.2
93 $completed_upgrades = give_get_completed_upgrades();
94 $v201_updates = array(
95 'v201_upgrades_payment_metadata',
96 'v201_add_missing_donors',
97 'v201_move_metadata_into_new_table',
98 'v201_logs_upgrades',
99 );
100
101 foreach ( $v201_updates as $v201_update ) {
102 if ( in_array( $v201_update, $completed_upgrades ) ) {
103 unset( $completed_upgrades[ array_search( $v201_update, $completed_upgrades ) ] );
104 }
105 }
106
107 update_option( 'give_completed_upgrades', $completed_upgrades );
108
109 // Do nothing on fresh install.
110 if ( ! doing_action( 'give_upgrades' ) ) {
111 give_v201_create_tables();
112 Give_Updates::get_instance()->__health_background_update( Give_Updates::get_instance() );
113 Give_Updates::$background_updater->dispatch();
114 }
115
116 $did_upgrade = true;
117
118 case version_compare( $give_version, '2.0.3', '<' ) :
119 give_v203_upgrades();
120 $did_upgrade = true;
121 }
122
123 if ( $did_upgrade ) {
124 update_option( 'give_version', preg_replace( '/[^0-9.].*/', '', GIVE_VERSION ) );
125 }
126 }
127
128 add_action( 'admin_init', 'give_do_automatic_upgrades' );
129 add_action( 'give_upgrades', 'give_do_automatic_upgrades' );
130
131 /**
132 * Display Upgrade Notices.
133 *
134 * IMPORTANT: ALSO UPDATE INSTALL.PHP WITH THE ID OF THE UPGRADE ROUTINE SO IT DOES NOT AFFECT NEW INSTALLS.
135 *
136 * @since 1.0
137 * @since 1.8.12 Update new update process code.
138 *
139 * @param Give_Updates $give_updates
140 *
141 * @return void
142 */
143 function give_show_upgrade_notices( $give_updates ) {
144 // v1.3.2 Upgrades
145 $give_updates->register(
146 array(
147 'id' => 'upgrade_give_payment_customer_id',
148 'version' => '1.3.2',
149 'callback' => 'give_v132_upgrade_give_payment_customer_id',
150 )
151 );
152
153 // v1.3.4 Upgrades ensure the user has gone through 1.3.4.
154 $give_updates->register(
155 array(
156 'id' => 'upgrade_give_offline_status',
157 'depend' => 'upgrade_give_payment_customer_id',
158 'version' => '1.3.4',
159 'callback' => 'give_v134_upgrade_give_offline_status',
160 )
161 );
162
163 // v1.8 form metadata upgrades.
164 $give_updates->register(
165 array(
166 'id' => 'v18_upgrades_form_metadata',
167 'version' => '1.8',
168 'callback' => 'give_v18_upgrades_form_metadata',
169 )
170 );
171
172 // v1.8.9 Upgrades
173 $give_updates->register(
174 array(
175 'id' => 'v189_upgrades_levels_post_meta',
176 'version' => '1.8.9',
177 'callback' => 'give_v189_upgrades_levels_post_meta_callback',
178 )
179 );
180
181 // v1.8.12 Upgrades
182 $give_updates->register(
183 array(
184 'id' => 'v1812_update_amount_values',
185 'version' => '1.8.12',
186 'callback' => 'give_v1812_update_amount_values_callback',
187 )
188 );
189
190 // v1.8.12 Upgrades
191 $give_updates->register(
192 array(
193 'id' => 'v1812_update_donor_purchase_values',
194 'version' => '1.8.12',
195 'callback' => 'give_v1812_update_donor_purchase_value_callback',
196 )
197 );
198
199 // v1.8.13 Upgrades for donor
200 $give_updates->register(
201 array(
202 'id' => 'v1813_update_donor_user_roles',
203 'version' => '1.8.13',
204 'callback' => 'give_v1813_update_donor_user_roles_callback',
205 )
206 );
207
208 // v1.8.17 Upgrades for donations.
209 $give_updates->register( array(
210 'id' => 'v1817_update_donation_iranian_currency_code',
211 'version' => '1.8.17',
212 'callback' => 'give_v1817_update_donation_iranian_currency_code',
213 ) );
214
215 // v1.8.17 Upgrades for cleanup of user roles.
216 $give_updates->register( array(
217 'id' => 'v1817_cleanup_user_roles',
218 'version' => '1.8.17',
219 'callback' => 'give_v1817_cleanup_user_roles',
220 ) );
221
222 // v1.8.18 Upgrades for assigning custom amount to existing set donations.
223 $give_updates->register( array(
224 'id' => 'v1818_assign_custom_amount_set_donation',
225 'version' => '1.8.18',
226 'callback' => 'give_v1818_assign_custom_amount_set_donation',
227 ) );
228
229 // v1.8.18 Cleanup the Give Worker Role Caps.
230 $give_updates->register( array(
231 'id' => 'v1818_give_worker_role_cleanup',
232 'version' => '1.8.18',
233 'callback' => 'give_v1818_give_worker_role_cleanup',
234 ) );
235
236 // v2.0.0 Upgrades
237 $give_updates->register(
238 array(
239 'id' => 'v20_upgrades_form_metadata',
240 'version' => '2.0.0',
241 'callback' => 'give_v20_upgrades_form_metadata_callback',
242 )
243 );
244
245 // v2.0.0 User Address Upgrades
246 $give_updates->register(
247 array(
248 'id' => 'v20_upgrades_user_address',
249 'version' => '2.0.0',
250 'callback' => 'give_v20_upgrades_user_address',
251 )
252 );
253
254 // v2.0.0 Upgrades
255 $give_updates->register(
256 array(
257 'id' => 'v20_upgrades_payment_metadata',
258 'version' => '2.0.0',
259 'callback' => 'give_v20_upgrades_payment_metadata_callback',
260 )
261 );
262
263 // v2.0.0 Upgrades
264 $give_updates->register(
265 array(
266 'id' => 'v20_logs_upgrades',
267 'version' => '2.0.0',
268 'callback' => 'give_v20_logs_upgrades_callback',
269
270 )
271 );
272
273 // v2.0.0 Donor Name Upgrades
274 $give_updates->register(
275 array(
276 'id' => 'v20_upgrades_donor_name',
277 'version' => '2.0.0',
278 'callback' => 'give_v20_upgrades_donor_name',
279 )
280 );
281
282 // v2.0.0 Upgrades
283 $give_updates->register(
284 array(
285 'id' => 'v20_move_metadata_into_new_table',
286 'version' => '2.0.0',
287 'callback' => 'give_v20_move_metadata_into_new_table_callback',
288 'depend' => array( 'v20_upgrades_payment_metadata', 'v20_upgrades_form_metadata' ),
289 )
290 );
291
292 // v2.0.0 Upgrades
293 $give_updates->register(
294 array(
295 'id' => 'v20_rename_donor_tables',
296 'version' => '2.0.0',
297 'callback' => 'give_v20_rename_donor_tables_callback',
298 'depend' => array(
299 'v20_move_metadata_into_new_table',
300 'v20_logs_upgrades',
301 'v20_upgrades_form_metadata',
302 'v20_upgrades_payment_metadata',
303 'v20_upgrades_user_address',
304 'v20_upgrades_donor_name',
305 ),
306 )
307 );
308
309
310 // v2.0.1 Upgrades
311 $give_updates->register(
312 array(
313 'id' => 'v201_upgrades_payment_metadata',
314 'version' => '2.0.1',
315 'callback' => 'give_v201_upgrades_payment_metadata_callback',
316 )
317 );
318
319 // v2.0.1 Upgrades
320 $give_updates->register(
321 array(
322 'id' => 'v201_add_missing_donors',
323 'version' => '2.0.1',
324 'callback' => 'give_v201_add_missing_donors_callback',
325 )
326 );
327
328 // Run v2.0.0 Upgrades again in 2.0.1
329 $give_updates->register(
330 array(
331 'id' => 'v201_move_metadata_into_new_table',
332 'version' => '2.0.1',
333 'callback' => 'give_v201_move_metadata_into_new_table_callback',
334 'depend' => array( 'v201_upgrades_payment_metadata', 'v201_add_missing_donors' ),
335 )
336 );
337
338 // Run v2.0.0 Upgrades again in 2.0.1
339 $give_updates->register(
340 array(
341 'id' => 'v201_logs_upgrades',
342 'version' => '2.0.1',
343 'callback' => 'give_v201_logs_upgrades_callback',
344
345 )
346 );
347 }
348
349 add_action( 'give_register_updates', 'give_show_upgrade_notices' );
350
351 /**
352 * Triggers all upgrade functions
353 *
354 * This function is usually triggered via AJAX
355 *
356 * @since 1.0
357 * @return void
358 */
359 function give_trigger_upgrades() {
360
361 if ( ! current_user_can( 'manage_give_settings' ) ) {
362 wp_die( esc_html__( 'You do not have permission to do Give upgrades.', 'give' ), esc_html__( 'Error', 'give' ), array(
363 'response' => 403,
364 ) );
365 }
366
367 $give_version = get_option( 'give_version' );
368
369 if ( ! $give_version ) {
370 // 1.0 is the first version to use this option so we must add it.
371 $give_version = '1.0';
372 add_option( 'give_version', $give_version );
373 }
374
375 update_option( 'give_version', GIVE_VERSION );
376 delete_option( 'give_doing_upgrade' );
377
378 if ( DOING_AJAX ) {
379 die( 'complete' );
380 } // End if().
381 }
382
383 add_action( 'wp_ajax_give_trigger_upgrades', 'give_trigger_upgrades' );
384
385
386 /**
387 * Upgrades the
388 *
389 * Standardizes the discrepancies between two metakeys `_give_payment_customer_id` and `_give_payment_donor_id`
390 *
391 * @since 1.3.2
392 */
393 function give_v132_upgrade_give_payment_customer_id() {
394 global $wpdb;
395
396 /* @var Give_Updates $give_updates */
397 $give_updates = Give_Updates::get_instance();
398
399 // UPDATE DB METAKEYS.
400 $sql = "UPDATE $wpdb->postmeta SET meta_key = '_give_payment_customer_id' WHERE meta_key = '_give_payment_donor_id'";
401 $query = $wpdb->query( $sql );
402
403 $give_updates->percentage = 100;
404 give_set_upgrade_complete( 'upgrade_give_payment_customer_id' );
405 }
406
407
408 /**
409 * Upgrades the Offline Status
410 *
411 * Reverses the issue where offline donations in "pending" status where inappropriately marked as abandoned
412 *
413 * @since 1.3.4
414 */
415 function give_v134_upgrade_give_offline_status() {
416 global $wpdb;
417
418 /* @var Give_Updates $give_updates */
419 $give_updates = Give_Updates::get_instance();
420
421 // Get abandoned offline payments.
422 $select = "SELECT ID FROM $wpdb->posts p ";
423 $join = "LEFT JOIN $wpdb->postmeta m ON p.ID = m.post_id ";
424 $where = "WHERE p.post_type = 'give_payment' ";
425 $where .= "AND ( p.post_status = 'abandoned' )";
426 $where .= "AND ( m.meta_key = '_give_payment_gateway' AND m.meta_value = 'offline' )";
427
428 $sql = $select . $join . $where;
429 $found_payments = $wpdb->get_col( $sql );
430
431 foreach ( $found_payments as $payment ) {
432
433 // Only change ones marked abandoned since our release last week because the admin may have marked some abandoned themselves.
434 $modified_time = get_post_modified_time( 'U', false, $payment );
435
436 // 1450124863 = 12/10/2015 20:42:25.
437 if ( $modified_time >= 1450124863 ) {
438
439 give_update_payment_status( $payment, 'pending' );
440
441 }
442 }
443
444 $give_updates->percentage = 100;
445 give_set_upgrade_complete( 'upgrade_give_offline_status' );
446 }
447
448
449 /**
450 * Cleanup User Roles
451 *
452 * This upgrade routine removes unused roles and roles with typos
453 *
454 * @since 1.5.2
455 */
456 function give_v152_cleanup_users() {
457
458 $give_version = get_option( 'give_version' );
459
460 if ( ! $give_version ) {
461 // 1.0 is the first version to use this option so we must add it.
462 $give_version = '1.0';
463 }
464
465 $give_version = preg_replace( '/[^0-9.].*/', '', $give_version );
466
467 // v1.5.2 Upgrades
468 if ( version_compare( $give_version, '1.5.2', '<' ) || ! give_has_upgrade_completed( 'upgrade_give_user_caps_cleanup' ) ) {
469
470 // Delete all caps with "ss".
471 // Also delete all unused "campaign" roles.
472 $delete_caps = array(
473 'delete_give_formss',
474 'delete_others_give_formss',
475 'delete_private_give_formss',
476 'delete_published_give_formss',
477 'read_private_forms',
478 'edit_give_formss',
479 'edit_others_give_formss',
480 'edit_private_give_formss',
481 'edit_published_give_formss',
482 'publish_give_formss',
483 'read_private_give_formss',
484 'assign_give_campaigns_terms',
485 'delete_give_campaigns',
486 'delete_give_campaigns_terms',
487 'delete_give_campaignss',
488 'delete_others_give_campaignss',
489 'delete_private_give_campaignss',
490 'delete_published_give_campaignss',
491 'edit_give_campaigns',
492 'edit_give_campaigns_terms',
493 'edit_give_campaignss',
494 'edit_others_give_campaignss',
495 'edit_private_give_campaignss',
496 'edit_published_give_campaignss',
497 'manage_give_campaigns_terms',
498 'publish_give_campaignss',
499 'read_give_campaigns',
500 'read_private_give_campaignss',
501 'view_give_campaigns_stats',
502 'delete_give_paymentss',
503 'delete_others_give_paymentss',
504 'delete_private_give_paymentss',
505 'delete_published_give_paymentss',
506 'edit_give_paymentss',
507 'edit_others_give_paymentss',
508 'edit_private_give_paymentss',
509 'edit_published_give_paymentss',
510 'publish_give_paymentss',
511 'read_private_give_paymentss',
512 );
513
514 global $wp_roles;
515 foreach ( $delete_caps as $cap ) {
516 foreach ( array_keys( $wp_roles->roles ) as $role ) {
517 $wp_roles->remove_cap( $role, $cap );
518 }
519 }
520
521 // Create Give plugin roles.
522 $roles = new Give_Roles();
523 $roles->add_roles();
524 $roles->add_caps();
525
526 // The Update Ran.
527 update_option( 'give_version', preg_replace( '/[^0-9.].*/', '', GIVE_VERSION ) );
528 give_set_upgrade_complete( 'upgrade_give_user_caps_cleanup' );
529 delete_option( 'give_doing_upgrade' );
530
531 }// End if().
532
533 }
534
535 add_action( 'admin_init', 'give_v152_cleanup_users' );
536
537 /**
538 * 1.6 Upgrade routine to create the customer meta table.
539 *
540 * @since 1.6
541 * @return void
542 */
543 function give_v16_upgrades() {
544 // Create the donor databases.
545 $donors_db = new Give_DB_Donors();
546 $donors_db->create_table();
547 $donor_meta = new Give_DB_Donor_Meta();
548 $donor_meta->create_table();
549 }
550
551 /**
552 * 1.7 Upgrades.
553 *
554 * a. Update license api data for plugin addons.
555 * b. Cleanup user roles.
556 *
557 * @since 1.7
558 * @return void
559 */
560 function give_v17_upgrades() {
561 // Upgrade license data.
562 give_v17_upgrade_addon_license_data();
563 give_v17_cleanup_roles();
564 }
565
566 /**
567 * Upgrade license data
568 *
569 * @since 1.7
570 */
571 function give_v17_upgrade_addon_license_data() {
572 $give_options = give_get_settings();
573
574 $api_url = 'https://givewp.com/give-sl-api/';
575
576 // Get addons license key.
577 $addons = array();
578 foreach ( $give_options as $key => $value ) {
579 if ( false !== strpos( $key, '_license_key' ) ) {
580 $addons[ $key ] = $value;
581 }
582 }
583
584 // Bailout: We do not have any addon license data to upgrade.
585 if ( empty( $addons ) ) {
586 return false;
587 }
588
589 foreach ( $addons as $key => $addon_license ) {
590
591 // Get addon shortname.
592 $shortname = str_replace( '_license_key', '', $key );
593
594 // Addon license option name.
595 $addon_license_option_name = $shortname . '_license_active';
596
597 // bailout if license is empty.
598 if ( empty( $addon_license ) ) {
599 delete_option( $addon_license_option_name );
600 continue;
601 }
602
603 // Get addon name.
604 $addon_name = array();
605 $addon_name_parts = explode( '_', str_replace( 'give_', '', $shortname ) );
606 foreach ( $addon_name_parts as $name_part ) {
607
608 // Fix addon name
609 switch ( $name_part ) {
610 case 'authorizenet' :
611 $name_part = 'authorize.net';
612 break;
613 }
614
615 $addon_name[] = ucfirst( $name_part );
616 }
617
618 $addon_name = implode( ' ', $addon_name );
619
620 // Data to send to the API.
621 $api_params = array(
622 'edd_action' => 'activate_license', // never change from "edd_" to "give_"!
623 'license' => $addon_license,
624 'item_name' => urlencode( $addon_name ),
625 'url' => home_url(),
626 );
627
628 // Call the API.
629 $response = wp_remote_post(
630 $api_url,
631 array(
632 'timeout' => 15,
633 'sslverify' => false,
634 'body' => $api_params,
635 )
636 );
637
638 // Make sure there are no errors.
639 if ( is_wp_error( $response ) ) {
640 delete_option( $addon_license_option_name );
641 continue;
642 }
643
644 // Tell WordPress to look for updates.
645 set_site_transient( 'update_plugins', null );
646
647 // Decode license data.
648 $license_data = json_decode( wp_remote_retrieve_body( $response ) );
649 update_option( $addon_license_option_name, $license_data );
650 }// End foreach().
651 }
652
653
654 /**
655 * Cleanup User Roles.
656 *
657 * This upgrade routine removes unused roles and roles with typos.
658 *
659 * @since 1.7
660 */
661 function give_v17_cleanup_roles() {
662
663 // Delete all caps with "_give_forms_" and "_give_payments_".
664 // These roles have no usage; the proper is singular.
665 $delete_caps = array(
666 'view_give_forms_stats',
667 'delete_give_forms_terms',
668 'assign_give_forms_terms',
669 'edit_give_forms_terms',
670 'manage_give_forms_terms',
671 'view_give_payments_stats',
672 'manage_give_payments_terms',
673 'edit_give_payments_terms',
674 'assign_give_payments_terms',
675 'delete_give_payments_terms',
676 );
677
678 global $wp_roles;
679 foreach ( $delete_caps as $cap ) {
680 foreach ( array_keys( $wp_roles->roles ) as $role ) {
681 $wp_roles->remove_cap( $role, $cap );
682 }
683 }
684
685 // Set roles again.
686 $roles = new Give_Roles();
687 $roles->add_roles();
688 $roles->add_caps();
689
690 }
691
692 /**
693 * 1.8 Upgrades.
694 *
695 * a. Upgrade checkbox settings to radio button settings.
696 * a. Update form meta for new metabox settings.
697 *
698 * @since 1.8
699 * @return void
700 */
701 function give_v18_upgrades() {
702 // Upgrade checkbox settings to radio button settings.
703 give_v18_upgrades_core_setting();
704 }
705
706 /**
707 * Upgrade core settings.
708 *
709 * @since 1.8
710 * @return void
711 */
712 function give_v18_upgrades_core_setting() {
713 // Core settings which changes from checkbox to radio.
714 $core_setting_names = array_merge(
715 array_keys( give_v18_renamed_core_settings() ),
716 array(
717 'uninstall_on_delete',
718 'scripts_footer',
719 'test_mode',
720 'email_access',
721 'terms',
722 'give_offline_donation_enable_billing_fields',
723 )
724 );
725
726 // Bailout: If not any setting define.
727 if ( $give_settings = get_option( 'give_settings' ) ) {
728
729 $setting_changed = false;
730
731 // Loop: check each setting field.
732 foreach ( $core_setting_names as $setting_name ) {
733 // New setting name.
734 $new_setting_name = preg_replace( '/^(enable_|disable_)/', '', $setting_name );
735
736 // Continue: If setting already set.
737 if (
738 array_key_exists( $new_setting_name, $give_settings )
739 && in_array( $give_settings[ $new_setting_name ], array( 'enabled', 'disabled' ) )
740 ) {
741 continue;
742 }
743
744 // Set checkbox value to radio value.
745 $give_settings[ $setting_name ] = ( ! empty( $give_settings[ $setting_name ] ) && 'on' === $give_settings[ $setting_name ] ? 'enabled' : 'disabled' );
746
747 // @see https://github.com/WordImpress/Give/issues/1063.
748 if ( false !== strpos( $setting_name, 'disable_' ) ) {
749
750 $give_settings[ $new_setting_name ] = ( give_is_setting_enabled( $give_settings[ $setting_name ] ) ? 'disabled' : 'enabled' );
751 } elseif ( false !== strpos( $setting_name, 'enable_' ) ) {
752
753 $give_settings[ $new_setting_name ] = ( give_is_setting_enabled( $give_settings[ $setting_name ] ) ? 'enabled' : 'disabled' );
754 }
755
756 // Tell bot to update core setting to db.
757 if ( ! $setting_changed ) {
758 $setting_changed = true;
759 }
760 }
761
762 // Update setting only if they changed.
763 if ( $setting_changed ) {
764 update_option( 'give_settings', $give_settings );
765 }
766 }// End if().
767
768 give_set_upgrade_complete( 'v18_upgrades_core_setting' );
769 }
770
771 /**
772 * Upgrade form metadata for new metabox settings.
773 *
774 * @since 1.8
775 * @return void
776 */
777 function give_v18_upgrades_form_metadata() {
778 /* @var Give_Updates $give_updates */
779 $give_updates = Give_Updates::get_instance();
780
781 // form query
782 $forms = new WP_Query( array(
783 'paged' => $give_updates->step,
784 'status' => 'any',
785 'order' => 'ASC',
786 'post_type' => 'give_forms',
787 'posts_per_page' => 20,
788 )
789 );
790
791 if ( $forms->have_posts() ) {
792 $give_updates->set_percentage( $forms->found_posts, ( $give_updates->step * 20 ) );
793
794 while ( $forms->have_posts() ) {
795 $forms->the_post();
796
797 // Form content.
798 // Note in version 1.8 display content setting split into display content and content placement setting.
799 // You can delete _give_content_option in future.
800 $show_content = give_get_meta( get_the_ID(), '_give_content_option', true );
801 if ( $show_content && ! give_get_meta( get_the_ID(), '_give_display_content', true ) ) {
802 $field_value = ( 'none' !== $show_content ? 'enabled' : 'disabled' );
803 give_update_meta( get_the_ID(), '_give_display_content', $field_value );
804
805 $field_value = ( 'none' !== $show_content ? $show_content : 'give_pre_form' );
806 give_update_meta( get_the_ID(), '_give_content_placement', $field_value );
807 }
808
809 // "Disable" Guest Donation. Checkbox.
810 // See: https://github.com/WordImpress/Give/issues/1470.
811 $guest_donation = give_get_meta( get_the_ID(), '_give_logged_in_only', true );
812 $guest_donation_newval = ( in_array( $guest_donation, array( 'yes', 'on' ) ) ? 'disabled' : 'enabled' );
813 give_update_meta( get_the_ID(), '_give_logged_in_only', $guest_donation_newval );
814
815 // Offline Donations.
816 // See: https://github.com/WordImpress/Give/issues/1579.
817 $offline_donation = give_get_meta( get_the_ID(), '_give_customize_offline_donations', true );
818 if ( 'no' === $offline_donation ) {
819 $offline_donation_newval = 'global';
820 } elseif ( 'yes' === $offline_donation ) {
821 $offline_donation_newval = 'enabled';
822 } else {
823 $offline_donation_newval = 'disabled';
824 }
825 give_update_meta( get_the_ID(), '_give_customize_offline_donations', $offline_donation_newval );
826
827 // Convert yes/no setting field to enabled/disabled.
828 $form_radio_settings = array(
829 // Custom Amount.
830 '_give_custom_amount',
831
832 // Donation Gaol.
833 '_give_goal_option',
834
835 // Close Form.
836 '_give_close_form_when_goal_achieved',
837
838 // Term & conditions.
839 '_give_terms_option',
840
841 // Billing fields.
842 '_give_offline_donation_enable_billing_fields_single',
843 );
844
845 foreach ( $form_radio_settings as $meta_key ) {
846 // Get value.
847 $field_value = give_get_meta( get_the_ID(), $meta_key, true );
848
849 // Convert meta value only if it is in yes/no/none.
850 if ( in_array( $field_value, array( 'yes', 'on', 'no', 'none' ) ) ) {
851
852 $field_value = ( in_array( $field_value, array( 'yes', 'on' ) ) ? 'enabled' : 'disabled' );
853 give_update_meta( get_the_ID(), $meta_key, $field_value );
854 }
855 }
856 }// End while().
857
858 wp_reset_postdata();
859
860 } else {
861 // No more forms found, finish up.
862 give_set_upgrade_complete( 'v18_upgrades_form_metadata' );
863 }
864 }
865
866
867 /**
868 * Get list of core setting renamed in version 1.8.
869 *
870 * @since 1.8
871 * @return array
872 */
873 function give_v18_renamed_core_settings() {
874 return array(
875 'disable_paypal_verification' => 'paypal_verification',
876 'disable_css' => 'css',
877 'disable_welcome' => 'welcome',
878 'disable_forms_singular' => 'forms_singular',
879 'disable_forms_archives' => 'forms_archives',
880 'disable_forms_excerpt' => 'forms_excerpt',
881 'disable_form_featured_img' => 'form_featured_img',
882 'disable_form_sidebar' => 'form_sidebar',
883 'disable_admin_notices' => 'admin_notices',
884 'disable_the_content_filter' => 'the_content_filter',
885 'enable_floatlabels' => 'floatlabels',
886 'enable_categories' => 'categories',
887 'enable_tags' => 'tags',
888 );
889 }
890
891
892 /**
893 * Upgrade core settings.
894 *
895 * @since 1.8.7
896 * @return void
897 */
898 function give_v187_upgrades() {
899 global $wpdb;
900
901 /**
902 * Upgrade 1: Remove stat and cache transients.
903 */
904 $cached_options = $wpdb->get_col(
905 $wpdb->prepare(
906 "
907 SELECT *
908 FROM {$wpdb->options}
909 WHERE (
910 option_name LIKE %s
911 OR option_name LIKE %s
912 OR option_name LIKE %s
913 OR option_name LIKE %s
914 OR option_name LIKE %s
915 OR option_name LIKE %s
916 OR option_name LIKE %s
917 OR option_name LIKE %s
918 OR option_name LIKE %s
919 OR option_name LIKE %s
920 OR option_name LIKE %s
921 OR option_name LIKE %s
922 OR option_name LIKE %s
923 )
924 ",
925 array(
926 '%_transient_give_stats_%',
927 'give_cache%',
928 '%_transient_give_add_ons_feed%',
929 '%_transient__give_ajax_works' .
930 '%_transient_give_total_api_keys%',
931 '%_transient_give_i18n_give_promo_hide%',
932 '%_transient_give_contributors%',
933 '%_transient_give_estimated_monthly_stats%',
934 '%_transient_give_earnings_total%',
935 '%_transient_give_i18n_give_%',
936 '%_transient__give_installed%',
937 '%_transient__give_activation_redirect%',
938 '%_transient__give_hide_license_notices_shortly_%',
939 '%give_income_total%',
940 )
941 ),
942 1
943 );
944
945 // User related transients.
946 $user_apikey_options = $wpdb->get_results(
947 $wpdb->prepare(
948 "SELECT user_id, meta_key
949 FROM $wpdb->usermeta
950 WHERE meta_value=%s",
951 'give_user_public_key'
952 ),
953 ARRAY_A
954 );
955
956 if ( ! empty( $user_apikey_options ) ) {
957 foreach ( $user_apikey_options as $user ) {
958 $cached_options[] = '_transient_' . md5( 'give_api_user_' . $user['meta_key'] );
959 $cached_options[] = '_transient_' . md5( 'give_api_user_public_key' . $user['user_id'] );
960 $cached_options[] = '_transient_' . md5( 'give_api_user_secret_key' . $user['user_id'] );
961 }
962 }
963
964 if ( ! empty( $cached_options ) ) {
965 foreach ( $cached_options as $option ) {
966 switch ( true ) {
967 case ( false !== strpos( $option, 'transient' ) ):
968 $option = str_replace( '_transient_', '', $option );
969 delete_transient( $option );
970 break;
971
972 default:
973 delete_option( $option );
974 }
975 }
976 }
977 }
978
979 /**
980 * Update Capabilities for Give_Worker User Role.
981 *
982 * This upgrade routine will update access rights for Give_Worker User Role.
983 *
984 * @since 1.8.8
985 */
986 function give_v188_upgrades() {
987
988 global $wp_roles;
989
990 // Get the role object.
991 $give_worker = get_role( 'give_worker' );
992
993 // A list of capabilities to add for give workers.
994 $caps_to_add = array(
995 'edit_posts',
996 'edit_pages',
997 );
998
999 foreach ( $caps_to_add as $cap ) {
1000 // Add the capability.
1001 $give_worker->add_cap( $cap );
1002 }
1003
1004 }
1005
1006 /**
1007 * Update Post meta for minimum and maximum amount for multi level donation forms
1008 *
1009 * This upgrade routine adds post meta for give_forms CPT for multi level donation form.
1010 *
1011 * @since 1.8.9
1012 */
1013 function give_v189_upgrades_levels_post_meta_callback() {
1014 /* @var Give_Updates $give_updates */
1015 $give_updates = Give_Updates::get_instance();
1016
1017 // form query.
1018 $donation_forms = new WP_Query( array(
1019 'paged' => $give_updates->step,
1020 'status' => 'any',
1021 'order' => 'ASC',
1022 'post_type' => 'give_forms',
1023 'posts_per_page' => 20,
1024 )
1025 );
1026
1027 if ( $donation_forms->have_posts() ) {
1028 $give_updates->set_percentage( $donation_forms->found_posts, ( $give_updates->step * 20 ) );
1029
1030 while ( $donation_forms->have_posts() ) {
1031 $donation_forms->the_post();
1032 $form_id = get_the_ID();
1033
1034 // Remove formatting from _give_set_price.
1035 update_post_meta(
1036 $form_id,
1037 '_give_set_price',
1038 give_sanitize_amount( get_post_meta( $form_id, '_give_set_price', true ) )
1039 );
1040
1041 // Remove formatting from _give_custom_amount_minimum.
1042 update_post_meta(
1043 $form_id,
1044 '_give_custom_amount_minimum',
1045 give_sanitize_amount( get_post_meta( $form_id, '_give_custom_amount_minimum', true ) )
1046 );
1047
1048 // Bailout.
1049 if ( 'set' === get_post_meta( $form_id, '_give_price_option', true ) ) {
1050 continue;
1051 }
1052
1053 $donation_levels = get_post_meta( $form_id, '_give_donation_levels', true );
1054
1055 if ( ! empty( $donation_levels ) ) {
1056
1057 foreach ( $donation_levels as $index => $donation_level ) {
1058 if ( isset( $donation_level['_give_amount'] ) ) {
1059 $donation_levels[ $index ]['_give_amount'] = give_sanitize_amount( $donation_level['_give_amount'] );
1060 }
1061 }
1062
1063 update_post_meta( $form_id, '_give_donation_levels', $donation_levels );
1064
1065 $donation_levels_amounts = wp_list_pluck( $donation_levels, '_give_amount' );
1066
1067 $min_amount = min( $donation_levels_amounts );
1068 $max_amount = max( $donation_levels_amounts );
1069
1070 // Set Minimum and Maximum amount for Multi Level Donation Forms
1071 give_update_meta( $form_id, '_give_levels_minimum_amount', $min_amount ? give_sanitize_amount( $min_amount ) : 0 );
1072 give_update_meta( $form_id, '_give_levels_maximum_amount', $max_amount ? give_sanitize_amount( $max_amount ) : 0 );
1073 }
1074
1075 }
1076
1077 /* Restore original Post Data */
1078 wp_reset_postdata();
1079 } else {
1080 // The Update Ran.
1081 give_set_upgrade_complete( 'v189_upgrades_levels_post_meta' );
1082 }
1083
1084 }
1085
1086
1087 /**
1088 * Give version 1.8.9 upgrades
1089 *
1090 * @since 1.8.9
1091 */
1092 function give_v189_upgrades() {
1093 /**
1094 * 1. Remove user license related notice show blocked ( Give_Notice will handle )
1095 */
1096 global $wpdb;
1097
1098 // Delete permanent notice blocker.
1099 $wpdb->query(
1100 $wpdb->prepare(
1101 "
1102 DELETE FROM $wpdb->usermeta
1103 WHERE meta_key
1104 LIKE '%%%s%%'
1105 ",
1106 '_give_hide_license_notices_permanently'
1107 )
1108 );
1109
1110 // Delete short notice blocker.
1111 $wpdb->query(
1112 $wpdb->prepare(
1113 "
1114 DELETE FROM $wpdb->options
1115 WHERE option_name
1116 LIKE '%%%s%%'
1117 ",
1118 '__give_hide_license_notices_shortly_'
1119 )
1120 );
1121 }
1122
1123 /**
1124 * 2.0 Upgrades.
1125 *
1126 * @since 2.0
1127 * @return void
1128 */
1129 function give_v20_upgrades() {
1130 // Update cache setting.
1131 give_update_option( 'cache', 'enabled' );
1132
1133 // Upgrade email settings.
1134 give_v20_upgrades_email_setting();
1135 }
1136
1137 /**
1138 * Move old email api settings to new email setting api for following emails:
1139 * 1. new offline donation [This was hard coded]
1140 * 2. offline donation instruction
1141 * 3. new donation
1142 * 4. donation receipt
1143 *
1144 * @since 2.0
1145 */
1146 function give_v20_upgrades_email_setting() {
1147 $all_setting = give_get_settings();
1148
1149 // Bailout on fresh install.
1150 if ( empty( $all_setting ) ) {
1151 return;
1152 }
1153
1154 $settings = array(
1155 'offline_donation_subject' => 'offline-donation-instruction_email_subject',
1156 'global_offline_donation_email' => 'offline-donation-instruction_email_message',
1157 'donation_subject' => 'donation-receipt_email_subject',
1158 'donation_receipt' => 'donation-receipt_email_message',
1159 'donation_notification_subject' => 'new-donation_email_subject',
1160 'donation_notification' => 'new-donation_email_message',
1161 'admin_notice_emails' => array(
1162 'new-donation_recipient',
1163 'new-offline-donation_recipient',
1164 'new-donor-register_recipient',
1165 ),
1166 'admin_notices' => 'new-donation_notification',
1167 );
1168
1169 foreach ( $settings as $old_setting => $new_setting ) {
1170 // Do not update already modified
1171 if ( ! is_array( $new_setting ) ) {
1172 if ( array_key_exists( $new_setting, $all_setting ) || ! array_key_exists( $old_setting, $all_setting ) ) {
1173 continue;
1174 }
1175 }
1176
1177 switch ( $old_setting ) {
1178 case 'admin_notices':
1179 $notification_status = give_get_option( $old_setting, 'enabled' );
1180
1181 give_update_option( $new_setting, $notification_status );
1182
1183 // @todo: Delete this option later ( version > 2.0 ), We need this for per form email addon.
1184 // give_delete_option( $old_setting );
1185
1186 break;
1187
1188 // @todo: Delete this option later ( version > 2.0 ) because we need this for backward compatibility give_get_admin_notice_emails.
1189 case 'admin_notice_emails':
1190 $recipients = give_get_admin_notice_emails();
1191
1192 foreach ( $new_setting as $setting ) {
1193 // bailout if setting already exist.
1194 if ( array_key_exists( $setting, $all_setting ) ) {
1195 continue;
1196 }
1197
1198 give_update_option( $setting, $recipients );
1199 }
1200 break;
1201
1202 default:
1203 give_update_option( $new_setting, give_get_option( $old_setting ) );
1204 give_delete_option( $old_setting );
1205 }
1206 }
1207 }
1208
1209 /**
1210 * Give version 1.8.9 upgrades
1211 *
1212 * @since 1.8.9
1213 */
1214 function give_v1812_upgrades() {
1215 /**
1216 * Validate number format settings.
1217 */
1218 $give_settings = give_get_settings();
1219 $give_setting_updated = false;
1220
1221 if ( $give_settings['thousands_separator'] === $give_settings['decimal_separator'] ) {
1222 $give_settings['number_decimals'] = 0;
1223 $give_settings['decimal_separator'] = '';
1224 $give_setting_updated = true;
1225
1226 } elseif ( empty( $give_settings['decimal_separator'] ) ) {
1227 $give_settings['number_decimals'] = 0;
1228 $give_setting_updated = true;
1229
1230 } elseif ( 6 < absint( $give_settings['number_decimals'] ) ) {
1231 $give_settings['number_decimals'] = 5;
1232 $give_setting_updated = true;
1233 }
1234
1235 if ( $give_setting_updated ) {
1236 update_option( 'give_settings', $give_settings );
1237 }
1238 }
1239
1240
1241 /**
1242 * Give version 1.8.12 update
1243 *
1244 * Standardized amount values to six decimal
1245 *
1246 * @see https://github.com/WordImpress/Give/issues/1849#issuecomment-315128602
1247 *
1248 * @since 1.8.12
1249 */
1250 function give_v1812_update_amount_values_callback() {
1251 /* @var Give_Updates $give_updates */
1252 $give_updates = Give_Updates::get_instance();
1253
1254 // form query.
1255 $donation_forms = new WP_Query( array(
1256 'paged' => $give_updates->step,
1257 'status' => 'any',
1258 'order' => 'ASC',
1259 'post_type' => array( 'give_forms', 'give_payment' ),
1260 'posts_per_page' => 20,
1261 )
1262 );
1263 if ( $donation_forms->have_posts() ) {
1264 $give_updates->set_percentage( $donation_forms->found_posts, ( $give_updates->step * 20 ) );
1265
1266 while ( $donation_forms->have_posts() ) {
1267 $donation_forms->the_post();
1268 global $post;
1269
1270 $meta = get_post_meta( $post->ID );
1271
1272 switch ( $post->post_type ) {
1273 case 'give_forms':
1274 // _give_set_price.
1275 if ( ! empty( $meta['_give_set_price'][0] ) ) {
1276 update_post_meta( $post->ID, '_give_set_price', give_sanitize_amount_for_db( $meta['_give_set_price'][0] ) );
1277 }
1278
1279 // _give_custom_amount_minimum.
1280 if ( ! empty( $meta['_give_custom_amount_minimum'][0] ) ) {
1281 update_post_meta( $post->ID, '_give_custom_amount_minimum', give_sanitize_amount_for_db( $meta['_give_custom_amount_minimum'][0] ) );
1282 }
1283
1284 // _give_levels_minimum_amount.
1285 if ( ! empty( $meta['_give_levels_minimum_amount'][0] ) ) {
1286 update_post_meta( $post->ID, '_give_levels_minimum_amount', give_sanitize_amount_for_db( $meta['_give_levels_minimum_amount'][0] ) );
1287 }
1288
1289 // _give_levels_maximum_amount.
1290 if ( ! empty( $meta['_give_levels_maximum_amount'][0] ) ) {
1291 update_post_meta( $post->ID, '_give_levels_maximum_amount', give_sanitize_amount_for_db( $meta['_give_levels_maximum_amount'][0] ) );
1292 }
1293
1294 // _give_set_goal.
1295 if ( ! empty( $meta['_give_set_goal'][0] ) ) {
1296 update_post_meta( $post->ID, '_give_set_goal', give_sanitize_amount_for_db( $meta['_give_set_goal'][0] ) );
1297 }
1298
1299 // _give_form_earnings.
1300 if ( ! empty( $meta['_give_form_earnings'][0] ) ) {
1301 update_post_meta( $post->ID, '_give_form_earnings', give_sanitize_amount_for_db( $meta['_give_form_earnings'][0] ) );
1302 }
1303
1304 // _give_custom_amount_minimum.
1305 if ( ! empty( $meta['_give_donation_levels'][0] ) ) {
1306 $donation_levels = unserialize( $meta['_give_donation_levels'][0] );
1307
1308 foreach ( $donation_levels as $index => $level ) {
1309 if ( empty( $level['_give_amount'] ) ) {
1310 continue;
1311 }
1312
1313 $donation_levels[ $index ]['_give_amount'] = give_sanitize_amount_for_db( $level['_give_amount'] );
1314 }
1315
1316 $meta['_give_donation_levels'] = $donation_levels;
1317 update_post_meta( $post->ID, '_give_donation_levels', $meta['_give_donation_levels'] );
1318 }
1319
1320
1321 break;
1322
1323 case 'give_payment':
1324 // _give_payment_total.
1325 if ( ! empty( $meta['_give_payment_total'][0] ) ) {
1326 update_post_meta( $post->ID, '_give_payment_total', give_sanitize_amount_for_db( $meta['_give_payment_total'][0] ) );
1327 }
1328
1329 break;
1330 }
1331 }
1332
1333 /* Restore original Post Data */
1334 wp_reset_postdata();
1335 } else {
1336 // The Update Ran.
1337 give_set_upgrade_complete( 'v1812_update_amount_values' );
1338 }
1339 }
1340
1341
1342 /**
1343 * Give version 1.8.12 update
1344 *
1345 * Standardized amount values to six decimal for donor
1346 *
1347 * @see https://github.com/WordImpress/Give/issues/1849#issuecomment-315128602
1348 *
1349 * @since 1.8.12
1350 */
1351 function give_v1812_update_donor_purchase_value_callback() {
1352 /* @var Give_Updates $give_updates */
1353 $give_updates = Give_Updates::get_instance();
1354
1355 // form query.
1356 $donors = Give()->donors->get_donors( array(
1357 'number' => 20,
1358 'offset' => $give_updates->get_offset( 20 ),
1359 )
1360 );
1361
1362 if ( ! empty( $donors ) ) {
1363 $give_updates->set_percentage( Give()->donors->count(), $give_updates->get_offset( 20 ) );
1364
1365 /* @var Object $donor */
1366 foreach ( $donors as $donor ) {
1367 Give()->donors->update( $donor->id, array( 'purchase_value' => give_sanitize_amount_for_db( $donor->purchase_value ) ) );
1368 }
1369 } else {
1370 // The Update Ran.
1371 give_set_upgrade_complete( 'v1812_update_donor_purchase_values' );
1372 }
1373 }
1374
1375 /**
1376 * Upgrade routine for updating user roles for existing donors.
1377 *
1378 * @since 1.8.13
1379 */
1380 function give_v1813_update_donor_user_roles_callback() {
1381 /* @var Give_Updates $give_updates */
1382 $give_updates = Give_Updates::get_instance();
1383
1384 // Fetch all the existing donors.
1385 $donors = Give()->donors->get_donors( array(
1386 'number' => 20,
1387 'offset' => $give_updates->get_offset( 20 ),
1388 )
1389 );
1390
1391 if ( ! empty( $donors ) ) {
1392 $give_updates->set_percentage( Give()->donors->count(), $give_updates->get_offset( 20 ) );
1393
1394 /* @var Object $donor */
1395 foreach ( $donors as $donor ) {
1396 $user_id = $donor->user_id;
1397
1398 // Proceed, if donor is attached with user.
1399 if ( $user_id ) {
1400 $user = get_userdata( $user_id );
1401
1402 // Update user role, if user has subscriber role.
1403 if ( is_array( $user->roles ) && in_array( 'subscriber', $user->roles ) ) {
1404 wp_update_user(
1405 array(
1406 'ID' => $user_id,
1407 'role' => 'give_donor',
1408 )
1409 );
1410 }
1411 }
1412 }
1413 } else {
1414 // The Update Ran.
1415 give_set_upgrade_complete( 'v1813_update_donor_user_roles' );
1416 }
1417 }
1418
1419
1420 /**
1421 * Version 1.8.13 automatic updates
1422 *
1423 * @since 1.8.13
1424 */
1425 function give_v1813_upgrades() {
1426 // Update admin setting.
1427 give_update_option( 'donor_default_user_role', 'give_donor' );
1428
1429 // Update Give roles.
1430 $roles = new Give_Roles();
1431 $roles->add_roles();
1432 $roles->add_caps();
1433 }
1434
1435 /**
1436 * Correct currency code for "Iranian Currency" for all of the payments.
1437 *
1438 * @since 1.8.17
1439 */
1440 function give_v1817_update_donation_iranian_currency_code() {
1441 /* @var Give_Updates $give_updates */
1442 $give_updates = Give_Updates::get_instance();
1443
1444 // form query.
1445 $payments = new WP_Query( array(
1446 'paged' => $give_updates->step,
1447 'status' => 'any',
1448 'order' => 'ASC',
1449 'post_type' => array( 'give_payment' ),
1450 'posts_per_page' => 100,
1451 )
1452 );
1453
1454 if ( $payments->have_posts() ) {
1455 $give_updates->set_percentage( $payments->found_posts, ( $give_updates->step * 100 ) );
1456
1457 while ( $payments->have_posts() ) {
1458 $payments->the_post();
1459
1460 $payment_meta = give_get_payment_meta( get_the_ID() );
1461
1462 if ( 'RIAL' === $payment_meta['currency'] ) {
1463 $payment_meta['currency'] = 'IRR';
1464 give_update_meta( get_the_ID(), '_give_payment_meta', $payment_meta );
1465 }
1466
1467 }
1468
1469 } else {
1470 // The Update Ran.
1471 give_set_upgrade_complete( 'v1817_update_donation_iranian_currency_code' );
1472 }
1473 }
1474
1475 /**
1476 * Correct currency code for "Iranian Currency" in Give setting.
1477 * Version 1.8.17 automatic updates
1478 *
1479 * @since 1.8.17
1480 */
1481 function give_v1817_upgrades() {
1482 $give_settings = give_get_settings();
1483
1484 if ( 'RIAL' === $give_settings['currency'] ) {
1485 $give_settings['currency'] = 'IRR';
1486 update_option( 'give_settings', $give_settings );
1487 }
1488 }
1489
1490 /**
1491 * Process Clean up of User Roles for more flexibility.
1492 *
1493 * @since 1.8.17
1494 */
1495 function give_v1817_process_cleanup_user_roles() {
1496
1497 global $wp_roles;
1498
1499 if ( ! ( $wp_roles instanceof WP_Roles ) ) {
1500 return;
1501 }
1502
1503 // Add Capabilities to user roles as required.
1504 $add_caps = array(
1505 'administrator' => array(
1506 'view_give_payments',
1507 ),
1508 );
1509
1510 // Remove Capabilities to user roles as required.
1511 $remove_caps = array(
1512 'give_manager' => array(
1513 'edit_others_pages',
1514 'edit_others_posts',
1515 'delete_others_pages',
1516 'delete_others_posts',
1517 'manage_categories',
1518 'import',
1519 'export',
1520 ),
1521 );
1522
1523 foreach ( $add_caps as $role => $caps ) {
1524 foreach ( $caps as $cap ) {
1525 $wp_roles->add_cap( $role, $cap );
1526 }
1527 }
1528
1529 foreach ( $remove_caps as $role => $caps ) {
1530 foreach ( $caps as $cap ) {
1531 $wp_roles->remove_cap( $role, $cap );
1532 }
1533 }
1534
1535 }
1536
1537 /**
1538 * Upgrade Routine - Clean up of User Roles for more flexibility.
1539 *
1540 * @since 1.8.17
1541 */
1542 function give_v1817_cleanup_user_roles() {
1543 /* @var Give_Updates $give_updates */
1544 $give_updates = Give_Updates::get_instance();
1545
1546 give_v1817_process_cleanup_user_roles();
1547
1548 $give_updates->percentage = 100;
1549
1550 // Create Give plugin roles.
1551 $roles = new Give_Roles();
1552 $roles->add_roles();
1553 $roles->add_caps();
1554
1555 give_set_upgrade_complete( 'v1817_cleanup_user_roles' );
1556 }
1557
1558 /**
1559 * Automatic Upgrade for release 1.8.18.
1560 *
1561 * @since 1.8.18
1562 */
1563 function give_v1818_upgrades() {
1564
1565 // Remove email_access_installed from give_settings.
1566 give_delete_option( 'email_access_installed' );
1567 }
1568
1569 /**
1570 * Upgrade Routine - Assigns Custom Amount to existing donation of type set donation.
1571 *
1572 * @since 1.8.18
1573 */
1574 function give_v1818_assign_custom_amount_set_donation() {
1575
1576 /* @var Give_Updates $give_updates */
1577 $give_updates = Give_Updates::get_instance();
1578
1579 $donations = new WP_Query( array(
1580 'paged' => $give_updates->step,
1581 'status' => 'any',
1582 'order' => 'ASC',
1583 'post_type' => array( 'give_payment' ),
1584 'posts_per_page' => 100,
1585 )
1586 );
1587
1588 if ( $donations->have_posts() ) {
1589 $give_updates->set_percentage( $donations->found_posts, $give_updates->step * 100 );
1590
1591 while ( $donations->have_posts() ) {
1592 $donations->the_post();
1593
1594 $form = new Give_Donate_Form( give_get_meta( get_the_ID(), '_give_payment_form_id', true ) );
1595 $donation_meta = give_get_payment_meta( get_the_ID() );
1596
1597 // Update Donation meta with price_id set as custom, only if it is:
1598 // 1. Donation Type = Set Donation.
1599 // 2. Donation Price Id is not set to custom.
1600 // 3. Form has not enabled custom price and donation amount assures that it is custom amount.
1601 if (
1602 $form->ID &&
1603 $form->is_set_type_donation_form() &&
1604 ( 'custom' !== $donation_meta['price_id'] ) &&
1605 $form->is_custom_price( give_get_meta( get_the_ID(), '_give_payment_total', true ) )
1606 ) {
1607 $donation_meta['price_id'] = 'custom';
1608 give_update_meta( get_the_ID(), '_give_payment_meta', $donation_meta );
1609 give_update_meta( get_the_ID(), '_give_payment_price_id', 'custom' );
1610 }
1611 }
1612
1613 wp_reset_postdata();
1614 } else {
1615 // Update Ran Successfully.
1616 give_set_upgrade_complete( 'v1818_assign_custom_amount_set_donation' );
1617 }
1618 }
1619
1620 /**
1621 * Upgrade Routine - Removed Give Worker caps.
1622 *
1623 * See: https://github.com/WordImpress/Give/issues/2476
1624 *
1625 * @since 1.8.18
1626 */
1627 function give_v1818_give_worker_role_cleanup() {
1628
1629 /* @var Give_Updates $give_updates */
1630 $give_updates = Give_Updates::get_instance();
1631
1632 global $wp_roles;
1633
1634 if ( ! ( $wp_roles instanceof WP_Roles ) ) {
1635 return;
1636 }
1637
1638 // Remove Capabilities to user roles as required.
1639 $remove_caps = array(
1640 'give_worker' => array(
1641 'delete_give_payments',
1642 'delete_others_give_payments',
1643 'delete_private_give_payments',
1644 'delete_published_give_payments',
1645 'edit_others_give_payments',
1646 'edit_private_give_payments',
1647 'edit_published_give_payments',
1648 'read_private_give_payments',
1649 ),
1650 );
1651
1652 foreach ( $remove_caps as $role => $caps ) {
1653 foreach ( $caps as $cap ) {
1654 $wp_roles->remove_cap( $role, $cap );
1655 }
1656 }
1657
1658 $give_updates->percentage = 100;
1659
1660 // Create Give plugin roles.
1661 $roles = new Give_Roles();
1662 $roles->add_roles();
1663 $roles->add_caps();
1664
1665 give_set_upgrade_complete( 'v1818_give_worker_role_cleanup' );
1666 }
1667
1668 /**
1669 *
1670 * Upgrade form metadata for new metabox settings.
1671 *
1672 * @since 2.0
1673 * @return void
1674 */
1675 function give_v20_upgrades_form_metadata_callback() {
1676 $give_updates = Give_Updates::get_instance();
1677
1678 // form query
1679 $forms = new WP_Query( array(
1680 'paged' => $give_updates->step,
1681 'status' => 'any',
1682 'order' => 'ASC',
1683 'post_type' => 'give_forms',
1684 'posts_per_page' => 100,
1685 )
1686 );
1687
1688 if ( $forms->have_posts() ) {
1689 $give_updates->set_percentage( $forms->found_posts, ( $give_updates->step * 100 ) );
1690
1691 while ( $forms->have_posts() ) {
1692 $forms->the_post();
1693 global $post;
1694
1695 // Update offline instruction email notification status.
1696 $offline_instruction_notification_status = get_post_meta( get_the_ID(), '_give_customize_offline_donations', true );
1697 $offline_instruction_notification_status = give_is_setting_enabled( $offline_instruction_notification_status, array(
1698 'enabled',
1699 'global',
1700 ) )
1701 ? $offline_instruction_notification_status
1702 : 'global';
1703 update_post_meta( get_the_ID(), '_give_offline-donation-instruction_notification', $offline_instruction_notification_status );
1704
1705 // Update offline instruction email message.
1706 update_post_meta(
1707 get_the_ID(),
1708 '_give_offline-donation-instruction_email_message',
1709 get_post_meta(
1710 get_the_ID(),
1711 // @todo: Delete this option later ( version > 2.0 ).
1712 '_give_offline_donation_email',
1713 true
1714 )
1715 );
1716
1717 // Update offline instruction email subject.
1718 update_post_meta(
1719 get_the_ID(),
1720 '_give_offline-donation-instruction_email_subject',
1721 get_post_meta(
1722 get_the_ID(),
1723 // @todo: Delete this option later ( version > 2.0 ).
1724 '_give_offline_donation_subject',
1725 true
1726 )
1727 );
1728
1729
1730 }// End while().
1731
1732 wp_reset_postdata();
1733 } else {
1734 // No more forms found, finish up.
1735 give_set_upgrade_complete( 'v20_upgrades_form_metadata' );
1736 }
1737 }
1738
1739
1740 /**
1741 * Upgrade payment metadata for new metabox settings.
1742 *
1743 * @since 2.0
1744 * @global wpdb $wpdb
1745 * @return void
1746 */
1747 function give_v20_upgrades_payment_metadata_callback() {
1748 global $wpdb;
1749 $give_updates = Give_Updates::get_instance();
1750
1751 // form query
1752 $forms = new WP_Query( array(
1753 'paged' => $give_updates->step,
1754 'status' => 'any',
1755 'order' => 'ASC',
1756 'post_type' => 'give_payment',
1757 'posts_per_page' => 100,
1758 )
1759 );
1760
1761 if ( $forms->have_posts() ) {
1762 $give_updates->set_percentage( $forms->found_posts, ( $give_updates->step * 100 ) );
1763
1764 while ( $forms->have_posts() ) {
1765 $forms->the_post();
1766 global $post;
1767
1768 // Split _give_payment_meta meta.
1769 // @todo Remove _give_payment_meta after releases 2.0
1770 $payment_meta = give_get_meta( $post->ID, '_give_payment_meta', true );
1771
1772 if ( ! empty( $payment_meta ) ) {
1773 _give_20_bc_split_and_save_give_payment_meta( $post->ID, $payment_meta );
1774 }
1775
1776 $deprecated_meta_keys = array(
1777 '_give_payment_customer_id' => '_give_payment_donor_id',
1778 '_give_payment_user_email' => '_give_payment_donor_email',
1779 '_give_payment_user_ip' => '_give_payment_donor_ip',
1780 );
1781
1782 foreach ( $deprecated_meta_keys as $old_meta_key => $new_meta_key ) {
1783 // Do not add new meta key if already exist.
1784 if ( $wpdb->get_var( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id=%d AND meta_key=%s", $post->ID, $new_meta_key ) ) ) {
1785 continue;
1786 }
1787
1788 $wpdb->insert(
1789 $wpdb->postmeta,
1790 array(
1791 'post_id' => $post->ID,
1792 'meta_key' => $new_meta_key,
1793 'meta_value' => give_get_meta( $post->ID, $old_meta_key, true ),
1794 )
1795 );
1796 }
1797
1798 // Bailout
1799 if ( $donor_id = give_get_meta( $post->ID, '_give_payment_donor_id', true ) ) {
1800 /* @var Give_Donor $donor */
1801 $donor = new Give_Donor( $donor_id );
1802
1803 $address['line1'] = give_get_meta( $post->ID, '_give_donor_billing_address1', true, '' );
1804 $address['line2'] = give_get_meta( $post->ID, '_give_donor_billing_address2', true, '' );
1805 $address['city'] = give_get_meta( $post->ID, '_give_donor_billing_city', true, '' );
1806 $address['state'] = give_get_meta( $post->ID, '_give_donor_billing_state', true, '' );
1807 $address['zip'] = give_get_meta( $post->ID, '_give_donor_billing_zip', true, '' );
1808 $address['country'] = give_get_meta( $post->ID, '_give_donor_billing_country', true, '' );
1809
1810 // Save address.
1811 $donor->add_address( 'billing[]', $address );
1812 }
1813
1814 }// End while().
1815
1816 wp_reset_postdata();
1817 } else {
1818 // @todo Delete user id meta after releases 2.0
1819 // $wpdb->get_var( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE meta_key=%s", '_give_payment_user_id' ) );
1820
1821 // No more forms found, finish up.
1822 give_set_upgrade_complete( 'v20_upgrades_payment_metadata' );
1823 }
1824 }
1825
1826
1827 /**
1828 * Upgrade logs data.
1829 *
1830 * @since 2.0
1831 * @return void
1832 */
1833 function give_v20_logs_upgrades_callback() {
1834 global $wpdb;
1835 $give_updates = Give_Updates::get_instance();
1836
1837 // form query
1838 $forms = new WP_Query( array(
1839 'paged' => $give_updates->step,
1840 'order' => 'DESC',
1841 'post_type' => 'give_log',
1842 'post_status' => 'any',
1843 'posts_per_page' => 100,
1844 )
1845 );
1846
1847 if ( $forms->have_posts() ) {
1848 $give_updates->set_percentage( $forms->found_posts, $give_updates->step * 100 );
1849
1850 while ( $forms->have_posts() ) {
1851 $forms->the_post();
1852 global $post;
1853
1854 if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_logs WHERE ID=%d", $post->ID ) ) ) {
1855 continue;
1856 }
1857
1858 $term = get_the_terms( $post->ID, 'give_log_type' );
1859 $term = ! is_wp_error( $term ) && ! empty( $term ) ? $term[0] : array();
1860 $term_name = ! empty( $term ) ? $term->slug : '';
1861
1862 $log_data = array(
1863 'ID' => $post->ID,
1864 'log_title' => $post->post_title,
1865 'log_content' => $post->post_content,
1866 'log_parent' => 0,
1867 'log_type' => $term_name,
1868 'log_date' => $post->post_date,
1869 'log_date_gmt' => $post->post_date_gmt,
1870 );
1871 $log_meta = array();
1872
1873 if ( $old_log_meta = get_post_meta( $post->ID ) ) {
1874 foreach ( $old_log_meta as $meta_key => $meta_value ) {
1875 switch ( $meta_key ) {
1876 case '_give_log_payment_id':
1877 $log_data['log_parent'] = current( $meta_value );
1878 $log_meta['_give_log_form_id'] = $post->post_parent;
1879 break;
1880
1881 default:
1882 $log_meta[ $meta_key ] = current( $meta_value );
1883 }
1884 }
1885 }
1886
1887 if ( 'api_request' === $term_name ) {
1888 $log_meta['_give_log_api_query'] = $post->post_excerpt;
1889 }
1890
1891 $wpdb->insert( "{$wpdb->prefix}give_logs", $log_data );
1892
1893 if ( ! empty( $log_meta ) ) {
1894 foreach ( $log_meta as $meta_key => $meta_value ) {
1895 Give()->logs->logmeta_db->update_meta( $post->ID, $meta_key, $meta_value );
1896 }
1897 }
1898
1899 $logIDs[] = $post->ID;
1900 }// End while().
1901
1902 wp_reset_postdata();
1903 } else {
1904 // @todo: Delete terms and taxonomy after releases 2.0.
1905 /*$terms = get_terms( 'give_log_type', array( 'fields' => 'ids', 'hide_empty' => false ) );
1906 if ( ! empty( $terms ) ) {
1907 foreach ( $terms as $term ) {
1908 wp_delete_term( $term, 'give_log_type' );
1909 }
1910 }*/
1911
1912 // @todo: Delete logs after releases 2.0.
1913 /*$logIDs = get_posts( array(
1914 'order' => 'DESC',
1915 'post_type' => 'give_log',
1916 'post_status' => 'any',
1917 'posts_per_page' => - 1,
1918 'fields' => 'ids',
1919 )
1920 );*/
1921
1922 /*if ( ! empty( $logIDs ) ) {
1923 foreach ( $logIDs as $log ) {
1924 // Delete term relationship and posts.
1925 wp_delete_object_term_relationships( $log, 'give_log_type' );
1926 wp_delete_post( $log, true );
1927 }
1928 }*/
1929
1930 // @todo: Unregister taxonomy after releases 2.0.
1931 /*unregister_taxonomy( 'give_log_type' );*/
1932
1933 // Delete log cache.
1934 Give()->logs->delete_cache();
1935
1936 // No more forms found, finish up.
1937 give_set_upgrade_complete( 'v20_logs_upgrades' );
1938 }
1939 }
1940
1941
1942 /**
1943 * Move payment and form metadata to new table
1944 *
1945 * @since 2.0
1946 * @return void
1947 */
1948 function give_v20_move_metadata_into_new_table_callback() {
1949 global $wpdb;
1950 $give_updates = Give_Updates::get_instance();
1951
1952 // form query
1953 $payments = new WP_Query( array(
1954 'paged' => $give_updates->step,
1955 'status' => 'any',
1956 'order' => 'ASC',
1957 'post_type' => array( 'give_forms', 'give_payment' ),
1958 'posts_per_page' => 100,
1959 )
1960 );
1961
1962 if ( $payments->have_posts() ) {
1963 $give_updates->set_percentage( $payments->found_posts, $give_updates->step * 100 );
1964
1965 while ( $payments->have_posts() ) {
1966 $payments->the_post();
1967 global $post;
1968
1969 $meta_data = $wpdb->get_results(
1970 $wpdb->prepare(
1971 "SELECT * FROM $wpdb->postmeta where post_id=%d",
1972 get_the_ID()
1973 ),
1974 ARRAY_A
1975 );
1976
1977 if ( ! empty( $meta_data ) ) {
1978 foreach ( $meta_data as $index => $data ) {
1979 // Check for duplicate meta values.
1980 if ( $result = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM " . ( 'give_forms' === $post->post_type ? $wpdb->formmeta : $wpdb->paymentmeta ) . " WHERE meta_id=%d", $data['meta_id'] ), ARRAY_A ) ) {
1981 continue;
1982 }
1983
1984 switch ( $post->post_type ) {
1985 case 'give_forms':
1986 $data['form_id'] = $data['post_id'];
1987 unset( $data['post_id'] );
1988
1989 Give()->form_meta->insert( $data );
1990 // @todo: delete form meta from post meta table after releases 2.0.
1991 /*delete_post_meta( get_the_ID(), $data['meta_key'] );*/
1992
1993 break;
1994
1995 case 'give_payment':
1996 $data['payment_id'] = $data['post_id'];
1997 unset( $data['post_id'] );
1998
1999 Give()->payment_meta->insert( $data );
2000
2001 // @todo: delete donation meta from post meta table after releases 2.0.
2002 /*delete_post_meta( get_the_ID(), $data['meta_key'] );*/
2003
2004 break;
2005 }
2006 }
2007 }
2008
2009 }// End while().
2010
2011 wp_reset_postdata();
2012 } else {
2013 // No more forms found, finish up.
2014 give_set_upgrade_complete( 'v20_move_metadata_into_new_table' );
2015 }
2016
2017 }
2018
2019 /**
2020 * Upgrade routine for splitting donor name into first name and last name.
2021 *
2022 * @since 2.0
2023 *
2024 * @return void
2025 */
2026 function give_v20_upgrades_donor_name() {
2027 /* @var Give_Updates $give_updates */
2028 $give_updates = Give_Updates::get_instance();
2029
2030 $donors = Give()->donors->get_donors( array(
2031 'paged' => $give_updates->step,
2032 'number' => 100,
2033 ) );
2034
2035 if ( $donors ) {
2036 $give_updates->set_percentage( count( $donors ), $give_updates->step * 100 );
2037 // Loop through Donors
2038 foreach ( $donors as $donor ) {
2039
2040 $donor_name = explode( ' ', $donor->name, 2 );
2041 $donor_first_name = Give()->donor_meta->get_meta( $donor->id, '_give_donor_first_name' );
2042 $donor_last_name = Give()->donor_meta->get_meta( $donor->id, '_give_donor_last_name' );
2043
2044 // If first name meta of donor is not created, then create it.
2045 if ( ! $donor_first_name && isset( $donor_name[0] ) ) {
2046 Give()->donor_meta->add_meta( $donor->id, '_give_donor_first_name', $donor_name[0] );
2047 }
2048
2049 // If last name meta of donor is not created, then create it.
2050 if ( ! $donor_last_name && isset( $donor_name[1] ) ) {
2051 Give()->donor_meta->add_meta( $donor->id, '_give_donor_last_name', $donor_name[1] );
2052 }
2053
2054 // If Donor is connected with WP User then update user meta.
2055 if ( $donor->user_id ) {
2056 if ( isset( $donor_name[0] ) ) {
2057 update_user_meta( $donor->user_id, 'first_name', $donor_name[0] );
2058 }
2059 if ( isset( $donor_name[1] ) ) {
2060 update_user_meta( $donor->user_id, 'last_name', $donor_name[1] );
2061 }
2062 }
2063 }
2064
2065 } else {
2066 // The Update Ran.
2067 give_set_upgrade_complete( 'v20_upgrades_donor_name' );
2068 }
2069
2070 }
2071
2072 /**
2073 * Upgrade routine for user addresses.
2074 *
2075 * @since 2.0
2076 * @global wpdb $wpdb
2077 *
2078 * @return void
2079 */
2080 function give_v20_upgrades_user_address() {
2081 global $wpdb;
2082
2083 /* @var Give_Updates $give_updates */
2084 $give_updates = Give_Updates::get_instance();
2085
2086 /* @var WP_User_Query $user_query */
2087 $user_query = new WP_User_Query(
2088 array(
2089 'number' => 100,
2090 'paged' => $give_updates->step,
2091 )
2092 );
2093
2094 $users = $user_query->get_results();
2095
2096 if ( $users ) {
2097 $give_updates->set_percentage( $user_query->get_total(), $give_updates->step * 100 );
2098
2099 // Loop through Donors
2100 foreach ( $users as $user ) {
2101 /* @var Give_Donor $donor */
2102 $donor = new Give_Donor( $user->ID, true );
2103
2104 if ( ! $donor->id ) {
2105 continue;
2106 }
2107
2108 $address = $wpdb->get_var(
2109 $wpdb->prepare(
2110 "
2111 SELECT meta_value FROM {$wpdb->usermeta}
2112 WHERE user_id=%s
2113 AND meta_key=%s
2114 ",
2115 $user->ID,
2116 '_give_user_address'
2117 )
2118 );
2119
2120 if ( ! empty( $address ) ) {
2121 $address = maybe_unserialize( $address );
2122 $donor->add_address( 'personal', $address );
2123 $donor->add_address( 'billing[]', $address );
2124
2125
2126 // @todo: delete _give_user_address from user meta after releases 2.0.
2127 /*delete_user_meta( $user->ID, '_give_user_address' );*/
2128 }
2129 }
2130
2131 } else {
2132 // The Update Ran.
2133 give_set_upgrade_complete( 'v20_upgrades_user_address' );
2134 }
2135
2136 }
2137
2138 /**
2139 * Upgrade logs data.
2140 *
2141 * @since 2.0
2142 * @global wpdb $wpdb
2143 * @return void
2144 */
2145 function give_v20_rename_donor_tables_callback() {
2146 global $wpdb;
2147
2148 /* @var Give_Updates $give_updates */
2149 $give_updates = Give_Updates::get_instance();
2150
2151 $tables = array(
2152 "{$wpdb->prefix}give_customers" => "{$wpdb->prefix}give_donors",
2153 "{$wpdb->prefix}give_customermeta" => "{$wpdb->prefix}give_donormeta",
2154 );
2155
2156 // Alter customer table
2157 foreach ( $tables as $old_table => $new_table ) {
2158 if (
2159 $wpdb->query( $wpdb->prepare( "SHOW TABLES LIKE %s", $old_table ) ) &&
2160 ! $wpdb->query( $wpdb->prepare( "SHOW TABLES LIKE %s", $new_table ) )
2161 ) {
2162 $wpdb->query( "ALTER TABLE {$old_table} RENAME TO {$new_table}" );
2163
2164 if ( "{$wpdb->prefix}give_donormeta" === $new_table ) {
2165 $wpdb->query( "ALTER TABLE {$new_table} CHANGE COLUMN customer_id donor_id bigint(20)" );
2166 }
2167 }
2168 }
2169
2170 $give_updates->percentage = 100;
2171
2172 // No more forms found, finish up.
2173 give_set_upgrade_complete( 'v20_rename_donor_tables' );
2174
2175 // Re initiate donor classes.
2176 Give()->donors = new Give_DB_Donors();
2177 Give()->donor_meta = new Give_DB_Donor_Meta();
2178 }
2179
2180
2181 /**
2182 * Create missing meta tables.
2183 *
2184 * @since 2.0.1
2185 * @global wpdb $wpdb
2186 * @return void
2187 */
2188 function give_v201_create_tables() {
2189 global $wpdb;
2190
2191 if ( ! $wpdb->query( $wpdb->prepare( "SHOW TABLES LIKE %s", "{$wpdb->prefix}give_paymentmeta" ) ) ) {
2192 Give()->payment_meta->create_table();
2193 }
2194
2195 if ( ! $wpdb->query( $wpdb->prepare( "SHOW TABLES LIKE %s", "{$wpdb->prefix}give_formmeta" ) ) ) {
2196 Give()->form_meta->create_table();
2197 }
2198
2199 if ( ! $wpdb->query( $wpdb->prepare( "SHOW TABLES LIKE %s", "{$wpdb->prefix}give_logs" ) ) ) {
2200 Give()->logs->log_db->create_table();
2201 }
2202
2203 if ( ! $wpdb->query( $wpdb->prepare( "SHOW TABLES LIKE %s", "{$wpdb->prefix}give_logmeta" ) ) ) {
2204 Give()->logs->logmeta_db->create_table();
2205 }
2206 }
2207
2208 /**
2209 * Upgrade payment metadata for new metabox settings.
2210 *
2211 * @since 2.0.1
2212 * @global wpdb $wpdb
2213 * @return void
2214 */
2215 function give_v201_upgrades_payment_metadata_callback() {
2216 global $wpdb, $post;
2217 $give_updates = Give_Updates::get_instance();
2218 give_v201_create_tables();
2219
2220 $payments = $wpdb->get_col(
2221 "
2222 SELECT ID FROM $wpdb->posts
2223 WHERE 1=1
2224 AND (
2225 $wpdb->posts.post_date >= '2018-01-08 00:00:00'
2226 )
2227 AND $wpdb->posts.post_type = 'give_payment'
2228 AND {$wpdb->posts}.post_status IN ('" . implode( "','", array_keys( give_get_payment_statuses() ) ) . "')
2229 ORDER BY $wpdb->posts.post_date ASC
2230 LIMIT 100
2231 OFFSET " . $give_updates->get_offset( 100 )
2232 );
2233
2234 if ( ! empty( $payments ) ) {
2235 $give_updates->set_percentage( give_get_total_post_type_count( 'give_payment' ), ( $give_updates->step * 100 ) );
2236
2237 foreach ( $payments as $payment_id ) {
2238 $post = get_post( $payment_id );
2239 setup_postdata( $post );
2240
2241 // Do not add new meta keys if already refactored.
2242 if ( $wpdb->get_var( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id=%d AND meta_key=%s", $post->ID, '_give_payment_donor_id' ) ) ) {
2243 continue;
2244 }
2245
2246
2247 // Split _give_payment_meta meta.
2248 // @todo Remove _give_payment_meta after releases 2.0
2249 $payment_meta = give_get_meta( $post->ID, '_give_payment_meta', true );
2250
2251 if ( ! empty( $payment_meta ) ) {
2252 _give_20_bc_split_and_save_give_payment_meta( $post->ID, $payment_meta );
2253 }
2254
2255 $deprecated_meta_keys = array(
2256 '_give_payment_customer_id' => '_give_payment_donor_id',
2257 '_give_payment_user_email' => '_give_payment_donor_email',
2258 '_give_payment_user_ip' => '_give_payment_donor_ip',
2259 );
2260
2261 foreach ( $deprecated_meta_keys as $old_meta_key => $new_meta_key ) {
2262 // Do not add new meta key if already exist.
2263 if ( $wpdb->get_var( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id=%d AND meta_key=%s", $post->ID, $new_meta_key ) ) ) {
2264 continue;
2265 }
2266
2267 $wpdb->insert(
2268 $wpdb->postmeta,
2269 array(
2270 'post_id' => $post->ID,
2271 'meta_key' => $new_meta_key,
2272 'meta_value' => give_get_meta( $post->ID, $old_meta_key, true ),
2273 )
2274 );
2275 }
2276
2277 // Bailout
2278 if ( $donor_id = give_get_meta( $post->ID, '_give_payment_donor_id', true ) ) {
2279 /* @var Give_Donor $donor */
2280 $donor = new Give_Donor( $donor_id );
2281
2282 $address['line1'] = give_get_meta( $post->ID, '_give_donor_billing_address1', true, '' );
2283 $address['line2'] = give_get_meta( $post->ID, '_give_donor_billing_address2', true, '' );
2284 $address['city'] = give_get_meta( $post->ID, '_give_donor_billing_city', true, '' );
2285 $address['state'] = give_get_meta( $post->ID, '_give_donor_billing_state', true, '' );
2286 $address['zip'] = give_get_meta( $post->ID, '_give_donor_billing_zip', true, '' );
2287 $address['country'] = give_get_meta( $post->ID, '_give_donor_billing_country', true, '' );
2288
2289 // Save address.
2290 $donor->add_address( 'billing[]', $address );
2291 }
2292
2293 }// End while().
2294
2295 wp_reset_postdata();
2296 } else {
2297 // @todo Delete user id meta after releases 2.0
2298 // $wpdb->get_var( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE meta_key=%s", '_give_payment_user_id' ) );
2299
2300 // No more forms found, finish up.
2301 give_set_upgrade_complete( 'v201_upgrades_payment_metadata' );
2302 }
2303 }
2304
2305 /**
2306 * Move payment and form metadata to new table
2307 *
2308 * @since 2.0.1
2309 * @return void
2310 */
2311 function give_v201_move_metadata_into_new_table_callback() {
2312 global $wpdb, $post;
2313 $give_updates = Give_Updates::get_instance();
2314 give_v201_create_tables();
2315
2316 $payments = $wpdb->get_col(
2317 "
2318 SELECT ID FROM $wpdb->posts
2319 WHERE 1=1
2320 AND ( $wpdb->posts.post_type = 'give_payment' OR $wpdb->posts.post_type = 'give_forms' )
2321 AND {$wpdb->posts}.post_status IN ('" . implode( "','", array_keys( give_get_payment_statuses() ) ) . "')
2322 ORDER BY $wpdb->posts.post_date ASC
2323 LIMIT 100
2324 OFFSET " . $give_updates->get_offset( 100 )
2325 );
2326
2327 if ( ! empty( $payments ) ) {
2328 $give_updates->set_percentage( give_get_total_post_type_count( array(
2329 'give_forms',
2330 'give_payment',
2331 ) ), $give_updates->step * 100 );
2332
2333 foreach ( $payments as $payment_id ) {
2334 $post = get_post( $payment_id );
2335 setup_postdata( $post );
2336
2337 $meta_data = $wpdb->get_results(
2338 $wpdb->prepare(
2339 "SELECT * FROM $wpdb->postmeta where post_id=%d",
2340 get_the_ID()
2341 ),
2342 ARRAY_A
2343 );
2344
2345 if ( ! empty( $meta_data ) ) {
2346 foreach ( $meta_data as $index => $data ) {
2347 // Check for duplicate meta values.
2348 if ( $result = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM " . ( 'give_forms' === $post->post_type ? $wpdb->formmeta : $wpdb->paymentmeta ) . " WHERE meta_id=%d", $data['meta_id'] ), ARRAY_A ) ) {
2349 continue;
2350 }
2351
2352 switch ( $post->post_type ) {
2353 case 'give_forms':
2354 $data['form_id'] = $data['post_id'];
2355 unset( $data['post_id'] );
2356
2357 Give()->form_meta->insert( $data );
2358 // @todo: delete form meta from post meta table after releases 2.0.
2359 /*delete_post_meta( get_the_ID(), $data['meta_key'] );*/
2360
2361 break;
2362
2363 case 'give_payment':
2364 $data['payment_id'] = $data['post_id'];
2365 unset( $data['post_id'] );
2366
2367 Give()->payment_meta->insert( $data );
2368
2369 // @todo: delete donation meta from post meta table after releases 2.0.
2370 /*delete_post_meta( get_the_ID(), $data['meta_key'] );*/
2371
2372 break;
2373 }
2374 }
2375 }
2376
2377 }// End while().
2378
2379 wp_reset_postdata();
2380 } else {
2381 // No more forms found, finish up.
2382 give_set_upgrade_complete( 'v201_move_metadata_into_new_table' );
2383 }
2384
2385 }
2386
2387 /**
2388 * Move data to new log table.
2389 *
2390 * @since 2.0.1
2391 * @return void
2392 */
2393 function give_v201_logs_upgrades_callback() {
2394 global $wpdb, $post;
2395 $give_updates = Give_Updates::get_instance();
2396 give_v201_create_tables();
2397
2398 $logs = $wpdb->get_col(
2399 "
2400 SELECT ID FROM $wpdb->posts
2401 WHERE 1=1
2402 AND $wpdb->posts.post_type = 'give_log'
2403 AND {$wpdb->posts}.post_status IN ('" . implode( "','", array_keys( give_get_payment_statuses() ) ) . "')
2404 ORDER BY $wpdb->posts.post_date ASC
2405 LIMIT 100
2406 OFFSET " . $give_updates->get_offset( 100 )
2407 );
2408
2409 if ( ! empty( $logs ) ) {
2410 $give_updates->set_percentage( give_get_total_post_type_count( 'give_log' ), $give_updates->step * 100 );
2411
2412 foreach ( $logs as $log_id ) {
2413 $post = get_post( $log_id );
2414 setup_postdata( $post );
2415
2416 if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_logs WHERE ID=%d", $post->ID ) ) ) {
2417 continue;
2418 }
2419
2420 $term = get_the_terms( $post->ID, 'give_log_type' );
2421 $term = ! is_wp_error( $term ) && ! empty( $term ) ? $term[0] : array();
2422 $term_name = ! empty( $term ) ? $term->slug : '';
2423
2424 $log_data = array(
2425 'ID' => $post->ID,
2426 'log_title' => $post->post_title,
2427 'log_content' => $post->post_content,
2428 'log_parent' => 0,
2429 'log_type' => $term_name,
2430 'log_date' => $post->post_date,
2431 'log_date_gmt' => $post->post_date_gmt,
2432 );
2433 $log_meta = array();
2434
2435 if ( $old_log_meta = get_post_meta( $post->ID ) ) {
2436 foreach ( $old_log_meta as $meta_key => $meta_value ) {
2437 switch ( $meta_key ) {
2438 case '_give_log_payment_id':
2439 $log_data['log_parent'] = current( $meta_value );
2440 $log_meta['_give_log_form_id'] = $post->post_parent;
2441 break;
2442
2443 default:
2444 $log_meta[ $meta_key ] = current( $meta_value );
2445 }
2446 }
2447 }
2448
2449 if ( 'api_request' === $term_name ) {
2450 $log_meta['_give_log_api_query'] = $post->post_excerpt;
2451 }
2452
2453 $wpdb->insert( "{$wpdb->prefix}give_logs", $log_data );
2454
2455 if ( ! empty( $log_meta ) ) {
2456 foreach ( $log_meta as $meta_key => $meta_value ) {
2457 Give()->logs->logmeta_db->update_meta( $post->ID, $meta_key, $meta_value );
2458 }
2459 }
2460
2461 $logIDs[] = $post->ID;
2462 }// End while().
2463
2464 wp_reset_postdata();
2465 } else {
2466 // Delete log cache.
2467 Give()->logs->delete_cache();
2468
2469 // No more forms found, finish up.
2470 give_set_upgrade_complete( 'v201_logs_upgrades' );
2471 }
2472 }
2473
2474
2475 /**
2476 * Add missing donor.
2477 *
2478 * @since 2.0.1
2479 * @return void
2480 */
2481 function give_v201_add_missing_donors_callback() {
2482 global $wpdb;
2483 give_v201_create_tables();
2484
2485 if ( $wpdb->query( $wpdb->prepare( "SHOW TABLES LIKE %s", "{$wpdb->prefix}give_customers" ) ) ) {
2486 $customers = wp_list_pluck( $wpdb->get_results( "SELECT id FROM {$wpdb->prefix}give_customers" ), 'id' );
2487 $donors = wp_list_pluck( $wpdb->get_results( "SELECT id FROM {$wpdb->prefix}give_donors" ), 'id' );
2488 $donor_data = array();
2489
2490 if ( $missing_donors = array_diff( $customers, $donors ) ) {
2491 foreach ( $missing_donors as $donor_id ) {
2492 $donor_data[] = array(
2493 'info' => $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_customers WHERE id=%d", $donor_id ) ),
2494 'meta' => $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_customermeta WHERE customer_id=%d", $donor_id ) ),
2495
2496 );
2497 }
2498 }
2499
2500 if ( ! empty( $donor_data ) ) {
2501 $donor_table_name = Give()->donors->table_name;
2502 $donor_meta_table_name = Give()->donor_meta->table_name;
2503
2504 Give()->donors->table_name = "{$wpdb->prefix}give_donors";
2505 Give()->donor_meta->table_name = "{$wpdb->prefix}give_donormeta";
2506
2507 foreach ( $donor_data as $donor ) {
2508 $donor['info'][0] = (array) $donor['info'][0];
2509
2510 // Prevent duplicate meta id issue.
2511 if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_donors WHERE id=%d", $donor['info'][0]['id'] ) ) ) {
2512 continue;
2513 }
2514
2515 $donor_id = Give()->donors->add( $donor['info'][0] );
2516
2517 if ( ! empty( $donor['meta'] ) ) {
2518 foreach ( $donor['meta'] as $donor_meta ) {
2519 $donor_meta = (array) $donor_meta;
2520
2521 // Prevent duplicate meta id issue.
2522 if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_donormeta WHERE meta_id=%d", $donor_meta['meta_id'] ) ) ) {
2523 unset( $donor_meta['meta_id'] );
2524 }
2525
2526 $donor_meta['donor_id'] = $donor_meta['customer_id'];
2527 unset( $donor_meta['customer_id'] );
2528
2529 Give()->donor_meta->insert( $donor_meta );
2530 }
2531 }
2532
2533 /**
2534 * Fix donor name and address
2535 */
2536 $address = $wpdb->get_var(
2537 $wpdb->prepare(
2538 "
2539 SELECT meta_value FROM {$wpdb->usermeta}
2540 WHERE user_id=%s
2541 AND meta_key=%s
2542 ",
2543 $donor['info'][0]['user_id'],
2544 '_give_user_address'
2545 )
2546 );
2547
2548 $donor = new Give_Donor( $donor_id );
2549
2550 if ( ! empty( $address ) ) {
2551 $address = maybe_unserialize( $address );
2552 $donor->add_address( 'personal', $address );
2553 $donor->add_address( 'billing[]', $address );
2554 }
2555
2556 $donor_name = explode( ' ', $donor->name, 2 );
2557 $donor_first_name = Give()->donor_meta->get_meta( $donor->id, '_give_donor_first_name' );
2558 $donor_last_name = Give()->donor_meta->get_meta( $donor->id, '_give_donor_last_name' );
2559
2560 // If first name meta of donor is not created, then create it.
2561 if ( ! $donor_first_name && isset( $donor_name[0] ) ) {
2562 Give()->donor_meta->add_meta( $donor->id, '_give_donor_first_name', $donor_name[0] );
2563 }
2564
2565 // If last name meta of donor is not created, then create it.
2566 if ( ! $donor_last_name && isset( $donor_name[1] ) ) {
2567 Give()->donor_meta->add_meta( $donor->id, '_give_donor_last_name', $donor_name[1] );
2568 }
2569
2570 // If Donor is connected with WP User then update user meta.
2571 if ( $donor->user_id ) {
2572 if ( isset( $donor_name[0] ) ) {
2573 update_user_meta( $donor->user_id, 'first_name', $donor_name[0] );
2574 }
2575 if ( isset( $donor_name[1] ) ) {
2576 update_user_meta( $donor->user_id, 'last_name', $donor_name[1] );
2577 }
2578 }
2579 }
2580
2581 Give()->donors->table_name = $donor_table_name;
2582 Give()->donor_meta->table_name = $donor_meta_table_name;
2583 }
2584 }
2585
2586 Give_Updates::get_instance()->percentage = 100;
2587 give_set_upgrade_complete( 'v201_add_missing_donors' );
2588 }
2589
2590
2591 /**
2592 * Version 2.0.3 automatic updates
2593 *
2594 * @since 2.0.3
2595 */
2596 function give_v203_upgrades() {
2597 global $wpdb;
2598
2599 // Do not auto load option.
2600 $wpdb->update( $wpdb->options, array( 'autoload' => 'no' ), array( 'option_name' => 'give_completed_upgrades' ) );
2601
2602 // Remove from cache.
2603 $all_options = wp_load_alloptions();
2604
2605 if ( isset( $all_options['give_completed_upgrades'] ) ) {
2606 unset( $all_options['give_completed_upgrades'] );
2607 wp_cache_set( 'alloptions', $all_options, 'options' );
2608 }
2609
2610 }