PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.5.0
GiveWP – Donation Plugin and Fundraising Platform v2.5.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 6 years ago class-give-updates.php 6 years ago upgrade-functions.php 6 years ago
upgrade-functions.php
3510 lines
1 <?php
2 /**
3 * Upgrade Functions
4 *
5 * @package Give
6 * @subpackage Admin/Upgrades
7 * @copyright Copyright (c) 2016, GiveWP
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.].*/', '', Give_Cache_Setting::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, false );
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 case version_compare( $give_version, '2.2.0', '<' ):
123 give_v220_upgrades();
124 $did_upgrade = true;
125
126 case version_compare( $give_version, '2.2.1', '<' ):
127 give_v221_upgrades();
128 $did_upgrade = true;
129
130 case version_compare( $give_version, '2.3.0', '<' ):
131 give_v230_upgrades();
132 $did_upgrade = true;
133
134 case version_compare( $give_version, '2.5.0', '<' ):
135 give_v250_upgrades();
136 $did_upgrade = true;
137 }
138
139 if ( $did_upgrade || version_compare( $give_version, GIVE_VERSION, '<' ) ) {
140 update_option( 'give_version', preg_replace( '/[^0-9.].*/', '', GIVE_VERSION ), false );
141 }
142 }
143
144 add_action( 'admin_init', 'give_do_automatic_upgrades', 0 );
145 add_action( 'give_upgrades', 'give_do_automatic_upgrades', 0 );
146
147 /**
148 * Display Upgrade Notices.
149 *
150 * IMPORTANT: ALSO UPDATE INSTALL.PHP WITH THE ID OF THE UPGRADE ROUTINE SO IT DOES NOT AFFECT NEW INSTALLS.
151 *
152 * @since 1.0
153 * @since 1.8.12 Update new update process code.
154 *
155 * @param Give_Updates $give_updates
156 *
157 * @return void
158 */
159 function give_show_upgrade_notices( $give_updates ) {
160 // v1.3.2 Upgrades
161 $give_updates->register(
162 array(
163 'id' => 'upgrade_give_payment_customer_id',
164 'version' => '1.3.2',
165 'callback' => 'give_v132_upgrade_give_payment_customer_id',
166 )
167 );
168
169 // v1.3.4 Upgrades ensure the user has gone through 1.3.4.
170 $give_updates->register(
171 array(
172 'id' => 'upgrade_give_offline_status',
173 'depend' => 'upgrade_give_payment_customer_id',
174 'version' => '1.3.4',
175 'callback' => 'give_v134_upgrade_give_offline_status',
176 )
177 );
178
179 // v1.8 form metadata upgrades.
180 $give_updates->register(
181 array(
182 'id' => 'v18_upgrades_form_metadata',
183 'version' => '1.8',
184 'callback' => 'give_v18_upgrades_form_metadata',
185 )
186 );
187
188 // v1.8.9 Upgrades
189 $give_updates->register(
190 array(
191 'id' => 'v189_upgrades_levels_post_meta',
192 'version' => '1.8.9',
193 'callback' => 'give_v189_upgrades_levels_post_meta_callback',
194 )
195 );
196
197 // v1.8.12 Upgrades
198 $give_updates->register(
199 array(
200 'id' => 'v1812_update_amount_values',
201 'version' => '1.8.12',
202 'callback' => 'give_v1812_update_amount_values_callback',
203 )
204 );
205
206 // v1.8.12 Upgrades
207 $give_updates->register(
208 array(
209 'id' => 'v1812_update_donor_purchase_values',
210 'version' => '1.8.12',
211 'callback' => 'give_v1812_update_donor_purchase_value_callback',
212 )
213 );
214
215 // v1.8.13 Upgrades for donor
216 $give_updates->register(
217 array(
218 'id' => 'v1813_update_donor_user_roles',
219 'version' => '1.8.13',
220 'callback' => 'give_v1813_update_donor_user_roles_callback',
221 )
222 );
223
224 // v1.8.17 Upgrades for donations.
225 $give_updates->register(
226 array(
227 'id' => 'v1817_update_donation_iranian_currency_code',
228 'version' => '1.8.17',
229 'callback' => 'give_v1817_update_donation_iranian_currency_code',
230 )
231 );
232
233 // v1.8.17 Upgrades for cleanup of user roles.
234 $give_updates->register(
235 array(
236 'id' => 'v1817_cleanup_user_roles',
237 'version' => '1.8.17',
238 'callback' => 'give_v1817_cleanup_user_roles',
239 )
240 );
241
242 // v1.8.18 Upgrades for assigning custom amount to existing set donations.
243 $give_updates->register(
244 array(
245 'id' => 'v1818_assign_custom_amount_set_donation',
246 'version' => '1.8.18',
247 'callback' => 'give_v1818_assign_custom_amount_set_donation',
248 )
249 );
250
251 // v1.8.18 Cleanup the Give Worker Role Caps.
252 $give_updates->register(
253 array(
254 'id' => 'v1818_give_worker_role_cleanup',
255 'version' => '1.8.18',
256 'callback' => 'give_v1818_give_worker_role_cleanup',
257 )
258 );
259
260 // v2.0.0 Upgrades
261 $give_updates->register(
262 array(
263 'id' => 'v20_upgrades_form_metadata',
264 'version' => '2.0.0',
265 'callback' => 'give_v20_upgrades_form_metadata_callback',
266 )
267 );
268
269 // v2.0.0 User Address Upgrades
270 $give_updates->register(
271 array(
272 'id' => 'v20_upgrades_user_address',
273 'version' => '2.0.0',
274 'callback' => 'give_v20_upgrades_user_address',
275 )
276 );
277
278 // v2.0.0 Upgrades
279 $give_updates->register(
280 array(
281 'id' => 'v20_upgrades_payment_metadata',
282 'version' => '2.0.0',
283 'callback' => 'give_v20_upgrades_payment_metadata_callback',
284 )
285 );
286
287 // v2.0.0 Upgrades
288 $give_updates->register(
289 array(
290 'id' => 'v20_logs_upgrades',
291 'version' => '2.0.0',
292 'callback' => 'give_v20_logs_upgrades_callback',
293
294 )
295 );
296
297 // v2.0.0 Donor Name Upgrades
298 $give_updates->register(
299 array(
300 'id' => 'v20_upgrades_donor_name',
301 'version' => '2.0.0',
302 'callback' => 'give_v20_upgrades_donor_name',
303 )
304 );
305
306 // v2.0.0 Upgrades
307 $give_updates->register(
308 array(
309 'id' => 'v20_move_metadata_into_new_table',
310 'version' => '2.0.0',
311 'callback' => 'give_v20_move_metadata_into_new_table_callback',
312 'depend' => array( 'v20_upgrades_payment_metadata', 'v20_upgrades_form_metadata' ),
313 )
314 );
315
316 // v2.0.0 Upgrades
317 $give_updates->register(
318 array(
319 'id' => 'v20_rename_donor_tables',
320 'version' => '2.0.0',
321 'callback' => 'give_v20_rename_donor_tables_callback',
322 'depend' => array(
323 'v20_move_metadata_into_new_table',
324 'v20_logs_upgrades',
325 'v20_upgrades_form_metadata',
326 'v20_upgrades_payment_metadata',
327 'v20_upgrades_user_address',
328 'v20_upgrades_donor_name',
329 ),
330 )
331 );
332
333 // v2.0.1 Upgrades
334 $give_updates->register(
335 array(
336 'id' => 'v201_upgrades_payment_metadata',
337 'version' => '2.0.1',
338 'callback' => 'give_v201_upgrades_payment_metadata_callback',
339 )
340 );
341
342 // v2.0.1 Upgrades
343 $give_updates->register(
344 array(
345 'id' => 'v201_add_missing_donors',
346 'version' => '2.0.1',
347 'callback' => 'give_v201_add_missing_donors_callback',
348 )
349 );
350
351 // Run v2.0.0 Upgrades again in 2.0.1
352 $give_updates->register(
353 array(
354 'id' => 'v201_move_metadata_into_new_table',
355 'version' => '2.0.1',
356 'callback' => 'give_v201_move_metadata_into_new_table_callback',
357 'depend' => array( 'v201_upgrades_payment_metadata', 'v201_add_missing_donors' ),
358 )
359 );
360
361 // Run v2.0.0 Upgrades again in 2.0.1
362 $give_updates->register(
363 array(
364 'id' => 'v201_logs_upgrades',
365 'version' => '2.0.1',
366 'callback' => 'give_v201_logs_upgrades_callback',
367 )
368 );
369
370 // v2.1 Verify Form Status Upgrade.
371 $give_updates->register(
372 array(
373 'id' => 'v210_verify_form_status_upgrades',
374 'version' => '2.1.0',
375 'callback' => 'give_v210_verify_form_status_upgrades_callback',
376 )
377 );
378
379 // v2.1.3 Delete non attached donation meta.
380 $give_updates->register(
381 array(
382 'id' => 'v213_delete_donation_meta',
383 'version' => '2.1.3',
384 'callback' => 'give_v213_delete_donation_meta_callback',
385 'depends' => array( 'v201_move_metadata_into_new_table' ),
386 )
387 );
388
389 // v2.1.5 Add additional capability to the give_manager role.
390 $give_updates->register(
391 array(
392 'id' => 'v215_update_donor_user_roles',
393 'version' => '2.1.5',
394 'callback' => 'give_v215_update_donor_user_roles_callback',
395 )
396 );
397
398 // v2.2.4 set each donor to anonymous by default.
399 $give_updates->register(
400 array(
401 'id' => 'v224_update_donor_meta',
402 'version' => '2.2.4',
403 'callback' => 'give_v224_update_donor_meta_callback',
404 )
405 );
406
407 // v2.2.4 Associate form IDs with donor meta of anonymous donations.
408 $give_updates->register(
409 array(
410 'id' => 'v224_update_donor_meta_forms_id',
411 'version' => '2.2.4',
412 'callback' => 'give_v224_update_donor_meta_forms_id_callback',
413 'depend' => 'v224_update_donor_meta',
414 )
415 );
416
417 // v2.3.0 Move donor notes to custom comment table.
418 $give_updates->register(
419 array(
420 'id' => 'v230_move_donor_note',
421 'version' => '2.3.0',
422 'callback' => 'give_v230_move_donor_note_callback',
423 )
424 );
425
426 // v2.3.0 Move donation notes to custom comment table.
427 $give_updates->register(
428 array(
429 'id' => 'v230_move_donation_note',
430 'version' => '2.3.0',
431 'callback' => 'give_v230_move_donation_note_callback',
432 )
433 );
434
435 // v2.3.0 remove donor wall related donor meta data.
436 $give_updates->register(
437 array(
438 'id' => 'v230_delete_donor_wall_related_donor_data',
439 'version' => '2.3.0',
440 'depend' => array(
441 'v224_update_donor_meta',
442 'v224_update_donor_meta_forms_id',
443 'v230_move_donor_note',
444 'v230_move_donation_note'
445 ),
446 'callback' => 'give_v230_delete_dw_related_donor_data_callback',
447 )
448 );
449
450 // v2.3.0 remove donor wall related comment meta data.
451 $give_updates->register(
452 array(
453 'id' => 'v230_delete_donor_wall_related_comment_data',
454 'version' => '2.3.0',
455 'callback' => 'give_v230_delete_dw_related_comment_data_callback',
456 'depend' => array(
457 'v230_move_donor_note',
458 'v230_move_donation_note'
459 ),
460 )
461 );
462
463 // v2.4.0 Update donation form goal progress data.
464 $give_updates->register(
465 array(
466 'id' => 'v240_update_form_goal_progress',
467 'version' => '2.4.0',
468 'callback' => 'give_v240_update_form_goal_progress_callback',
469 )
470 );
471
472 // v2.4.1 Update to remove sale type log
473 $give_updates->register(
474 array(
475 'id' => 'v241_remove_sale_logs',
476 'version' => '2.4.1',
477 'callback' => 'give_v241_remove_sale_logs_callback',
478 'depend' => array( 'v201_logs_upgrades' ),
479 )
480 );
481
482 }
483
484 add_action( 'give_register_updates', 'give_show_upgrade_notices' );
485
486 /**
487 * Triggers all upgrade functions
488 *
489 * This function is usually triggered via AJAX
490 *
491 * @since 1.0
492 * @return void
493 */
494 function give_trigger_upgrades() {
495
496 if ( ! current_user_can( 'manage_give_settings' ) ) {
497 wp_die(
498 esc_html__( 'You do not have permission to do Give upgrades.', 'give' ), esc_html__( 'Error', 'give' ), array(
499 'response' => 403,
500 )
501 );
502 }
503
504 $give_version = get_option( 'give_version' );
505
506 if ( ! $give_version ) {
507 // 1.0 is the first version to use this option so we must add it.
508 $give_version = '1.0';
509 add_option( 'give_version', $give_version, '', false );
510 }
511
512 update_option( 'give_version', GIVE_VERSION, false );
513 delete_option( 'give_doing_upgrade' );
514
515 if ( DOING_AJAX ) {
516 die( 'complete' );
517 } // End if().
518 }
519
520 add_action( 'wp_ajax_give_trigger_upgrades', 'give_trigger_upgrades' );
521
522
523 /**
524 * Upgrades the
525 *
526 * Standardizes the discrepancies between two metakeys `_give_payment_customer_id` and `_give_payment_donor_id`
527 *
528 * @since 1.3.2
529 */
530 function give_v132_upgrade_give_payment_customer_id() {
531 global $wpdb;
532
533 /* @var Give_Updates $give_updates */
534 $give_updates = Give_Updates::get_instance();
535
536 // UPDATE DB METAKEYS.
537 $sql = "UPDATE $wpdb->postmeta SET meta_key = '_give_payment_customer_id' WHERE meta_key = '_give_payment_donor_id'";
538 $query = $wpdb->query( $sql );
539
540 $give_updates->percentage = 100;
541 give_set_upgrade_complete( 'upgrade_give_payment_customer_id' );
542 }
543
544
545 /**
546 * Upgrades the Offline Status
547 *
548 * Reverses the issue where offline donations in "pending" status where inappropriately marked as abandoned
549 *
550 * @since 1.3.4
551 */
552 function give_v134_upgrade_give_offline_status() {
553 global $wpdb;
554
555 /* @var Give_Updates $give_updates */
556 $give_updates = Give_Updates::get_instance();
557
558 // Get abandoned offline payments.
559 $select = "SELECT ID FROM $wpdb->posts p ";
560 $join = "LEFT JOIN $wpdb->postmeta m ON p.ID = m.post_id ";
561 $where = "WHERE p.post_type = 'give_payment' ";
562 $where .= "AND ( p.post_status = 'abandoned' )";
563 $where .= "AND ( m.meta_key = '_give_payment_gateway' AND m.meta_value = 'offline' )";
564
565 $sql = $select . $join . $where;
566 $found_payments = $wpdb->get_col( $sql );
567
568 foreach ( $found_payments as $payment ) {
569
570 // Only change ones marked abandoned since our release last week because the admin may have marked some abandoned themselves.
571 $modified_time = get_post_modified_time( 'U', false, $payment );
572
573 // 1450124863 = 12/10/2015 20:42:25.
574 if ( $modified_time >= 1450124863 ) {
575
576 give_update_payment_status( $payment, 'pending' );
577
578 }
579 }
580
581 $give_updates->percentage = 100;
582 give_set_upgrade_complete( 'upgrade_give_offline_status' );
583 }
584
585
586 /**
587 * Cleanup User Roles
588 *
589 * This upgrade routine removes unused roles and roles with typos
590 *
591 * @since 1.5.2
592 */
593 function give_v152_cleanup_users() {
594
595 $give_version = get_option( 'give_version' );
596
597 if ( ! $give_version ) {
598 // 1.0 is the first version to use this option so we must add it.
599 $give_version = '1.0';
600 }
601
602 $give_version = preg_replace( '/[^0-9.].*/', '', $give_version );
603
604 // v1.5.2 Upgrades
605 if ( version_compare( $give_version, '1.5.2', '<' ) || ! give_has_upgrade_completed( 'upgrade_give_user_caps_cleanup' ) ) {
606
607 // Delete all caps with "ss".
608 // Also delete all unused "campaign" roles.
609 $delete_caps = array(
610 'delete_give_formss',
611 'delete_others_give_formss',
612 'delete_private_give_formss',
613 'delete_published_give_formss',
614 'read_private_forms',
615 'edit_give_formss',
616 'edit_others_give_formss',
617 'edit_private_give_formss',
618 'edit_published_give_formss',
619 'publish_give_formss',
620 'read_private_give_formss',
621 'assign_give_campaigns_terms',
622 'delete_give_campaigns',
623 'delete_give_campaigns_terms',
624 'delete_give_campaignss',
625 'delete_others_give_campaignss',
626 'delete_private_give_campaignss',
627 'delete_published_give_campaignss',
628 'edit_give_campaigns',
629 'edit_give_campaigns_terms',
630 'edit_give_campaignss',
631 'edit_others_give_campaignss',
632 'edit_private_give_campaignss',
633 'edit_published_give_campaignss',
634 'manage_give_campaigns_terms',
635 'publish_give_campaignss',
636 'read_give_campaigns',
637 'read_private_give_campaignss',
638 'view_give_campaigns_stats',
639 'delete_give_paymentss',
640 'delete_others_give_paymentss',
641 'delete_private_give_paymentss',
642 'delete_published_give_paymentss',
643 'edit_give_paymentss',
644 'edit_others_give_paymentss',
645 'edit_private_give_paymentss',
646 'edit_published_give_paymentss',
647 'publish_give_paymentss',
648 'read_private_give_paymentss',
649 );
650
651 global $wp_roles;
652 foreach ( $delete_caps as $cap ) {
653 foreach ( array_keys( $wp_roles->roles ) as $role ) {
654 $wp_roles->remove_cap( $role, $cap );
655 }
656 }
657
658 // Create Give plugin roles.
659 $roles = new Give_Roles();
660 $roles->add_roles();
661 $roles->add_caps();
662
663 // The Update Ran.
664 update_option( 'give_version', preg_replace( '/[^0-9.].*/', '', GIVE_VERSION ), false );
665 give_set_upgrade_complete( 'upgrade_give_user_caps_cleanup' );
666 delete_option( 'give_doing_upgrade' );
667
668 }// End if().
669
670 }
671
672 add_action( 'admin_init', 'give_v152_cleanup_users' );
673
674 /**
675 * 1.6 Upgrade routine to create the customer meta table.
676 *
677 * @since 1.6
678 * @return void
679 */
680 function give_v16_upgrades() {
681 // Create the donor databases.
682 $donors_db = new Give_DB_Donors();
683 $donors_db->create_table();
684 $donor_meta = new Give_DB_Donor_Meta();
685 $donor_meta->create_table();
686 }
687
688 /**
689 * 1.7 Upgrades.
690 *
691 * a. Update license api data for plugin addons.
692 * b. Cleanup user roles.
693 *
694 * @since 1.7
695 * @return void
696 */
697 function give_v17_upgrades() {
698 // Upgrade license data.
699 give_v17_upgrade_addon_license_data();
700 give_v17_cleanup_roles();
701 }
702
703 /**
704 * Upgrade license data
705 *
706 * @since 1.7
707 */
708 function give_v17_upgrade_addon_license_data() {
709 $give_options = give_get_settings();
710
711 $api_url = 'https://givewp.com/give-sl-api/';
712
713 // Get addons license key.
714 $addons = array();
715 foreach ( $give_options as $key => $value ) {
716 if ( false !== strpos( $key, '_license_key' ) ) {
717 $addons[ $key ] = $value;
718 }
719 }
720
721 // Bailout: We do not have any addon license data to upgrade.
722 if ( empty( $addons ) ) {
723 return false;
724 }
725
726 foreach ( $addons as $key => $addon_license ) {
727
728 // Get addon shortname.
729 $shortname = str_replace( '_license_key', '', $key );
730
731 // Addon license option name.
732 $addon_license_option_name = $shortname . '_license_active';
733
734 // bailout if license is empty.
735 if ( empty( $addon_license ) ) {
736 delete_option( $addon_license_option_name );
737 continue;
738 }
739
740 // Get addon name.
741 $addon_name = array();
742 $addon_name_parts = explode( '_', str_replace( 'give_', '', $shortname ) );
743 foreach ( $addon_name_parts as $name_part ) {
744
745 // Fix addon name
746 switch ( $name_part ) {
747 case 'authorizenet':
748 $name_part = 'authorize.net';
749 break;
750 }
751
752 $addon_name[] = ucfirst( $name_part );
753 }
754
755 $addon_name = implode( ' ', $addon_name );
756
757 // Data to send to the API.
758 $api_params = array(
759 'edd_action' => 'activate_license', // never change from "edd_" to "give_"!
760 'license' => $addon_license,
761 'item_name' => urlencode( $addon_name ),
762 'url' => home_url(),
763 );
764
765 // Call the API.
766 $response = wp_remote_post(
767 $api_url,
768 array(
769 'timeout' => 15,
770 'sslverify' => false,
771 'body' => $api_params,
772 )
773 );
774
775 // Make sure there are no errors.
776 if ( is_wp_error( $response ) ) {
777 delete_option( $addon_license_option_name );
778 continue;
779 }
780
781 // Tell WordPress to look for updates.
782 set_site_transient( 'update_plugins', null );
783
784 // Decode license data.
785 $license_data = json_decode( wp_remote_retrieve_body( $response ) );
786 update_option( $addon_license_option_name, $license_data, false );
787 }// End foreach().
788 }
789
790
791 /**
792 * Cleanup User Roles.
793 *
794 * This upgrade routine removes unused roles and roles with typos.
795 *
796 * @since 1.7
797 */
798 function give_v17_cleanup_roles() {
799
800 // Delete all caps with "_give_forms_" and "_give_payments_".
801 // These roles have no usage; the proper is singular.
802 $delete_caps = array(
803 'view_give_forms_stats',
804 'delete_give_forms_terms',
805 'assign_give_forms_terms',
806 'edit_give_forms_terms',
807 'manage_give_forms_terms',
808 'view_give_payments_stats',
809 'manage_give_payments_terms',
810 'edit_give_payments_terms',
811 'assign_give_payments_terms',
812 'delete_give_payments_terms',
813 );
814
815 global $wp_roles;
816 foreach ( $delete_caps as $cap ) {
817 foreach ( array_keys( $wp_roles->roles ) as $role ) {
818 $wp_roles->remove_cap( $role, $cap );
819 }
820 }
821
822 // Set roles again.
823 $roles = new Give_Roles();
824 $roles->add_roles();
825 $roles->add_caps();
826
827 }
828
829 /**
830 * 1.8 Upgrades.
831 *
832 * a. Upgrade checkbox settings to radio button settings.
833 * a. Update form meta for new metabox settings.
834 *
835 * @since 1.8
836 * @return void
837 */
838 function give_v18_upgrades() {
839 // Upgrade checkbox settings to radio button settings.
840 give_v18_upgrades_core_setting();
841 }
842
843 /**
844 * Upgrade core settings.
845 *
846 * @since 1.8
847 * @return void
848 */
849 function give_v18_upgrades_core_setting() {
850 // Core settings which changes from checkbox to radio.
851 $core_setting_names = array_merge(
852 array_keys( give_v18_renamed_core_settings() ),
853 array(
854 'uninstall_on_delete',
855 'scripts_footer',
856 'test_mode',
857 'email_access',
858 'terms',
859 'give_offline_donation_enable_billing_fields',
860 )
861 );
862
863 // Bailout: If not any setting define.
864 if ( $give_settings = get_option( 'give_settings' ) ) {
865
866 $setting_changed = false;
867
868 // Loop: check each setting field.
869 foreach ( $core_setting_names as $setting_name ) {
870 // New setting name.
871 $new_setting_name = preg_replace( '/^(enable_|disable_)/', '', $setting_name );
872
873 // Continue: If setting already set.
874 if (
875 array_key_exists( $new_setting_name, $give_settings )
876 && in_array( $give_settings[ $new_setting_name ], array( 'enabled', 'disabled' ) )
877 ) {
878 continue;
879 }
880
881 // Set checkbox value to radio value.
882 $give_settings[ $setting_name ] = ( ! empty( $give_settings[ $setting_name ] ) && 'on' === $give_settings[ $setting_name ] ? 'enabled' : 'disabled' );
883
884 // @see https://github.com/impress-org/give/issues/1063.
885 if ( false !== strpos( $setting_name, 'disable_' ) ) {
886
887 $give_settings[ $new_setting_name ] = ( give_is_setting_enabled( $give_settings[ $setting_name ] ) ? 'disabled' : 'enabled' );
888 } elseif ( false !== strpos( $setting_name, 'enable_' ) ) {
889
890 $give_settings[ $new_setting_name ] = ( give_is_setting_enabled( $give_settings[ $setting_name ] ) ? 'enabled' : 'disabled' );
891 }
892
893 // Tell bot to update core setting to db.
894 if ( ! $setting_changed ) {
895 $setting_changed = true;
896 }
897 }
898
899 // Update setting only if they changed.
900 if ( $setting_changed ) {
901 update_option( 'give_settings', $give_settings, false );
902 }
903 }// End if().
904
905 give_set_upgrade_complete( 'v18_upgrades_core_setting' );
906 }
907
908 /**
909 * Upgrade form metadata for new metabox settings.
910 *
911 * @since 1.8
912 * @return void
913 */
914 function give_v18_upgrades_form_metadata() {
915 /* @var Give_Updates $give_updates */
916 $give_updates = Give_Updates::get_instance();
917
918 // form query
919 $forms = new WP_Query(
920 array(
921 'paged' => $give_updates->step,
922 'status' => 'any',
923 'order' => 'ASC',
924 'post_type' => 'give_forms',
925 'posts_per_page' => 20,
926 )
927 );
928
929 if ( $forms->have_posts() ) {
930 $give_updates->set_percentage( $forms->found_posts, ( $give_updates->step * 20 ) );
931
932 while ( $forms->have_posts() ) {
933 $forms->the_post();
934
935 // Form content.
936 // Note in version 1.8 display content setting split into display content and content placement setting.
937 // You can delete _give_content_option in future.
938 $show_content = give_get_meta( get_the_ID(), '_give_content_option', true );
939 if ( $show_content && ! give_get_meta( get_the_ID(), '_give_display_content', true ) ) {
940 $field_value = ( 'none' !== $show_content ? 'enabled' : 'disabled' );
941 give_update_meta( get_the_ID(), '_give_display_content', $field_value );
942
943 $field_value = ( 'none' !== $show_content ? $show_content : 'give_pre_form' );
944 give_update_meta( get_the_ID(), '_give_content_placement', $field_value );
945 }
946
947 // "Disable" Guest Donation. Checkbox.
948 // See: https://github.com/impress-org/give/issues/1470.
949 $guest_donation = give_get_meta( get_the_ID(), '_give_logged_in_only', true );
950 $guest_donation_newval = ( in_array( $guest_donation, array( 'yes', 'on' ) ) ? 'disabled' : 'enabled' );
951 give_update_meta( get_the_ID(), '_give_logged_in_only', $guest_donation_newval );
952
953 // Offline Donations.
954 // See: https://github.com/impress-org/give/issues/1579.
955 $offline_donation = give_get_meta( get_the_ID(), '_give_customize_offline_donations', true );
956 if ( 'no' === $offline_donation ) {
957 $offline_donation_newval = 'global';
958 } elseif ( 'yes' === $offline_donation ) {
959 $offline_donation_newval = 'enabled';
960 } else {
961 $offline_donation_newval = 'disabled';
962 }
963 give_update_meta( get_the_ID(), '_give_customize_offline_donations', $offline_donation_newval );
964
965 // Convert yes/no setting field to enabled/disabled.
966 $form_radio_settings = array(
967 // Custom Amount.
968 '_give_custom_amount',
969
970 // Donation Gaol.
971 '_give_goal_option',
972
973 // Close Form.
974 '_give_close_form_when_goal_achieved',
975
976 // Term & conditions.
977 '_give_terms_option',
978
979 // Billing fields.
980 '_give_offline_donation_enable_billing_fields_single',
981 );
982
983 foreach ( $form_radio_settings as $meta_key ) {
984 // Get value.
985 $field_value = give_get_meta( get_the_ID(), $meta_key, true );
986
987 // Convert meta value only if it is in yes/no/none.
988 if ( in_array( $field_value, array( 'yes', 'on', 'no', 'none' ) ) ) {
989
990 $field_value = ( in_array( $field_value, array( 'yes', 'on' ) ) ? 'enabled' : 'disabled' );
991 give_update_meta( get_the_ID(), $meta_key, $field_value );
992 }
993 }
994 }// End while().
995
996 wp_reset_postdata();
997
998 } else {
999 // No more forms found, finish up.
1000 give_set_upgrade_complete( 'v18_upgrades_form_metadata' );
1001 }
1002 }
1003
1004
1005 /**
1006 * Get list of core setting renamed in version 1.8.
1007 *
1008 * @since 1.8
1009 * @return array
1010 */
1011 function give_v18_renamed_core_settings() {
1012 return array(
1013 'disable_paypal_verification' => 'paypal_verification',
1014 'disable_css' => 'css',
1015 'disable_welcome' => 'welcome',
1016 'disable_forms_singular' => 'forms_singular',
1017 'disable_forms_archives' => 'forms_archives',
1018 'disable_forms_excerpt' => 'forms_excerpt',
1019 'disable_form_featured_img' => 'form_featured_img',
1020 'disable_form_sidebar' => 'form_sidebar',
1021 'disable_admin_notices' => 'admin_notices',
1022 'disable_the_content_filter' => 'the_content_filter',
1023 'enable_floatlabels' => 'floatlabels',
1024 'enable_categories' => 'categories',
1025 'enable_tags' => 'tags',
1026 );
1027 }
1028
1029
1030 /**
1031 * Upgrade core settings.
1032 *
1033 * @since 1.8.7
1034 * @return void
1035 */
1036 function give_v187_upgrades() {
1037 global $wpdb;
1038
1039 /**
1040 * Upgrade 1: Remove stat and cache transients.
1041 */
1042 $cached_options = $wpdb->get_col(
1043 $wpdb->prepare(
1044 "
1045 SELECT *
1046 FROM {$wpdb->options}
1047 WHERE (
1048 option_name LIKE %s
1049 OR option_name LIKE %s
1050 OR option_name LIKE %s
1051 OR option_name LIKE %s
1052 OR option_name LIKE %s
1053 OR option_name LIKE %s
1054 OR option_name LIKE %s
1055 OR option_name LIKE %s
1056 OR option_name LIKE %s
1057 OR option_name LIKE %s
1058 OR option_name LIKE %s
1059 OR option_name LIKE %s
1060 OR option_name LIKE %s
1061 )
1062 ",
1063 array(
1064 '%_transient_give_stats_%',
1065 'give_cache%',
1066 '%_transient_give_add_ons_feed%',
1067 '%_transient__give_ajax_works' .
1068 '%_transient_give_total_api_keys%',
1069 '%_transient_give_i18n_give_promo_hide%',
1070 '%_transient_give_contributors%',
1071 '%_transient_give_estimated_monthly_stats%',
1072 '%_transient_give_earnings_total%',
1073 '%_transient_give_i18n_give_%',
1074 '%_transient__give_installed%',
1075 '%_transient__give_activation_redirect%',
1076 '%_transient__give_hide_license_notices_shortly_%',
1077 '%give_income_total%',
1078 )
1079 ),
1080 1
1081 );
1082
1083 // User related transients.
1084 $user_apikey_options = $wpdb->get_results(
1085 $wpdb->prepare(
1086 "SELECT user_id, meta_key
1087 FROM $wpdb->usermeta
1088 WHERE meta_value=%s",
1089 'give_user_public_key'
1090 ),
1091 ARRAY_A
1092 );
1093
1094 if ( ! empty( $user_apikey_options ) ) {
1095 foreach ( $user_apikey_options as $user ) {
1096 $cached_options[] = '_transient_' . md5( 'give_api_user_' . $user['meta_key'] );
1097 $cached_options[] = '_transient_' . md5( 'give_api_user_public_key' . $user['user_id'] );
1098 $cached_options[] = '_transient_' . md5( 'give_api_user_secret_key' . $user['user_id'] );
1099 }
1100 }
1101
1102 if ( ! empty( $cached_options ) ) {
1103 foreach ( $cached_options as $option ) {
1104 switch ( true ) {
1105 case ( false !== strpos( $option, 'transient' ) ):
1106 $option = str_replace( '_transient_', '', $option );
1107 delete_transient( $option );
1108 break;
1109
1110 default:
1111 delete_option( $option );
1112 }
1113 }
1114 }
1115 }
1116
1117 /**
1118 * Update Capabilities for Give_Worker User Role.
1119 *
1120 * This upgrade routine will update access rights for Give_Worker User Role.
1121 *
1122 * @since 1.8.8
1123 */
1124 function give_v188_upgrades() {
1125
1126 global $wp_roles;
1127
1128 // Get the role object.
1129 $give_worker = get_role( 'give_worker' );
1130
1131 // A list of capabilities to add for give workers.
1132 $caps_to_add = array(
1133 'edit_posts',
1134 'edit_pages',
1135 );
1136
1137 foreach ( $caps_to_add as $cap ) {
1138 // Add the capability.
1139 $give_worker->add_cap( $cap );
1140 }
1141
1142 }
1143
1144 /**
1145 * Update Post meta for minimum and maximum amount for multi level donation forms
1146 *
1147 * This upgrade routine adds post meta for give_forms CPT for multi level donation form.
1148 *
1149 * @since 1.8.9
1150 */
1151 function give_v189_upgrades_levels_post_meta_callback() {
1152 /* @var Give_Updates $give_updates */
1153 $give_updates = Give_Updates::get_instance();
1154
1155 // form query.
1156 $donation_forms = new WP_Query(
1157 array(
1158 'paged' => $give_updates->step,
1159 'status' => 'any',
1160 'order' => 'ASC',
1161 'post_type' => 'give_forms',
1162 'posts_per_page' => 20,
1163 )
1164 );
1165
1166 if ( $donation_forms->have_posts() ) {
1167 $give_updates->set_percentage( $donation_forms->found_posts, ( $give_updates->step * 20 ) );
1168
1169 while ( $donation_forms->have_posts() ) {
1170 $donation_forms->the_post();
1171 $form_id = get_the_ID();
1172
1173 // Remove formatting from _give_set_price.
1174 update_post_meta(
1175 $form_id,
1176 '_give_set_price',
1177 give_sanitize_amount( get_post_meta( $form_id, '_give_set_price', true ) )
1178 );
1179
1180 // Remove formatting from _give_custom_amount_minimum.
1181 update_post_meta(
1182 $form_id,
1183 '_give_custom_amount_minimum',
1184 give_sanitize_amount( get_post_meta( $form_id, '_give_custom_amount_minimum', true ) )
1185 );
1186
1187 // Bailout.
1188 if ( 'set' === get_post_meta( $form_id, '_give_price_option', true ) ) {
1189 continue;
1190 }
1191
1192 $donation_levels = get_post_meta( $form_id, '_give_donation_levels', true );
1193
1194 if ( ! empty( $donation_levels ) ) {
1195
1196 foreach ( $donation_levels as $index => $donation_level ) {
1197 if ( isset( $donation_level['_give_amount'] ) ) {
1198 $donation_levels[ $index ]['_give_amount'] = give_sanitize_amount( $donation_level['_give_amount'] );
1199 }
1200 }
1201
1202 update_post_meta( $form_id, '_give_donation_levels', $donation_levels );
1203
1204 $donation_levels_amounts = wp_list_pluck( $donation_levels, '_give_amount' );
1205
1206 $min_amount = min( $donation_levels_amounts );
1207 $max_amount = max( $donation_levels_amounts );
1208
1209 // Set Minimum and Maximum amount for Multi Level Donation Forms
1210 give_update_meta( $form_id, '_give_levels_minimum_amount', $min_amount ? give_sanitize_amount( $min_amount ) : 0 );
1211 give_update_meta( $form_id, '_give_levels_maximum_amount', $max_amount ? give_sanitize_amount( $max_amount ) : 0 );
1212 }
1213 }
1214
1215 /* Restore original Post Data */
1216 wp_reset_postdata();
1217 } else {
1218 // The Update Ran.
1219 give_set_upgrade_complete( 'v189_upgrades_levels_post_meta' );
1220 }
1221
1222 }
1223
1224
1225 /**
1226 * Give version 1.8.9 upgrades
1227 *
1228 * @since 1.8.9
1229 */
1230 function give_v189_upgrades() {
1231 /**
1232 * 1. Remove user license related notice show blocked ( Give_Notice will handle )
1233 */
1234 global $wpdb;
1235
1236 // Delete permanent notice blocker.
1237 $wpdb->query(
1238 $wpdb->prepare(
1239 "
1240 DELETE FROM $wpdb->usermeta
1241 WHERE meta_key
1242 LIKE '%%%s%%'
1243 ",
1244 '_give_hide_license_notices_permanently'
1245 )
1246 );
1247
1248 // Delete short notice blocker.
1249 $wpdb->query(
1250 $wpdb->prepare(
1251 "
1252 DELETE FROM $wpdb->options
1253 WHERE option_name
1254 LIKE '%%%s%%'
1255 ",
1256 '__give_hide_license_notices_shortly_'
1257 )
1258 );
1259 }
1260
1261 /**
1262 * 2.0 Upgrades.
1263 *
1264 * @since 2.0
1265 * @return void
1266 */
1267 function give_v20_upgrades() {
1268 // Update cache setting.
1269 give_update_option( 'cache', 'enabled' );
1270
1271 // Upgrade email settings.
1272 give_v20_upgrades_email_setting();
1273 }
1274
1275 /**
1276 * Move old email api settings to new email setting api for following emails:
1277 * 1. new offline donation [This was hard coded]
1278 * 2. offline donation instruction
1279 * 3. new donation
1280 * 4. donation receipt
1281 *
1282 * @since 2.0
1283 */
1284 function give_v20_upgrades_email_setting() {
1285 $all_setting = give_get_settings();
1286
1287 // Bailout on fresh install.
1288 if ( empty( $all_setting ) ) {
1289 return;
1290 }
1291
1292 $settings = array(
1293 'offline_donation_subject' => 'offline-donation-instruction_email_subject',
1294 'global_offline_donation_email' => 'offline-donation-instruction_email_message',
1295 'donation_subject' => 'donation-receipt_email_subject',
1296 'donation_receipt' => 'donation-receipt_email_message',
1297 'donation_notification_subject' => 'new-donation_email_subject',
1298 'donation_notification' => 'new-donation_email_message',
1299 'admin_notice_emails' => array(
1300 'new-donation_recipient',
1301 'new-offline-donation_recipient',
1302 'new-donor-register_recipient',
1303 ),
1304 'admin_notices' => 'new-donation_notification',
1305 );
1306
1307 foreach ( $settings as $old_setting => $new_setting ) {
1308 // Do not update already modified
1309 if ( ! is_array( $new_setting ) ) {
1310 if ( array_key_exists( $new_setting, $all_setting ) || ! array_key_exists( $old_setting, $all_setting ) ) {
1311 continue;
1312 }
1313 }
1314
1315 switch ( $old_setting ) {
1316 case 'admin_notices':
1317 $notification_status = give_get_option( $old_setting, 'enabled' );
1318
1319 give_update_option( $new_setting, $notification_status );
1320
1321 // @todo: Delete this option later ( version > 2.0 ), We need this for per form email addon.
1322 // give_delete_option( $old_setting );
1323 break;
1324
1325 // @todo: Delete this option later ( version > 2.0 ) because we need this for backward compatibility give_get_admin_notice_emails.
1326 case 'admin_notice_emails':
1327 $recipients = give_get_admin_notice_emails();
1328
1329 foreach ( $new_setting as $setting ) {
1330 // bailout if setting already exist.
1331 if ( array_key_exists( $setting, $all_setting ) ) {
1332 continue;
1333 }
1334
1335 give_update_option( $setting, $recipients );
1336 }
1337 break;
1338
1339 default:
1340 give_update_option( $new_setting, give_get_option( $old_setting ) );
1341 give_delete_option( $old_setting );
1342 }
1343 }
1344 }
1345
1346 /**
1347 * Give version 1.8.9 upgrades
1348 *
1349 * @since 1.8.9
1350 */
1351 function give_v1812_upgrades() {
1352 /**
1353 * Validate number format settings.
1354 */
1355 $give_settings = give_get_settings();
1356 $give_setting_updated = false;
1357
1358 if ( $give_settings['thousands_separator'] === $give_settings['decimal_separator'] ) {
1359 $give_settings['number_decimals'] = 0;
1360 $give_settings['decimal_separator'] = '';
1361 $give_setting_updated = true;
1362
1363 } elseif ( empty( $give_settings['decimal_separator'] ) ) {
1364 $give_settings['number_decimals'] = 0;
1365 $give_setting_updated = true;
1366
1367 } elseif ( 6 < absint( $give_settings['number_decimals'] ) ) {
1368 $give_settings['number_decimals'] = 5;
1369 $give_setting_updated = true;
1370 }
1371
1372 if ( $give_setting_updated ) {
1373 update_option( 'give_settings', $give_settings, false );
1374 }
1375 }
1376
1377
1378 /**
1379 * Give version 1.8.12 update
1380 *
1381 * Standardized amount values to six decimal
1382 *
1383 * @see https://github.com/impress-org/give/issues/1849#issuecomment-315128602
1384 *
1385 * @since 1.8.12
1386 */
1387 function give_v1812_update_amount_values_callback() {
1388 /* @var Give_Updates $give_updates */
1389 $give_updates = Give_Updates::get_instance();
1390
1391 // form query.
1392 $donation_forms = new WP_Query(
1393 array(
1394 'paged' => $give_updates->step,
1395 'status' => 'any',
1396 'order' => 'ASC',
1397 'post_type' => array( 'give_forms', 'give_payment' ),
1398 'posts_per_page' => 20,
1399 )
1400 );
1401 if ( $donation_forms->have_posts() ) {
1402 $give_updates->set_percentage( $donation_forms->found_posts, ( $give_updates->step * 20 ) );
1403
1404 while ( $donation_forms->have_posts() ) {
1405 $donation_forms->the_post();
1406 global $post;
1407
1408 $meta = get_post_meta( $post->ID );
1409
1410 switch ( $post->post_type ) {
1411 case 'give_forms':
1412 // _give_set_price.
1413 if ( ! empty( $meta['_give_set_price'][0] ) ) {
1414 update_post_meta( $post->ID, '_give_set_price', give_sanitize_amount_for_db( $meta['_give_set_price'][0] ) );
1415 }
1416
1417 // _give_custom_amount_minimum.
1418 if ( ! empty( $meta['_give_custom_amount_minimum'][0] ) ) {
1419 update_post_meta( $post->ID, '_give_custom_amount_minimum', give_sanitize_amount_for_db( $meta['_give_custom_amount_minimum'][0] ) );
1420 }
1421
1422 // _give_levels_minimum_amount.
1423 if ( ! empty( $meta['_give_levels_minimum_amount'][0] ) ) {
1424 update_post_meta( $post->ID, '_give_levels_minimum_amount', give_sanitize_amount_for_db( $meta['_give_levels_minimum_amount'][0] ) );
1425 }
1426
1427 // _give_levels_maximum_amount.
1428 if ( ! empty( $meta['_give_levels_maximum_amount'][0] ) ) {
1429 update_post_meta( $post->ID, '_give_levels_maximum_amount', give_sanitize_amount_for_db( $meta['_give_levels_maximum_amount'][0] ) );
1430 }
1431
1432 // _give_set_goal.
1433 if ( ! empty( $meta['_give_set_goal'][0] ) ) {
1434 update_post_meta( $post->ID, '_give_set_goal', give_sanitize_amount_for_db( $meta['_give_set_goal'][0] ) );
1435 }
1436
1437 // _give_form_earnings.
1438 if ( ! empty( $meta['_give_form_earnings'][0] ) ) {
1439 update_post_meta( $post->ID, '_give_form_earnings', give_sanitize_amount_for_db( $meta['_give_form_earnings'][0] ) );
1440 }
1441
1442 // _give_custom_amount_minimum.
1443 if ( ! empty( $meta['_give_donation_levels'][0] ) ) {
1444 $donation_levels = unserialize( $meta['_give_donation_levels'][0] );
1445
1446 foreach ( $donation_levels as $index => $level ) {
1447 if ( empty( $level['_give_amount'] ) ) {
1448 continue;
1449 }
1450
1451 $donation_levels[ $index ]['_give_amount'] = give_sanitize_amount_for_db( $level['_give_amount'] );
1452 }
1453
1454 $meta['_give_donation_levels'] = $donation_levels;
1455 update_post_meta( $post->ID, '_give_donation_levels', $meta['_give_donation_levels'] );
1456 }
1457
1458 break;
1459
1460 case 'give_payment':
1461 // _give_payment_total.
1462 if ( ! empty( $meta['_give_payment_total'][0] ) ) {
1463 update_post_meta( $post->ID, '_give_payment_total', give_sanitize_amount_for_db( $meta['_give_payment_total'][0] ) );
1464 }
1465
1466 break;
1467 }
1468 }
1469
1470 /* Restore original Post Data */
1471 wp_reset_postdata();
1472 } else {
1473 // The Update Ran.
1474 give_set_upgrade_complete( 'v1812_update_amount_values' );
1475 }
1476 }
1477
1478
1479 /**
1480 * Give version 1.8.12 update
1481 *
1482 * Standardized amount values to six decimal for donor
1483 *
1484 * @see https://github.com/impress-org/give/issues/1849#issuecomment-315128602
1485 *
1486 * @since 1.8.12
1487 */
1488 function give_v1812_update_donor_purchase_value_callback() {
1489 /* @var Give_Updates $give_updates */
1490 $give_updates = Give_Updates::get_instance();
1491
1492 // form query.
1493 $donors = Give()->donors->get_donors(
1494 array(
1495 'number' => 20,
1496 'offset' => $give_updates->get_offset( 20 ),
1497 )
1498 );
1499
1500 if ( ! empty( $donors ) ) {
1501 $give_updates->set_percentage( Give()->donors->count(), $give_updates->get_offset( 20 ) );
1502
1503 /* @var Object $donor */
1504 foreach ( $donors as $donor ) {
1505 Give()->donors->update( $donor->id, array( 'purchase_value' => give_sanitize_amount_for_db( $donor->purchase_value ) ) );
1506 }
1507 } else {
1508 // The Update Ran.
1509 give_set_upgrade_complete( 'v1812_update_donor_purchase_values' );
1510 }
1511 }
1512
1513 /**
1514 * Upgrade routine for updating user roles for existing donors.
1515 *
1516 * @since 1.8.13
1517 */
1518 function give_v1813_update_donor_user_roles_callback() {
1519 /* @var Give_Updates $give_updates */
1520 $give_updates = Give_Updates::get_instance();
1521
1522 // Fetch all the existing donors.
1523 $donors = Give()->donors->get_donors(
1524 array(
1525 'number' => 20,
1526 'offset' => $give_updates->get_offset( 20 ),
1527 )
1528 );
1529
1530 if ( ! empty( $donors ) ) {
1531 $give_updates->set_percentage( Give()->donors->count(), $give_updates->get_offset( 20 ) );
1532
1533 /* @var Object $donor */
1534 foreach ( $donors as $donor ) {
1535 $user_id = $donor->user_id;
1536
1537 // Proceed, if donor is attached with user.
1538 if ( $user_id ) {
1539 $user = get_userdata( $user_id );
1540
1541 // Update user role, if user has subscriber role.
1542 if ( is_array( $user->roles ) && in_array( 'subscriber', $user->roles ) ) {
1543 wp_update_user(
1544 array(
1545 'ID' => $user_id,
1546 'role' => 'give_donor',
1547 )
1548 );
1549 }
1550 }
1551 }
1552 } else {
1553 // The Update Ran.
1554 give_set_upgrade_complete( 'v1813_update_donor_user_roles' );
1555 }
1556 }
1557
1558
1559 /**
1560 * Version 1.8.13 automatic updates
1561 *
1562 * @since 1.8.13
1563 */
1564 function give_v1813_upgrades() {
1565 // Update admin setting.
1566 give_update_option( 'donor_default_user_role', 'give_donor' );
1567
1568 // Update Give roles.
1569 $roles = new Give_Roles();
1570 $roles->add_roles();
1571 $roles->add_caps();
1572 }
1573
1574 /**
1575 * Correct currency code for "Iranian Currency" for all of the payments.
1576 *
1577 * @since 1.8.17
1578 */
1579 function give_v1817_update_donation_iranian_currency_code() {
1580 /* @var Give_Updates $give_updates */
1581 $give_updates = Give_Updates::get_instance();
1582
1583 // form query.
1584 $payments = new WP_Query(
1585 array(
1586 'paged' => $give_updates->step,
1587 'status' => 'any',
1588 'order' => 'ASC',
1589 'post_type' => array( 'give_payment' ),
1590 'posts_per_page' => 100,
1591 )
1592 );
1593
1594 if ( $payments->have_posts() ) {
1595 $give_updates->set_percentage( $payments->found_posts, ( $give_updates->step * 100 ) );
1596
1597 while ( $payments->have_posts() ) {
1598 $payments->the_post();
1599
1600 $payment_meta = give_get_payment_meta( get_the_ID() );
1601
1602 if ( 'RIAL' === $payment_meta['currency'] ) {
1603 $payment_meta['currency'] = 'IRR';
1604 give_update_meta( get_the_ID(), '_give_payment_meta', $payment_meta );
1605 }
1606 }
1607 } else {
1608 // The Update Ran.
1609 give_set_upgrade_complete( 'v1817_update_donation_iranian_currency_code' );
1610 }
1611 }
1612
1613 /**
1614 * Correct currency code for "Iranian Currency" in Give setting.
1615 * Version 1.8.17 automatic updates
1616 *
1617 * @since 1.8.17
1618 */
1619 function give_v1817_upgrades() {
1620 $give_settings = give_get_settings();
1621
1622 if ( 'RIAL' === $give_settings['currency'] ) {
1623 $give_settings['currency'] = 'IRR';
1624 update_option( 'give_settings', $give_settings, false );
1625 }
1626 }
1627
1628 /**
1629 * Process Clean up of User Roles for more flexibility.
1630 *
1631 * @since 1.8.17
1632 */
1633 function give_v1817_process_cleanup_user_roles() {
1634
1635 global $wp_roles;
1636
1637 if ( ! ( $wp_roles instanceof WP_Roles ) ) {
1638 return;
1639 }
1640
1641 // Add Capabilities to user roles as required.
1642 $add_caps = array(
1643 'administrator' => array(
1644 'view_give_payments',
1645 ),
1646 );
1647
1648 // Remove Capabilities to user roles as required.
1649 $remove_caps = array(
1650 'give_manager' => array(
1651 'edit_others_pages',
1652 'edit_others_posts',
1653 'delete_others_pages',
1654 'delete_others_posts',
1655 'manage_categories',
1656 'import',
1657 'export',
1658 ),
1659 );
1660
1661 foreach ( $add_caps as $role => $caps ) {
1662 foreach ( $caps as $cap ) {
1663 $wp_roles->add_cap( $role, $cap );
1664 }
1665 }
1666
1667 foreach ( $remove_caps as $role => $caps ) {
1668 foreach ( $caps as $cap ) {
1669 $wp_roles->remove_cap( $role, $cap );
1670 }
1671 }
1672
1673 }
1674
1675 /**
1676 * Upgrade Routine - Clean up of User Roles for more flexibility.
1677 *
1678 * @since 1.8.17
1679 */
1680 function give_v1817_cleanup_user_roles() {
1681 /* @var Give_Updates $give_updates */
1682 $give_updates = Give_Updates::get_instance();
1683
1684 give_v1817_process_cleanup_user_roles();
1685
1686 $give_updates->percentage = 100;
1687
1688 // Create Give plugin roles.
1689 $roles = new Give_Roles();
1690 $roles->add_roles();
1691 $roles->add_caps();
1692
1693 give_set_upgrade_complete( 'v1817_cleanup_user_roles' );
1694 }
1695
1696 /**
1697 * Automatic Upgrade for release 1.8.18.
1698 *
1699 * @since 1.8.18
1700 */
1701 function give_v1818_upgrades() {
1702
1703 // Remove email_access_installed from give_settings.
1704 give_delete_option( 'email_access_installed' );
1705 }
1706
1707 /**
1708 * Upgrade Routine - Assigns Custom Amount to existing donation of type set donation.
1709 *
1710 * @since 1.8.18
1711 */
1712 function give_v1818_assign_custom_amount_set_donation() {
1713
1714 /* @var Give_Updates $give_updates */
1715 $give_updates = Give_Updates::get_instance();
1716
1717 $donations = new WP_Query(
1718 array(
1719 'paged' => $give_updates->step,
1720 'status' => 'any',
1721 'order' => 'ASC',
1722 'post_type' => array( 'give_payment' ),
1723 'posts_per_page' => 100,
1724 )
1725 );
1726
1727 if ( $donations->have_posts() ) {
1728 $give_updates->set_percentage( $donations->found_posts, $give_updates->step * 100 );
1729
1730 while ( $donations->have_posts() ) {
1731 $donations->the_post();
1732
1733 $form = new Give_Donate_Form( give_get_meta( get_the_ID(), '_give_payment_form_id', true ) );
1734 $donation_meta = give_get_payment_meta( get_the_ID() );
1735
1736 // Update Donation meta with price_id set as custom, only if it is:
1737 // 1. Donation Type = Set Donation.
1738 // 2. Donation Price Id is not set to custom.
1739 // 3. Form has not enabled custom price and donation amount assures that it is custom amount.
1740 if (
1741 $form->ID &&
1742 $form->is_set_type_donation_form() &&
1743 ( 'custom' !== $donation_meta['price_id'] ) &&
1744 $form->is_custom_price( give_get_meta( get_the_ID(), '_give_payment_total', true ) )
1745 ) {
1746 $donation_meta['price_id'] = 'custom';
1747 give_update_meta( get_the_ID(), '_give_payment_meta', $donation_meta );
1748 give_update_meta( get_the_ID(), '_give_payment_price_id', 'custom' );
1749 }
1750 }
1751
1752 wp_reset_postdata();
1753 } else {
1754 // Update Ran Successfully.
1755 give_set_upgrade_complete( 'v1818_assign_custom_amount_set_donation' );
1756 }
1757 }
1758
1759 /**
1760 * Upgrade Routine - Removed Give Worker caps.
1761 *
1762 * See: https://github.com/impress-org/give/issues/2476
1763 *
1764 * @since 1.8.18
1765 */
1766 function give_v1818_give_worker_role_cleanup() {
1767
1768 /* @var Give_Updates $give_updates */
1769 $give_updates = Give_Updates::get_instance();
1770
1771 global $wp_roles;
1772
1773 if ( ! ( $wp_roles instanceof WP_Roles ) ) {
1774 return;
1775 }
1776
1777 // Remove Capabilities to user roles as required.
1778 $remove_caps = array(
1779 'give_worker' => array(
1780 'delete_give_payments',
1781 'delete_others_give_payments',
1782 'delete_private_give_payments',
1783 'delete_published_give_payments',
1784 'edit_others_give_payments',
1785 'edit_private_give_payments',
1786 'edit_published_give_payments',
1787 'read_private_give_payments',
1788 ),
1789 );
1790
1791 foreach ( $remove_caps as $role => $caps ) {
1792 foreach ( $caps as $cap ) {
1793 $wp_roles->remove_cap( $role, $cap );
1794 }
1795 }
1796
1797 $give_updates->percentage = 100;
1798
1799 // Create Give plugin roles.
1800 $roles = new Give_Roles();
1801 $roles->add_roles();
1802 $roles->add_caps();
1803
1804 give_set_upgrade_complete( 'v1818_give_worker_role_cleanup' );
1805 }
1806
1807 /**
1808 *
1809 * Upgrade form metadata for new metabox settings.
1810 *
1811 * @since 2.0
1812 * @return void
1813 */
1814 function give_v20_upgrades_form_metadata_callback() {
1815 $give_updates = Give_Updates::get_instance();
1816
1817 // form query
1818 $forms = new WP_Query(
1819 array(
1820 'paged' => $give_updates->step,
1821 'status' => 'any',
1822 'order' => 'ASC',
1823 'post_type' => 'give_forms',
1824 'posts_per_page' => 100,
1825 )
1826 );
1827
1828 if ( $forms->have_posts() ) {
1829 $give_updates->set_percentage( $forms->found_posts, ( $give_updates->step * 100 ) );
1830
1831 while ( $forms->have_posts() ) {
1832 $forms->the_post();
1833 global $post;
1834
1835 // Update offline instruction email notification status.
1836 $offline_instruction_notification_status = get_post_meta( get_the_ID(), '_give_customize_offline_donations', true );
1837 $offline_instruction_notification_status = give_is_setting_enabled(
1838 $offline_instruction_notification_status, array(
1839 'enabled',
1840 'global',
1841 )
1842 )
1843 ? $offline_instruction_notification_status
1844 : 'global';
1845 update_post_meta( get_the_ID(), '_give_offline-donation-instruction_notification', $offline_instruction_notification_status );
1846
1847 // Update offline instruction email message.
1848 update_post_meta(
1849 get_the_ID(),
1850 '_give_offline-donation-instruction_email_message',
1851 get_post_meta(
1852 get_the_ID(),
1853 // @todo: Delete this option later ( version > 2.0 ).
1854 '_give_offline_donation_email',
1855 true
1856 )
1857 );
1858
1859 // Update offline instruction email subject.
1860 update_post_meta(
1861 get_the_ID(),
1862 '_give_offline-donation-instruction_email_subject',
1863 get_post_meta(
1864 get_the_ID(),
1865 // @todo: Delete this option later ( version > 2.0 ).
1866 '_give_offline_donation_subject',
1867 true
1868 )
1869 );
1870
1871 }// End while().
1872
1873 wp_reset_postdata();
1874 } else {
1875 // No more forms found, finish up.
1876 give_set_upgrade_complete( 'v20_upgrades_form_metadata' );
1877 }
1878 }
1879
1880
1881 /**
1882 * Upgrade payment metadata for new metabox settings.
1883 *
1884 * @since 2.0
1885 * @global wpdb $wpdb
1886 * @return void
1887 */
1888 function give_v20_upgrades_payment_metadata_callback() {
1889 global $wpdb;
1890 $give_updates = Give_Updates::get_instance();
1891
1892 // form query
1893 $forms = new WP_Query(
1894 array(
1895 'paged' => $give_updates->step,
1896 'status' => 'any',
1897 'order' => 'ASC',
1898 'post_type' => 'give_payment',
1899 'posts_per_page' => 100,
1900 )
1901 );
1902
1903 if ( $forms->have_posts() ) {
1904 $give_updates->set_percentage( $forms->found_posts, ( $give_updates->step * 100 ) );
1905
1906 while ( $forms->have_posts() ) {
1907 $forms->the_post();
1908 global $post;
1909
1910 // Split _give_payment_meta meta.
1911 // @todo Remove _give_payment_meta after releases 2.0
1912 $payment_meta = give_get_meta( $post->ID, '_give_payment_meta', true );
1913
1914 if ( ! empty( $payment_meta ) ) {
1915 _give_20_bc_split_and_save_give_payment_meta( $post->ID, $payment_meta );
1916 }
1917
1918 $deprecated_meta_keys = array(
1919 '_give_payment_customer_id' => '_give_payment_donor_id',
1920 '_give_payment_user_email' => '_give_payment_donor_email',
1921 '_give_payment_user_ip' => '_give_payment_donor_ip',
1922 );
1923
1924 foreach ( $deprecated_meta_keys as $old_meta_key => $new_meta_key ) {
1925 // Do not add new meta key if already exist.
1926 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 ) ) ) {
1927 continue;
1928 }
1929
1930 $wpdb->insert(
1931 $wpdb->postmeta,
1932 array(
1933 'post_id' => $post->ID,
1934 'meta_key' => $new_meta_key,
1935 'meta_value' => give_get_meta( $post->ID, $old_meta_key, true ),
1936 )
1937 );
1938 }
1939
1940 // Bailout
1941 if ( $donor_id = give_get_meta( $post->ID, '_give_payment_donor_id', true ) ) {
1942 /* @var Give_Donor $donor */
1943 $donor = new Give_Donor( $donor_id );
1944
1945 $address['line1'] = give_get_meta( $post->ID, '_give_donor_billing_address1', true, '' );
1946 $address['line2'] = give_get_meta( $post->ID, '_give_donor_billing_address2', true, '' );
1947 $address['city'] = give_get_meta( $post->ID, '_give_donor_billing_city', true, '' );
1948 $address['state'] = give_get_meta( $post->ID, '_give_donor_billing_state', true, '' );
1949 $address['zip'] = give_get_meta( $post->ID, '_give_donor_billing_zip', true, '' );
1950 $address['country'] = give_get_meta( $post->ID, '_give_donor_billing_country', true, '' );
1951
1952 // Save address.
1953 $donor->add_address( 'billing[]', $address );
1954 }
1955 }// End while().
1956
1957 wp_reset_postdata();
1958 } else {
1959 // @todo Delete user id meta after releases 2.0
1960 // $wpdb->get_var( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE meta_key=%s", '_give_payment_user_id' ) );
1961 // No more forms found, finish up.
1962 give_set_upgrade_complete( 'v20_upgrades_payment_metadata' );
1963 }
1964 }
1965
1966
1967 /**
1968 * Upgrade logs data.
1969 *
1970 * @since 2.0
1971 * @return void
1972 */
1973 function give_v20_logs_upgrades_callback() {
1974 global $wpdb;
1975 $give_updates = Give_Updates::get_instance();
1976
1977 // form query
1978 $forms = new WP_Query(
1979 array(
1980 'paged' => $give_updates->step,
1981 'order' => 'DESC',
1982 'post_type' => 'give_log',
1983 'post_status' => 'any',
1984 'posts_per_page' => 100,
1985 )
1986 );
1987
1988 if ( $forms->have_posts() ) {
1989 $give_updates->set_percentage( $forms->found_posts, $give_updates->step * 100 );
1990
1991 while ( $forms->have_posts() ) {
1992 $forms->the_post();
1993 global $post;
1994
1995 if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_logs WHERE ID=%d", $post->ID ) ) ) {
1996 continue;
1997 }
1998
1999 $term = get_the_terms( $post->ID, 'give_log_type' );
2000 $term = ! is_wp_error( $term ) && ! empty( $term ) ? $term[0] : array();
2001 $term_name = ! empty( $term ) ? $term->slug : '';
2002
2003 $log_data = array(
2004 'ID' => $post->ID,
2005 'log_title' => $post->post_title,
2006 'log_content' => $post->post_content,
2007 'log_parent' => 0,
2008 'log_type' => $term_name,
2009 'log_date' => $post->post_date,
2010 'log_date_gmt' => $post->post_date_gmt,
2011 );
2012 $log_meta = array();
2013
2014 if ( $old_log_meta = get_post_meta( $post->ID ) ) {
2015 foreach ( $old_log_meta as $meta_key => $meta_value ) {
2016 switch ( $meta_key ) {
2017 case '_give_log_payment_id':
2018 $log_data['log_parent'] = current( $meta_value );
2019 $log_meta['_give_log_form_id'] = $post->post_parent;
2020 break;
2021
2022 default:
2023 $log_meta[ $meta_key ] = current( $meta_value );
2024 }
2025 }
2026 }
2027
2028 if ( 'api_request' === $term_name ) {
2029 $log_meta['_give_log_api_query'] = $post->post_excerpt;
2030 }
2031
2032 $wpdb->insert( "{$wpdb->prefix}give_logs", $log_data );
2033
2034 if ( ! empty( $log_meta ) ) {
2035 foreach ( $log_meta as $meta_key => $meta_value ) {
2036 Give()->logs->logmeta_db->update_meta( $post->ID, $meta_key, $meta_value );
2037 }
2038 }
2039
2040 $logIDs[] = $post->ID;
2041 }// End while().
2042
2043 wp_reset_postdata();
2044 } else {
2045 // @todo: Delete terms and taxonomy after releases 2.0.
2046 /*
2047 $terms = get_terms( 'give_log_type', array( 'fields' => 'ids', 'hide_empty' => false ) );
2048 if ( ! empty( $terms ) ) {
2049 foreach ( $terms as $term ) {
2050 wp_delete_term( $term, 'give_log_type' );
2051 }
2052 }*/
2053
2054 // @todo: Delete logs after releases 2.0.
2055 /*
2056 $logIDs = get_posts( array(
2057 'order' => 'DESC',
2058 'post_type' => 'give_log',
2059 'post_status' => 'any',
2060 'posts_per_page' => - 1,
2061 'fields' => 'ids',
2062 )
2063 );*/
2064
2065 /*
2066 if ( ! empty( $logIDs ) ) {
2067 foreach ( $logIDs as $log ) {
2068 // Delete term relationship and posts.
2069 wp_delete_object_term_relationships( $log, 'give_log_type' );
2070 wp_delete_post( $log, true );
2071 }
2072 }*/
2073
2074 // @todo: Unregister taxonomy after releases 2.0.
2075 /*unregister_taxonomy( 'give_log_type' );*/
2076
2077 // Delete log cache.
2078 Give()->logs->delete_cache();
2079
2080 // No more forms found, finish up.
2081 give_set_upgrade_complete( 'v20_logs_upgrades' );
2082 }
2083 }
2084
2085
2086 /**
2087 * Move payment and form metadata to new table
2088 *
2089 * @since 2.0
2090 * @return void
2091 */
2092 function give_v20_move_metadata_into_new_table_callback() {
2093 global $wpdb;
2094 $give_updates = Give_Updates::get_instance();
2095
2096 // form query
2097 $payments = new WP_Query(
2098 array(
2099 'paged' => $give_updates->step,
2100 'status' => 'any',
2101 'order' => 'ASC',
2102 'post_type' => array( 'give_forms', 'give_payment' ),
2103 'posts_per_page' => 100,
2104 )
2105 );
2106
2107 if ( $payments->have_posts() ) {
2108 $give_updates->set_percentage( $payments->found_posts, $give_updates->step * 100 );
2109
2110 while ( $payments->have_posts() ) {
2111 $payments->the_post();
2112 global $post;
2113
2114 $meta_data = $wpdb->get_results(
2115 $wpdb->prepare(
2116 "SELECT * FROM $wpdb->postmeta where post_id=%d",
2117 get_the_ID()
2118 ),
2119 ARRAY_A
2120 );
2121
2122 if ( ! empty( $meta_data ) ) {
2123 foreach ( $meta_data as $index => $data ) {
2124 // Check for duplicate meta values.
2125 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 ) ) {
2126 continue;
2127 }
2128
2129 switch ( $post->post_type ) {
2130 case 'give_forms':
2131 $data['form_id'] = $data['post_id'];
2132 unset( $data['post_id'] );
2133
2134 Give()->form_meta->insert( $data );
2135 // @todo: delete form meta from post meta table after releases 2.0.
2136 /*delete_post_meta( get_the_ID(), $data['meta_key'] );*/
2137
2138 break;
2139
2140 case 'give_payment':
2141 $data['payment_id'] = $data['post_id'];
2142 unset( $data['post_id'] );
2143
2144 Give()->payment_meta->insert( $data );
2145
2146 // @todo: delete donation meta from post meta table after releases 2.0.
2147 /*delete_post_meta( get_the_ID(), $data['meta_key'] );*/
2148
2149 break;
2150 }
2151 }
2152 }
2153 }// End while().
2154
2155 wp_reset_postdata();
2156 } else {
2157 // No more forms found, finish up.
2158 give_set_upgrade_complete( 'v20_move_metadata_into_new_table' );
2159 }
2160
2161 }
2162
2163 /**
2164 * Upgrade routine for splitting donor name into first name and last name.
2165 *
2166 * @since 2.0
2167 *
2168 * @return void
2169 */
2170 function give_v20_upgrades_donor_name() {
2171 /* @var Give_Updates $give_updates */
2172 $give_updates = Give_Updates::get_instance();
2173
2174 $donors = Give()->donors->get_donors(
2175 array(
2176 'paged' => $give_updates->step,
2177 'number' => 100,
2178 )
2179 );
2180
2181 if ( $donors ) {
2182 $give_updates->set_percentage( count( $donors ), $give_updates->step * 100 );
2183 // Loop through Donors
2184 foreach ( $donors as $donor ) {
2185
2186 $donor_name = explode( ' ', $donor->name, 2 );
2187 $donor_first_name = Give()->donor_meta->get_meta( $donor->id, '_give_donor_first_name' );
2188 $donor_last_name = Give()->donor_meta->get_meta( $donor->id, '_give_donor_last_name' );
2189
2190 // If first name meta of donor is not created, then create it.
2191 if ( ! $donor_first_name && isset( $donor_name[0] ) ) {
2192 Give()->donor_meta->add_meta( $donor->id, '_give_donor_first_name', $donor_name[0] );
2193 }
2194
2195 // If last name meta of donor is not created, then create it.
2196 if ( ! $donor_last_name && isset( $donor_name[1] ) ) {
2197 Give()->donor_meta->add_meta( $donor->id, '_give_donor_last_name', $donor_name[1] );
2198 }
2199
2200 // If Donor is connected with WP User then update user meta.
2201 if ( $donor->user_id ) {
2202 if ( isset( $donor_name[0] ) ) {
2203 update_user_meta( $donor->user_id, 'first_name', $donor_name[0] );
2204 }
2205 if ( isset( $donor_name[1] ) ) {
2206 update_user_meta( $donor->user_id, 'last_name', $donor_name[1] );
2207 }
2208 }
2209 }
2210 } else {
2211 // The Update Ran.
2212 give_set_upgrade_complete( 'v20_upgrades_donor_name' );
2213 }
2214
2215 }
2216
2217 /**
2218 * Upgrade routine for user addresses.
2219 *
2220 * @since 2.0
2221 * @global wpdb $wpdb
2222 *
2223 * @return void
2224 */
2225 function give_v20_upgrades_user_address() {
2226 global $wpdb;
2227
2228 /* @var Give_Updates $give_updates */
2229 $give_updates = Give_Updates::get_instance();
2230
2231 /* @var WP_User_Query $user_query */
2232 $user_query = new WP_User_Query(
2233 array(
2234 'number' => 100,
2235 'paged' => $give_updates->step,
2236 )
2237 );
2238
2239 $users = $user_query->get_results();
2240
2241 if ( $users ) {
2242 $give_updates->set_percentage( $user_query->get_total(), $give_updates->step * 100 );
2243
2244 // Loop through Donors
2245 foreach ( $users as $user ) {
2246 /* @var Give_Donor $donor */
2247 $donor = new Give_Donor( $user->ID, true );
2248
2249 if ( ! $donor->id ) {
2250 continue;
2251 }
2252
2253 $address = $wpdb->get_var(
2254 $wpdb->prepare(
2255 "
2256 SELECT meta_value FROM {$wpdb->usermeta}
2257 WHERE user_id=%s
2258 AND meta_key=%s
2259 ",
2260 $user->ID,
2261 '_give_user_address'
2262 )
2263 );
2264
2265 if ( ! empty( $address ) ) {
2266 $address = maybe_unserialize( $address );
2267 $donor->add_address( 'personal', $address );
2268 $donor->add_address( 'billing[]', $address );
2269
2270 // @todo: delete _give_user_address from user meta after releases 2.0.
2271 /*delete_user_meta( $user->ID, '_give_user_address' );*/
2272 }
2273 }
2274 } else {
2275 // The Update Ran.
2276 give_set_upgrade_complete( 'v20_upgrades_user_address' );
2277 }
2278
2279 }
2280
2281 /**
2282 * Upgrade logs data.
2283 *
2284 * @since 2.0
2285 * @global wpdb $wpdb
2286 * @return void
2287 */
2288 function give_v20_rename_donor_tables_callback() {
2289 global $wpdb;
2290
2291 /* @var Give_Updates $give_updates */
2292 $give_updates = Give_Updates::get_instance();
2293
2294 $tables = array(
2295 "{$wpdb->prefix}give_customers" => "{$wpdb->prefix}give_donors",
2296 "{$wpdb->prefix}give_customermeta" => "{$wpdb->prefix}give_donormeta",
2297 );
2298
2299 // Alter customer table
2300 foreach ( $tables as $old_table => $new_table ) {
2301 if (
2302 $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', $old_table ) ) &&
2303 ! $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', $new_table ) )
2304 ) {
2305 $wpdb->query( "ALTER TABLE {$old_table} RENAME TO {$new_table}" );
2306
2307 if ( "{$wpdb->prefix}give_donormeta" === $new_table ) {
2308 $wpdb->query( "ALTER TABLE {$new_table} CHANGE COLUMN customer_id donor_id bigint(20)" );
2309 }
2310 }
2311 }
2312
2313 $give_updates->percentage = 100;
2314
2315 // No more forms found, finish up.
2316 give_set_upgrade_complete( 'v20_rename_donor_tables' );
2317
2318 // Re initiate donor classes.
2319 Give()->donors = new Give_DB_Donors();
2320 Give()->donor_meta = new Give_DB_Donor_Meta();
2321 }
2322
2323
2324 /**
2325 * Create missing meta tables.
2326 *
2327 * @since 2.0.1
2328 * @global wpdb $wpdb
2329 * @return void
2330 */
2331 function give_v201_create_tables() {
2332 global $wpdb;
2333
2334 if ( ! $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', "{$wpdb->prefix}give_paymentmeta" ) ) ) {
2335 Give()->payment_meta->create_table();
2336 }
2337
2338 if ( ! $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', "{$wpdb->prefix}give_formmeta" ) ) ) {
2339 Give()->form_meta->create_table();
2340 }
2341
2342 if ( ! $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', "{$wpdb->prefix}give_logs" ) ) ) {
2343 Give()->logs->log_db->create_table();
2344 }
2345
2346 if ( ! $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', "{$wpdb->prefix}give_logmeta" ) ) ) {
2347 Give()->logs->logmeta_db->create_table();
2348 }
2349 }
2350
2351 /**
2352 * Upgrade payment metadata for new metabox settings.
2353 *
2354 * @since 2.0.1
2355 * @global wpdb $wpdb
2356 * @return void
2357 */
2358 function give_v201_upgrades_payment_metadata_callback() {
2359 global $wpdb, $post;
2360 $give_updates = Give_Updates::get_instance();
2361 give_v201_create_tables();
2362
2363 $payments = $wpdb->get_col(
2364 "
2365 SELECT ID FROM $wpdb->posts
2366 WHERE 1=1
2367 AND (
2368 $wpdb->posts.post_date >= '2018-01-08 00:00:00'
2369 )
2370 AND $wpdb->posts.post_type = 'give_payment'
2371 AND {$wpdb->posts}.post_status IN ('" . implode( "','", array_keys( give_get_payment_statuses() ) ) . "')
2372 ORDER BY $wpdb->posts.post_date ASC
2373 LIMIT 100
2374 OFFSET " . $give_updates->get_offset( 100 )
2375 );
2376
2377 if ( ! empty( $payments ) ) {
2378 $give_updates->set_percentage( give_get_total_post_type_count( 'give_payment' ), ( $give_updates->step * 100 ) );
2379
2380 foreach ( $payments as $payment_id ) {
2381 $post = get_post( $payment_id );
2382 setup_postdata( $post );
2383
2384 // Do not add new meta keys if already refactored.
2385 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' ) ) ) {
2386 continue;
2387 }
2388
2389 // Split _give_payment_meta meta.
2390 // @todo Remove _give_payment_meta after releases 2.0
2391 $payment_meta = give_get_meta( $post->ID, '_give_payment_meta', true );
2392
2393 if ( ! empty( $payment_meta ) ) {
2394 _give_20_bc_split_and_save_give_payment_meta( $post->ID, $payment_meta );
2395 }
2396
2397 $deprecated_meta_keys = array(
2398 '_give_payment_customer_id' => '_give_payment_donor_id',
2399 '_give_payment_user_email' => '_give_payment_donor_email',
2400 '_give_payment_user_ip' => '_give_payment_donor_ip',
2401 );
2402
2403 foreach ( $deprecated_meta_keys as $old_meta_key => $new_meta_key ) {
2404 // Do not add new meta key if already exist.
2405 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 ) ) ) {
2406 continue;
2407 }
2408
2409 $wpdb->insert(
2410 $wpdb->postmeta,
2411 array(
2412 'post_id' => $post->ID,
2413 'meta_key' => $new_meta_key,
2414 'meta_value' => give_get_meta( $post->ID, $old_meta_key, true ),
2415 )
2416 );
2417 }
2418
2419 // Bailout
2420 if ( $donor_id = give_get_meta( $post->ID, '_give_payment_donor_id', true ) ) {
2421 /* @var Give_Donor $donor */
2422 $donor = new Give_Donor( $donor_id );
2423
2424 $address['line1'] = give_get_meta( $post->ID, '_give_donor_billing_address1', true, '' );
2425 $address['line2'] = give_get_meta( $post->ID, '_give_donor_billing_address2', true, '' );
2426 $address['city'] = give_get_meta( $post->ID, '_give_donor_billing_city', true, '' );
2427 $address['state'] = give_get_meta( $post->ID, '_give_donor_billing_state', true, '' );
2428 $address['zip'] = give_get_meta( $post->ID, '_give_donor_billing_zip', true, '' );
2429 $address['country'] = give_get_meta( $post->ID, '_give_donor_billing_country', true, '' );
2430
2431 // Save address.
2432 $donor->add_address( 'billing[]', $address );
2433 }
2434 }// End while().
2435
2436 wp_reset_postdata();
2437 } else {
2438 // @todo Delete user id meta after releases 2.0
2439 // $wpdb->get_var( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE meta_key=%s", '_give_payment_user_id' ) );
2440 // No more forms found, finish up.
2441 give_set_upgrade_complete( 'v201_upgrades_payment_metadata' );
2442 }
2443 }
2444
2445 /**
2446 * Move payment and form metadata to new table
2447 *
2448 * @since 2.0.1
2449 * @return void
2450 */
2451 function give_v201_move_metadata_into_new_table_callback() {
2452 global $wpdb, $post;
2453 $give_updates = Give_Updates::get_instance();
2454 give_v201_create_tables();
2455
2456 $payments = $wpdb->get_col(
2457 "
2458 SELECT ID FROM $wpdb->posts
2459 WHERE 1=1
2460 AND ( $wpdb->posts.post_type = 'give_payment' OR $wpdb->posts.post_type = 'give_forms' )
2461 AND {$wpdb->posts}.post_status IN ('" . implode( "','", array_keys( give_get_payment_statuses() ) ) . "')
2462 ORDER BY $wpdb->posts.post_date ASC
2463 LIMIT 100
2464 OFFSET " . $give_updates->get_offset( 100 )
2465 );
2466
2467 if ( ! empty( $payments ) ) {
2468 $give_updates->set_percentage(
2469 give_get_total_post_type_count(
2470 array(
2471 'give_forms',
2472 'give_payment',
2473 )
2474 ), $give_updates->step * 100
2475 );
2476
2477 foreach ( $payments as $payment_id ) {
2478 $post = get_post( $payment_id );
2479 setup_postdata( $post );
2480
2481 $meta_data = $wpdb->get_results(
2482 $wpdb->prepare(
2483 "SELECT * FROM $wpdb->postmeta where post_id=%d",
2484 get_the_ID()
2485 ),
2486 ARRAY_A
2487 );
2488
2489 if ( ! empty( $meta_data ) ) {
2490 foreach ( $meta_data as $index => $data ) {
2491 // Check for duplicate meta values.
2492 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 ) ) {
2493 continue;
2494 }
2495
2496 switch ( $post->post_type ) {
2497 case 'give_forms':
2498 $data['form_id'] = $data['post_id'];
2499 unset( $data['post_id'] );
2500
2501 Give()->form_meta->insert( $data );
2502 // @todo: delete form meta from post meta table after releases 2.0.
2503 /*delete_post_meta( get_the_ID(), $data['meta_key'] );*/
2504
2505 break;
2506
2507 case 'give_payment':
2508 $data['payment_id'] = $data['post_id'];
2509 unset( $data['post_id'] );
2510
2511 Give()->payment_meta->insert( $data );
2512
2513 // @todo: delete donation meta from post meta table after releases 2.0.
2514 /*delete_post_meta( get_the_ID(), $data['meta_key'] );*/
2515
2516 break;
2517 }
2518 }
2519 }
2520 }// End while().
2521
2522 wp_reset_postdata();
2523 } else {
2524 // No more forms found, finish up.
2525 give_set_upgrade_complete( 'v201_move_metadata_into_new_table' );
2526 }
2527
2528 }
2529
2530 /**
2531 * Move data to new log table.
2532 *
2533 * @since 2.0.1
2534 * @return void
2535 */
2536 function give_v201_logs_upgrades_callback() {
2537 global $wpdb, $post;
2538 $give_updates = Give_Updates::get_instance();
2539 give_v201_create_tables();
2540
2541 $logs = $wpdb->get_col(
2542 "
2543 SELECT ID FROM $wpdb->posts
2544 WHERE 1=1
2545 AND $wpdb->posts.post_type = 'give_log'
2546 AND {$wpdb->posts}.post_status IN ('" . implode( "','", array_keys( give_get_payment_statuses() ) ) . "')
2547 ORDER BY $wpdb->posts.post_date ASC
2548 LIMIT 100
2549 OFFSET " . $give_updates->get_offset( 100 )
2550 );
2551
2552 if ( ! empty( $logs ) ) {
2553 $give_updates->set_percentage( give_get_total_post_type_count( 'give_log' ), $give_updates->step * 100 );
2554
2555 foreach ( $logs as $log_id ) {
2556 $post = get_post( $log_id );
2557 setup_postdata( $post );
2558
2559 if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_logs WHERE ID=%d", $post->ID ) ) ) {
2560 continue;
2561 }
2562
2563 $term = get_the_terms( $post->ID, 'give_log_type' );
2564 $term = ! is_wp_error( $term ) && ! empty( $term ) ? $term[0] : array();
2565 $term_name = ! empty( $term ) ? $term->slug : '';
2566
2567 $log_data = array(
2568 'ID' => $post->ID,
2569 'log_title' => $post->post_title,
2570 'log_content' => $post->post_content,
2571 'log_parent' => 0,
2572 'log_type' => $term_name,
2573 'log_date' => $post->post_date,
2574 'log_date_gmt' => $post->post_date_gmt,
2575 );
2576 $log_meta = array();
2577
2578 if ( $old_log_meta = get_post_meta( $post->ID ) ) {
2579 foreach ( $old_log_meta as $meta_key => $meta_value ) {
2580 switch ( $meta_key ) {
2581 case '_give_log_payment_id':
2582 $log_data['log_parent'] = current( $meta_value );
2583 $log_meta['_give_log_form_id'] = $post->post_parent;
2584 break;
2585
2586 default:
2587 $log_meta[ $meta_key ] = current( $meta_value );
2588 }
2589 }
2590 }
2591
2592 if ( 'api_request' === $term_name ) {
2593 $log_meta['_give_log_api_query'] = $post->post_excerpt;
2594 }
2595
2596 $wpdb->insert( "{$wpdb->prefix}give_logs", $log_data );
2597
2598 if ( ! empty( $log_meta ) ) {
2599 foreach ( $log_meta as $meta_key => $meta_value ) {
2600 Give()->logs->logmeta_db->update_meta( $post->ID, $meta_key, $meta_value );
2601 }
2602 }
2603
2604 $logIDs[] = $post->ID;
2605 }// End while().
2606
2607 wp_reset_postdata();
2608 } else {
2609 // Delete log cache.
2610 Give()->logs->delete_cache();
2611
2612 // No more forms found, finish up.
2613 give_set_upgrade_complete( 'v201_logs_upgrades' );
2614 }
2615 }
2616
2617
2618 /**
2619 * Add missing donor.
2620 *
2621 * @since 2.0.1
2622 * @return void
2623 */
2624 function give_v201_add_missing_donors_callback() {
2625 global $wpdb;
2626 give_v201_create_tables();
2627
2628 $give_updates = Give_Updates::get_instance();
2629
2630 // Bailout.
2631 if ( ! $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', "{$wpdb->prefix}give_customers" ) ) ) {
2632 Give_Updates::get_instance()->percentage = 100;
2633 give_set_upgrade_complete( 'v201_add_missing_donors' );
2634 }
2635
2636 $total_customers = $wpdb->get_var( "SELECT COUNT(id) FROM {$wpdb->prefix}give_customers " );
2637 $customers = wp_list_pluck( $wpdb->get_results( "SELECT id FROM {$wpdb->prefix}give_customers LIMIT 20 OFFSET " . $give_updates->get_offset( 20 ) ), 'id' );
2638 $donors = wp_list_pluck( $wpdb->get_results( "SELECT id FROM {$wpdb->prefix}give_donors" ), 'id' );
2639
2640 if ( ! empty( $customers ) ) {
2641 $give_updates->set_percentage( $total_customers, ( $give_updates->step * 20 ) );
2642
2643 $missing_donors = array_diff( $customers, $donors );
2644 $donor_data = array();
2645
2646 if ( $missing_donors ) {
2647 foreach ( $missing_donors as $donor_id ) {
2648 $donor_data[] = array(
2649 'info' => $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_customers WHERE id=%d", $donor_id ) ),
2650 'meta' => $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_customermeta WHERE customer_id=%d", $donor_id ) ),
2651
2652 );
2653 }
2654 }
2655
2656 if ( ! empty( $donor_data ) ) {
2657 $donor_table_name = Give()->donors->table_name;
2658 $donor_meta_table_name = Give()->donor_meta->table_name;
2659
2660 Give()->donors->table_name = "{$wpdb->prefix}give_donors";
2661 Give()->donor_meta->table_name = "{$wpdb->prefix}give_donormeta";
2662
2663 foreach ( $donor_data as $donor ) {
2664 $donor['info'][0] = (array) $donor['info'][0];
2665
2666 // Prevent duplicate meta id issue.
2667 if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_donors WHERE id=%d", $donor['info'][0]['id'] ) ) ) {
2668 continue;
2669 }
2670
2671 $donor_id = Give()->donors->add( $donor['info'][0] );
2672
2673 if ( ! empty( $donor['meta'] ) ) {
2674 foreach ( $donor['meta'] as $donor_meta ) {
2675 $donor_meta = (array) $donor_meta;
2676
2677 // Prevent duplicate meta id issue.
2678 if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_donormeta WHERE meta_id=%d", $donor_meta['meta_id'] ) ) ) {
2679 unset( $donor_meta['meta_id'] );
2680 }
2681
2682 $donor_meta['donor_id'] = $donor_meta['customer_id'];
2683 unset( $donor_meta['customer_id'] );
2684
2685 Give()->donor_meta->insert( $donor_meta );
2686 }
2687 }
2688
2689 /**
2690 * Fix donor name and address
2691 */
2692 $address = $wpdb->get_var(
2693 $wpdb->prepare(
2694 "
2695 SELECT meta_value FROM {$wpdb->usermeta}
2696 WHERE user_id=%s
2697 AND meta_key=%s
2698 ",
2699 $donor['info'][0]['user_id'],
2700 '_give_user_address'
2701 )
2702 );
2703
2704 $donor = new Give_Donor( $donor_id );
2705
2706 if ( ! empty( $address ) ) {
2707 $address = maybe_unserialize( $address );
2708 $donor->add_address( 'personal', $address );
2709 $donor->add_address( 'billing[]', $address );
2710 }
2711
2712 $donor_name = explode( ' ', $donor->name, 2 );
2713 $donor_first_name = Give()->donor_meta->get_meta( $donor->id, '_give_donor_first_name' );
2714 $donor_last_name = Give()->donor_meta->get_meta( $donor->id, '_give_donor_last_name' );
2715
2716 // If first name meta of donor is not created, then create it.
2717 if ( ! $donor_first_name && isset( $donor_name[0] ) ) {
2718 Give()->donor_meta->add_meta( $donor->id, '_give_donor_first_name', $donor_name[0] );
2719 }
2720
2721 // If last name meta of donor is not created, then create it.
2722 if ( ! $donor_last_name && isset( $donor_name[1] ) ) {
2723 Give()->donor_meta->add_meta( $donor->id, '_give_donor_last_name', $donor_name[1] );
2724 }
2725
2726 // If Donor is connected with WP User then update user meta.
2727 if ( $donor->user_id ) {
2728 if ( isset( $donor_name[0] ) ) {
2729 update_user_meta( $donor->user_id, 'first_name', $donor_name[0] );
2730 }
2731 if ( isset( $donor_name[1] ) ) {
2732 update_user_meta( $donor->user_id, 'last_name', $donor_name[1] );
2733 }
2734 }
2735 }
2736
2737 Give()->donors->table_name = $donor_table_name;
2738 Give()->donor_meta->table_name = $donor_meta_table_name;
2739 }
2740 } else {
2741 give_set_upgrade_complete( 'v201_add_missing_donors' );
2742 }
2743 }
2744
2745
2746 /**
2747 * Version 2.0.3 automatic updates
2748 *
2749 * @since 2.0.3
2750 */
2751 function give_v203_upgrades() {
2752 global $wpdb;
2753
2754 // Do not auto load option.
2755 $wpdb->update( $wpdb->options, array( 'autoload' => 'no' ), array( 'option_name' => 'give_completed_upgrades' ) );
2756
2757 // Remove from cache.
2758 $all_options = wp_load_alloptions();
2759
2760 if ( isset( $all_options['give_completed_upgrades'] ) ) {
2761 unset( $all_options['give_completed_upgrades'] );
2762 wp_cache_set( 'alloptions', $all_options, 'options' );
2763 }
2764
2765 }
2766
2767
2768 /**
2769 * Version 2.2.0 automatic updates
2770 *
2771 * @since 2.2.0
2772 */
2773 function give_v220_upgrades() {
2774 global $wpdb;
2775
2776 /**
2777 * Update 1
2778 *
2779 * Delete wp session data
2780 */
2781 give_v220_delete_wp_session_data();
2782
2783 /**
2784 * Update 2
2785 *
2786 * Rename payment table
2787 */
2788 give_v220_rename_donation_meta_type_callback();
2789
2790 /**
2791 * Update 2
2792 *
2793 * Set autoload to no to reduce result weight from WordPress query
2794 */
2795
2796 $options = array(
2797 'give_settings',
2798 'give_version',
2799 'give_version_upgraded_from',
2800 'give_default_api_version',
2801 'give_site_address_before_migrate',
2802 '_give_table_check',
2803 'give_recently_activated_addons',
2804 'give_is_addon_activated',
2805 'give_last_paypal_ipn_received',
2806 'give_use_php_sessions',
2807 'give_subscriptions',
2808 '_give_subscriptions_edit_last',
2809 );
2810
2811 // Add all table version option name
2812 // Add banner option *_active_by_user
2813 $option_like = $wpdb->get_col(
2814 "
2815 SELECT option_name
2816 FROM $wpdb->options
2817 WHERE option_name like '%give%'
2818 AND (
2819 option_name like '%_db_version%'
2820 OR option_name like '%_active_by_user%'
2821 OR option_name like '%_license_active%'
2822 )
2823 "
2824 );
2825
2826 if ( ! empty( $option_like ) ) {
2827 $options = array_merge( $options, $option_like );
2828 }
2829
2830 $options_str = '\'' . implode( "','", $options ) . '\'';
2831
2832 $wpdb->query(
2833 "
2834 UPDATE $wpdb->options
2835 SET autoload = 'no'
2836 WHERE option_name IN ( {$options_str} )
2837 "
2838 );
2839 }
2840
2841 /**
2842 * Version 2.2.1 automatic updates
2843 *
2844 * @since 2.2.1
2845 */
2846 function give_v221_upgrades() {
2847 global $wpdb;
2848
2849 /**
2850 * Update 1
2851 *
2852 * Change column length
2853 */
2854 $wpdb->query( "ALTER TABLE $wpdb->donors MODIFY email varchar(255) NOT NULL" );
2855 }
2856
2857 /**
2858 * Version 2.3.0 automatic updates
2859 *
2860 * @since 2.3.0
2861 */
2862 function give_v230_upgrades() {
2863
2864 $options_key = array(
2865 'give_temp_delete_form_ids', // delete import donor
2866 'give_temp_delete_donation_ids', // delete import donor
2867 'give_temp_delete_step', // delete import donor
2868 'give_temp_delete_donor_ids', // delete import donor
2869 'give_temp_delete_step_on', // delete import donor
2870 'give_temp_delete_donation_ids', // delete test donor
2871 'give_temp_delete_donor_ids', // delete test donor
2872 'give_temp_delete_step', // delete test donor
2873 'give_temp_delete_step_on', // delete test donor
2874 'give_temp_delete_test_ids', // delete test donations
2875 'give_temp_all_payments_data', // delete all stats
2876 'give_recount_all_total', // delete all stats
2877 'give_temp_recount_all_stats', // delete all stats
2878 'give_temp_payment_items', // delete all stats
2879 'give_temp_form_ids', // delete all stats
2880 'give_temp_processed_payments', // delete all stats
2881 'give_temp_recount_form_stats', // delete form stats
2882 'give_temp_recount_earnings', // recount income
2883 'give_recount_earnings_total', // recount income
2884 'give_temp_reset_ids', // reset stats
2885 );
2886
2887 $options_key = '\'' . implode( "','", $options_key ) . '\'';
2888
2889 global $wpdb;
2890
2891 /**
2892 * Update 1
2893 *
2894 * delete unwanted key from option table
2895 */
2896 $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name IN ( {$options_key} )" );
2897 }
2898
2899 /**
2900 * Upgrade routine for 2.1 to set form closed status for all the donation forms.
2901 *
2902 * @since 2.1
2903 */
2904 function give_v210_verify_form_status_upgrades_callback() {
2905
2906 $give_updates = Give_Updates::get_instance();
2907
2908 // form query.
2909 $donation_forms = new WP_Query(
2910 array(
2911 'paged' => $give_updates->step,
2912 'status' => 'any',
2913 'order' => 'ASC',
2914 'post_type' => 'give_forms',
2915 'posts_per_page' => 20,
2916 )
2917 );
2918
2919 if ( $donation_forms->have_posts() ) {
2920 $give_updates->set_percentage( $donation_forms->found_posts, ( $give_updates->step * 20 ) );
2921
2922 while ( $donation_forms->have_posts() ) {
2923 $donation_forms->the_post();
2924 $form_id = get_the_ID();
2925
2926 $form_closed_status = give_get_meta( $form_id, '_give_form_status', true );
2927 if ( empty( $form_closed_status ) ) {
2928 give_set_form_closed_status( $form_id );
2929 }
2930 }
2931
2932 /* Restore original Post Data */
2933 wp_reset_postdata();
2934
2935 } else {
2936
2937 // The Update Ran.
2938 give_set_upgrade_complete( 'v210_verify_form_status_upgrades' );
2939 }
2940 }
2941
2942 /**
2943 * Upgrade routine for 2.1.3 to delete meta which is not attach to any donation.
2944 *
2945 * @since 2.1
2946 */
2947 function give_v213_delete_donation_meta_callback() {
2948 global $wpdb;
2949 $give_updates = Give_Updates::get_instance();
2950 $donation_meta_table = Give()->payment_meta->table_name;
2951
2952 $donations = $wpdb->get_col(
2953 "
2954 SELECT DISTINCT payment_id
2955 FROM {$donation_meta_table}
2956 LIMIT 20
2957 OFFSET {$give_updates->get_offset( 20 )}
2958 "
2959 );
2960
2961 if ( ! empty( $donations ) ) {
2962 foreach ( $donations as $donation ) {
2963 $donation_obj = get_post( $donation );
2964
2965 if ( ! $donation_obj instanceof WP_Post ) {
2966 Give()->payment_meta->delete_all_meta( $donation );
2967 }
2968 }
2969 } else {
2970
2971 // The Update Ran.
2972 give_set_upgrade_complete( 'v213_delete_donation_meta' );
2973 }
2974 }
2975
2976 /**
2977 * Rename donation meta type
2978 *
2979 * @see https://github.com/restrictcontentpro/restrict-content-pro/issues/1656
2980 *
2981 * @since 2.2.0
2982 */
2983 function give_v220_rename_donation_meta_type_callback() {
2984 global $wpdb;
2985
2986 // Check upgrade before running.
2987 if (
2988 give_has_upgrade_completed( 'v220_rename_donation_meta_type' )
2989 || ! $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', "{$wpdb->prefix}give_paymentmeta" ) )
2990 ) {
2991 // Complete update if skip somehow
2992 give_set_upgrade_complete( 'v220_rename_donation_meta_type' );
2993
2994 return;
2995 }
2996
2997 $wpdb->query( "ALTER TABLE {$wpdb->prefix}give_paymentmeta CHANGE COLUMN payment_id donation_id bigint(20)" );
2998 $wpdb->query( "ALTER TABLE {$wpdb->prefix}give_paymentmeta RENAME TO {$wpdb->prefix}give_donationmeta" );
2999
3000 give_set_upgrade_complete( 'v220_rename_donation_meta_type' );
3001 }
3002
3003 /**
3004 * Adds 'view_give_payments' capability to 'give_manager' user role.
3005 *
3006 * @since 2.1.5
3007 */
3008 function give_v215_update_donor_user_roles_callback() {
3009
3010 $role = get_role( 'give_manager' );
3011 $role->add_cap( 'view_give_payments' );
3012
3013 give_set_upgrade_complete( 'v215_update_donor_user_roles' );
3014 }
3015
3016
3017 /**
3018 * Remove all wp session data from the options table, regardless of expiration.
3019 *
3020 * @since 2.2.0
3021 *
3022 * @global wpdb $wpdb
3023 */
3024 function give_v220_delete_wp_session_data() {
3025 global $wpdb;
3026
3027 $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_wp_session_%'" );
3028 }
3029
3030
3031 /**
3032 * Update donor meta
3033 * Set "_give_anonymous_donor" meta key to "0" if not exist
3034 *
3035 * @since 2.2.4
3036 */
3037 function give_v224_update_donor_meta_callback() {
3038 /* @var Give_Updates $give_updates */
3039 $give_updates = Give_Updates::get_instance();
3040
3041 $donor_count = Give()->donors->count(
3042 array(
3043 'number' => - 1,
3044 )
3045 );
3046
3047 $donors = Give()->donors->get_donors(
3048 array(
3049 'paged' => $give_updates->step,
3050 'number' => 100,
3051 )
3052 );
3053
3054 if ( $donors ) {
3055 $give_updates->set_percentage( $donor_count, $give_updates->step * 100 );
3056 // Loop through Donors
3057 foreach ( $donors as $donor ) {
3058 $anonymous_metadata = Give()->donor_meta->get_meta( $donor->id, '_give_anonymous_donor', true );
3059
3060 // If first name meta of donor is not created, then create it.
3061 if ( ! in_array( $anonymous_metadata, array( '0', '1' ) ) ) {
3062 Give()->donor_meta->add_meta( $donor->id, '_give_anonymous_donor', '0' );
3063 }
3064 }
3065 } else {
3066 // The Update Ran.
3067 give_set_upgrade_complete( 'v224_update_donor_meta' );
3068 }
3069 }
3070
3071 /** Update donor meta
3072 * Set "_give_anonymous_donor_forms" meta key if not exist
3073 *
3074 *
3075 * @since 2.2.4
3076 */
3077 function give_v224_update_donor_meta_forms_id_callback() {
3078 $give_updates = Give_Updates::get_instance();
3079
3080 $donations = new WP_Query( array(
3081 'paged' => $give_updates->step,
3082 'status' => 'any',
3083 'order' => 'ASC',
3084 'post_type' => array( 'give_payment' ),
3085 'posts_per_page' => 20,
3086 )
3087 );
3088
3089 if ( $donations->have_posts() ) {
3090 $give_updates->set_percentage( $donations->found_posts, $give_updates->step * 20 );
3091
3092 while ( $donations->have_posts() ) {
3093 $donations->the_post();
3094
3095 $donation_id = get_the_ID();
3096
3097 $form_id = give_get_payment_form_id( $donation_id );
3098 $donor_id = give_get_payment_donor_id( $donation_id );
3099 $is_donated_as_anonymous = give_is_anonymous_donation( $donation_id );
3100
3101 $is_anonymous_donor = Give()->donor_meta->get_meta( $donor_id, "_give_anonymous_donor_form_{$form_id}", true );
3102 $is_edit_donor_meta = ! in_array( $is_anonymous_donor, array( '0', '1' ) )
3103 ? true
3104 : ( 0 !== absint( $is_anonymous_donor ) );
3105
3106 if ( $is_edit_donor_meta ) {
3107 Give()->donor_meta->update_meta( $donor_id, "_give_anonymous_donor_form_{$form_id}", absint( $is_donated_as_anonymous ) );
3108 }
3109 }
3110
3111 wp_reset_postdata();
3112 } else {
3113 give_set_upgrade_complete( 'v224_update_donor_meta_forms_id' );
3114 }
3115 }
3116
3117 /**
3118 * Add custom comment table
3119 *
3120 * @since 2.4.0
3121 */
3122 function give_v230_add_missing_comment_tables(){
3123 $custom_tables = array(
3124 Give()->comment->db,
3125 Give()->comment->db_meta,
3126 );
3127
3128 /* @var Give_DB $table */
3129 foreach ( $custom_tables as $table ) {
3130 if ( ! $table->installed() ) {
3131 $table->register_table();
3132 }
3133 }
3134 }
3135
3136
3137 /**
3138 * Move donor notes to comment table
3139 *
3140 * @since 2.3.0
3141 */
3142 function give_v230_move_donor_note_callback() {
3143 // Add comment table if missing.
3144 give_v230_add_missing_comment_tables();
3145
3146 /* @var Give_Updates $give_updates */
3147 $give_updates = Give_Updates::get_instance();
3148
3149 $donor_count = Give()->donors->count( array(
3150 'number' => - 1,
3151 ) );
3152
3153 $donors = Give()->donors->get_donors( array(
3154 'paged' => $give_updates->step,
3155 'number' => 100,
3156 ) );
3157
3158 if ( $donors ) {
3159 $give_updates->set_percentage( $donor_count, $give_updates->step * 100 );
3160 // Loop through Donors
3161 foreach ( $donors as $donor ) {
3162 $notes = trim( Give()->donors->get_column( 'notes', $donor->id ) );
3163
3164 // If first name meta of donor is not created, then create it.
3165 if ( ! empty( $notes ) ) {
3166 $notes = array_values( array_filter( array_map( 'trim', explode( "\n", $notes ) ), 'strlen' ) );
3167
3168 foreach ( $notes as $note ) {
3169 $note = array_map( 'trim', explode( '-', $note ) );
3170 $timestamp = strtotime( $note[0] );
3171
3172 Give()->comment->db->add(
3173 array(
3174 'comment_content' => $note[1],
3175 'user_id' => absint( Give()->donors->get_column_by( 'user_id', 'id', $donor->id ) ),
3176 'comment_date' => date( 'Y-m-d H:i:s', $timestamp ),
3177 'comment_date_gmt' => get_gmt_from_date( date( 'Y-m-d H:i:s', $timestamp ) ),
3178 'comment_parent' => $donor->id,
3179 'comment_type' => 'donor',
3180 )
3181 );
3182 }
3183 }
3184 }
3185
3186 } else {
3187 // The Update Ran.
3188 give_set_upgrade_complete( 'v230_move_donor_note' );
3189 }
3190 }
3191
3192 /**
3193 * Move donation notes to comment table
3194 *
3195 * @since 2.3.0
3196 */
3197 function give_v230_move_donation_note_callback() {
3198 global $wpdb;
3199
3200 // Add comment table if missing.
3201 give_v230_add_missing_Comment_tables();
3202
3203 /* @var Give_Updates $give_updates */
3204 $give_updates = Give_Updates::get_instance();
3205
3206 $donation_note_count = $wpdb->get_var(
3207 $wpdb->prepare(
3208 "
3209 SELECT count(*)
3210 FROM {$wpdb->comments}
3211 WHERE comment_type=%s
3212 ",
3213 'give_payment_note'
3214 )
3215 );
3216
3217 $query = $wpdb->prepare(
3218 "
3219 SELECT *
3220 FROM {$wpdb->comments}
3221 WHERE comment_type=%s
3222 ORDER BY comment_ID ASC
3223 LIMIT 100
3224 OFFSET %d
3225 ",
3226 'give_payment_note',
3227 $give_updates->get_offset( 100 )
3228 );
3229
3230 $comments = $wpdb->get_results( $query );
3231
3232 if ( $comments ) {
3233 $give_updates->set_percentage( $donation_note_count, $give_updates->step * 100 );
3234
3235 // Loop through Donors
3236 foreach ( $comments as $comment ) {
3237 $donation_id = $comment->comment_post_ID;
3238 $form_id = give_get_payment_form_id( $donation_id );
3239
3240 $comment_id = Give()->comment->db->add(
3241 array(
3242 'comment_content' => $comment->comment_content,
3243 'user_id' => $comment->user_id,
3244 'comment_date' => date( 'Y-m-d H:i:s', strtotime( $comment->comment_date ) ),
3245 'comment_date_gmt' => get_gmt_from_date( date( 'Y-m-d H:i:s', strtotime( $comment->comment_date_gmt ) ) ),
3246 'comment_parent' => $comment->comment_post_ID,
3247 'comment_type' => is_numeric( get_comment_meta( $comment->comment_ID, '_give_donor_id', true ) )
3248 ? 'donor_donation'
3249 : 'donation',
3250 )
3251 );
3252
3253 if( ! $comment_id ) {
3254 continue;
3255 }
3256
3257 // @see https://github.com/impress-org/give/issues/3737#issuecomment-428460802
3258 $restricted_meta_keys = array(
3259 'akismet_result',
3260 'akismet_as_submitted',
3261 'akismet_history'
3262 );
3263
3264 if ( $comment_meta = get_comment_meta( $comment->comment_ID ) ) {
3265 foreach ( $comment_meta as $meta_key => $meta_value ) {
3266 // Skip few comment meta keys.
3267 if( in_array( $meta_key, $restricted_meta_keys) ) {
3268 continue;
3269 }
3270
3271 $meta_value = maybe_unserialize( $meta_value );
3272 $meta_value = is_array( $meta_value ) ? current( $meta_value ) : $meta_value;
3273
3274 Give()->comment->db_meta->update_meta( $comment_id, $meta_key, $meta_value );
3275 }
3276 }
3277
3278 Give()->comment->db_meta->update_meta( $comment_id, '_give_form_id', $form_id );
3279
3280 // Delete comment.
3281 update_comment_meta( $comment->comment_ID, '_give_comment_moved', 1 );
3282 }
3283
3284 } else {
3285 $comment_ids = $wpdb->get_col(
3286 $wpdb->prepare(
3287 "
3288 SELECT DISTINCT comment_id
3289 FROM {$wpdb->commentmeta}
3290 WHERE meta_key=%s
3291 AND meta_value=%d
3292 ",
3293 '_give_comment_moved',
3294 1
3295 )
3296 );
3297
3298 if( ! empty( $comment_ids ) ) {
3299 $comment_ids = "'" . implode( "','", $comment_ids ). "'";
3300
3301 $wpdb->query( "DELETE FROM {$wpdb->comments} WHERE comment_ID IN ({$comment_ids})" );
3302 $wpdb->query( "DELETE FROM {$wpdb->commentmeta} WHERE comment_id IN ({$comment_ids})" );
3303 }
3304
3305 // The Update Ran.
3306 give_set_upgrade_complete( 'v230_move_donation_note' );
3307 }
3308 }
3309
3310 /**
3311 * Delete donor wall related donor meta data
3312 *
3313 * @since 2.3.0
3314 *
3315 */
3316 function give_v230_delete_dw_related_donor_data_callback(){
3317 global $wpdb;
3318
3319 $give_updates = Give_Updates::get_instance();
3320
3321 $wpdb->query( "DELETE FROM {$wpdb->donormeta} WHERE meta_key LIKE '%_give_anonymous_donor%' OR meta_key='_give_has_comment';" );
3322
3323 $give_updates->percentage = 100;
3324
3325 // The Update Ran.
3326 give_set_upgrade_complete( 'v230_delete_donor_wall_related_donor_data' );
3327 }
3328
3329 /**
3330 * Delete donor wall related comment meta data
3331 *
3332 * @since 2.3.0
3333 *
3334 */
3335 function give_v230_delete_dw_related_comment_data_callback(){
3336 global $wpdb;
3337
3338 $give_updates = Give_Updates::get_instance();
3339
3340 $wpdb->query( "DELETE FROM {$wpdb->give_commentmeta} WHERE meta_key='_give_anonymous_donation';" );
3341
3342 $give_updates->percentage = 100;
3343
3344 // The Update Ran.
3345 give_set_upgrade_complete( 'v230_delete_donor_wall_related_comment_data' );
3346 }
3347
3348 /**
3349 * Update donation form goal progress data.
3350 *
3351 * @since 2.4.0
3352 *
3353 */
3354 function give_v240_update_form_goal_progress_callback() {
3355
3356 /* @var Give_Updates $give_updates */
3357 $give_updates = Give_Updates::get_instance();
3358
3359 // form query
3360 $forms = new WP_Query(
3361 array(
3362 'paged' => $give_updates->step,
3363 'status' => 'any',
3364 'order' => 'ASC',
3365 'post_type' => 'give_forms',
3366 'posts_per_page' => 20,
3367 )
3368 );
3369
3370 if ( $forms->have_posts() ) {
3371 while ( $forms->have_posts() ) {
3372 $forms->the_post();
3373
3374 // Update the goal progress for donation form.
3375 give_update_goal_progress( get_the_ID() );
3376
3377 }// End while().
3378
3379 wp_reset_postdata();
3380
3381 } else {
3382
3383 // No more forms found, finish up.
3384 give_set_upgrade_complete( 'v240_update_form_goal_progress' );
3385
3386 }
3387 }
3388
3389
3390 /**
3391 * Manual update handler for v241_remove_sale_logs
3392 *
3393 * @since 2.4.1
3394 */
3395 function give_v241_remove_sale_logs_callback() {
3396 global $wpdb;
3397
3398 $log_table = Give()->logs->log_db->table_name;
3399 $log_meta_table = Give()->logs->logmeta_db->table_name;
3400
3401 $sql = "DELETE {$log_table}, {$log_meta_table}
3402 FROM {$log_table}
3403 INNER JOIN {$log_meta_table} ON {$log_meta_table}.log_id={$log_table}.ID
3404 WHERE log_type='sale'
3405 ";
3406
3407 // Remove donation logs.
3408 $wpdb->query( $sql );
3409
3410 give_set_upgrade_complete( 'v241_remove_sale_logs' );
3411 }
3412
3413
3414 /**
3415 * DB upgrades for Give 2.5.0
3416 *
3417 * !since 2.5.0
3418 */
3419 function give_v250_upgrades() {
3420 global $wpdb;
3421
3422 $old_license = array();
3423 $new_license = array();
3424 $give_licenses = get_option( 'give_licenses', array() );
3425 $give_options = give_get_settings();
3426
3427 // Get add-ons license key.
3428 $addons = array();
3429 foreach ( $give_options as $key => $value ) {
3430 if ( false !== strpos( $key, '_license_key' ) ) {
3431 $addons[ $key ] = $value;
3432 }
3433 }
3434
3435 // Bailout: We do not have any add-on license data to upgrade.
3436 if ( empty( $addons ) ) {
3437 return false;
3438 }
3439
3440 foreach ( $addons as $key => $license_key ) {
3441
3442 // Get addon shortname.
3443 $addon_shortname = str_replace( '_license_key', '', $key );
3444
3445 // Addon license option name.
3446 $addon_shortname = "{$addon_shortname}_license_active";
3447 $addon_license_data = get_option( "{$addon_shortname}_license_active", array() );
3448
3449 if (
3450 ! $license_key
3451 || array_key_exists( $license_key, $give_licenses )
3452 ) {
3453 continue;
3454 }
3455
3456 $old_license[ $license_key ] = $addon_license_data;
3457 }
3458
3459 // Bailout.
3460 if ( empty( $old_license ) ) {
3461 return false;
3462 }
3463
3464 /* @var stdClass $data */
3465 foreach ( $old_license as $key => $data ) {
3466 $tmp = Give_License::request_license_api( array(
3467 'edd_action' => 'check_license',
3468 'license' => $key,
3469 ), true );
3470
3471 if ( is_wp_error( $tmp ) || ! $tmp['success'] ) {
3472 continue;
3473 }
3474
3475 $new_license[ $key ] = $tmp;
3476 }
3477
3478 // Bailout.
3479 if ( empty( $new_license ) ) {
3480 return false;
3481 }
3482
3483 $give_licenses = array_merge( $give_licenses, $new_license );
3484
3485 update_option( 'give_licenses', $give_licenses );
3486
3487 /**
3488 * Delete data.
3489 */
3490
3491 // 1. license keys
3492 foreach ( get_option( 'give_settings' ) as $index => $setting ) {
3493 if ( false !== strpos( $index, '_license_key' ) ) {
3494 give_delete_option( $index );
3495 }
3496 }
3497
3498 // 2. license api data
3499 $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name like '%_license_active%' AND option_name like 'give_%'" );
3500
3501 // 3. subscriptions data
3502 delete_option( '_give_subscriptions_edit_last' );
3503 delete_option( 'give_subscriptions' );
3504
3505 // 4. misc
3506 delete_option( 'give_is_addon_activated' );
3507
3508 give_refresh_licenses();
3509 }
3510