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