OwlCyberSecurity - MANAGER
Edit File: upgrade-functions.php
<?php /** * Upgrade Functions * * @package Give * @since 1.0 * * NOTICE: When adding new upgrade notices, please be sure to put the action into the upgrades array during install: * /includes/install.php @ Appox Line 156 * @copyright Copyright (c) 2016, GiveWP * @license https://opensource.org/licenses/gpl-license GNU Public License * @subpackage Admin/Upgrades */ // Exit if accessed directly. use Give\Helpers\Gateways\Stripe; if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Perform automatic database upgrades when necessary. * * @since 1.6 * @return void */ function give_do_automatic_upgrades() { $did_upgrade = false; $give_version = preg_replace( '/[^0-9.].*/', '', Give_Cache_Setting::get_option( 'give_version' ) ); if ( ! $give_version ) { // 1.0 is the first version to use this option so we must add it. $give_version = '1.0'; } switch ( true ) { case version_compare( $give_version, '1.6', '<' ): give_v16_upgrades(); $did_upgrade = true; case version_compare( $give_version, '1.7', '<' ): give_v17_upgrades(); $did_upgrade = true; case version_compare( $give_version, '1.8', '<' ): give_v18_upgrades(); $did_upgrade = true; case version_compare( $give_version, '1.8.7', '<' ): give_v187_upgrades(); $did_upgrade = true; case version_compare( $give_version, '1.8.8', '<' ): give_v188_upgrades(); $did_upgrade = true; case version_compare( $give_version, '1.8.9', '<' ): give_v189_upgrades(); $did_upgrade = true; case version_compare( $give_version, '1.8.12', '<' ): give_v1812_upgrades(); $did_upgrade = true; case version_compare( $give_version, '1.8.13', '<' ): give_v1813_upgrades(); $did_upgrade = true; case version_compare( $give_version, '1.8.17', '<' ): give_v1817_upgrades(); $did_upgrade = true; case version_compare( $give_version, '1.8.18', '<' ): give_v1818_upgrades(); $did_upgrade = true; case version_compare( $give_version, '2.0', '<' ): give_v20_upgrades(); $did_upgrade = true; case version_compare( $give_version, '2.0.1', '<' ): // Do nothing on fresh install. if ( ! doing_action( 'give_upgrades' ) ) { give_v201_create_tables(); Give_Updates::get_instance()->__health_background_update( Give_Updates::get_instance() ); Give_Updates::$background_updater->dispatch(); } $did_upgrade = true; case version_compare( $give_version, '2.0.2', '<' ): // Remove 2.0.1 update to rerun on 2.0.2 $completed_upgrades = give_get_completed_upgrades(); $v201_updates = [ 'v201_upgrades_payment_metadata', 'v201_add_missing_donors', 'v201_move_metadata_into_new_table', 'v201_logs_upgrades', ]; foreach ( $v201_updates as $v201_update ) { if ( in_array( $v201_update, $completed_upgrades ) ) { unset( $completed_upgrades[ array_search( $v201_update, $completed_upgrades ) ] ); } } update_option( 'give_completed_upgrades', $completed_upgrades, false ); // Do nothing on fresh install. if ( ! doing_action( 'give_upgrades' ) ) { give_v201_create_tables(); Give_Updates::get_instance()->__health_background_update( Give_Updates::get_instance() ); Give_Updates::$background_updater->dispatch(); } $did_upgrade = true; case version_compare( $give_version, '2.0.3', '<' ): give_v203_upgrades(); $did_upgrade = true; case version_compare( $give_version, '2.2.0', '<' ): give_v220_upgrades(); $did_upgrade = true; case version_compare( $give_version, '2.2.1', '<' ): give_v221_upgrades(); $did_upgrade = true; case version_compare( $give_version, '2.3.0', '<' ): give_v230_upgrades(); $did_upgrade = true; case version_compare( $give_version, '2.5.0', '<' ): give_v250_upgrades(); $did_upgrade = true; case version_compare( $give_version, '2.5.8', '<' ): give_v258_upgrades(); $did_upgrade = true; case version_compare( $give_version, '2.5.11', '<' ): give_v2511_upgrades(); $did_upgrade = true; case version_compare( $give_version, '2.6.3', '<' ): give_v263_upgrades(); $did_upgrade = true; case version_compare( $give_version, '2.7.0', '<' ): // Flush rewrite rules. It will help to store register route for embed form. flush_rewrite_rules(); give_v270_upgrades(); $did_upgrade = true; case version_compare( $give_version, '2.9.0', '<' ): give_v290_remove_old_export_files(); $did_upgrade = true; } if ( $did_upgrade || version_compare( $give_version, GIVE_VERSION, '<' ) ) { update_option( 'give_version', GIVE_VERSION, false ); } } add_action( 'admin_init', 'give_do_automatic_upgrades', 0 ); add_action( 'give_upgrades', 'give_do_automatic_upgrades', 0 ); /** * Display Upgrade Notices. * * IMPORTANT: ALSO UPDATE INSTALL.PHP WITH THE ID OF THE UPGRADE ROUTINE SO IT DOES NOT AFFECT NEW INSTALLS. * * @since 1.0 * @since 1.8.12 Update new update process code. * * @param Give_Updates $give_updates * * @return void */ function give_show_upgrade_notices( $give_updates ) { // v1.3.2 Upgrades $give_updates->register( [ 'id' => 'upgrade_give_payment_customer_id', 'version' => '1.3.2', 'callback' => 'give_v132_upgrade_give_payment_customer_id', ] ); // v1.3.4 Upgrades ensure the user has gone through 1.3.4. $give_updates->register( [ 'id' => 'upgrade_give_offline_status', 'depend' => 'upgrade_give_payment_customer_id', 'version' => '1.3.4', 'callback' => 'give_v134_upgrade_give_offline_status', ] ); // v1.8 form metadata upgrades. $give_updates->register( [ 'id' => 'v18_upgrades_form_metadata', 'version' => '1.8', 'callback' => 'give_v18_upgrades_form_metadata', ] ); // v1.8.9 Upgrades $give_updates->register( [ 'id' => 'v189_upgrades_levels_post_meta', 'version' => '1.8.9', 'callback' => 'give_v189_upgrades_levels_post_meta_callback', ] ); // v1.8.12 Upgrades $give_updates->register( [ 'id' => 'v1812_update_amount_values', 'version' => '1.8.12', 'callback' => 'give_v1812_update_amount_values_callback', ] ); // v1.8.12 Upgrades $give_updates->register( [ 'id' => 'v1812_update_donor_purchase_values', 'version' => '1.8.12', 'callback' => 'give_v1812_update_donor_purchase_value_callback', ] ); // v1.8.13 Upgrades for donor $give_updates->register( [ 'id' => 'v1813_update_donor_user_roles', 'version' => '1.8.13', 'callback' => 'give_v1813_update_donor_user_roles_callback', ] ); // v1.8.17 Upgrades for donations. $give_updates->register( [ 'id' => 'v1817_update_donation_iranian_currency_code', 'version' => '1.8.17', 'callback' => 'give_v1817_update_donation_iranian_currency_code', ] ); // v1.8.17 Upgrades for cleanup of user roles. $give_updates->register( [ 'id' => 'v1817_cleanup_user_roles', 'version' => '1.8.17', 'callback' => 'give_v1817_cleanup_user_roles', ] ); // v1.8.18 Upgrades for assigning custom amount to existing set donations. $give_updates->register( [ 'id' => 'v1818_assign_custom_amount_set_donation', 'version' => '1.8.18', 'callback' => 'give_v1818_assign_custom_amount_set_donation', ] ); // v1.8.18 Cleanup the Give Worker Role Caps. $give_updates->register( [ 'id' => 'v1818_give_worker_role_cleanup', 'version' => '1.8.18', 'callback' => 'give_v1818_give_worker_role_cleanup', ] ); // v2.0.0 Upgrades $give_updates->register( [ 'id' => 'v20_upgrades_form_metadata', 'version' => '2.0.0', 'callback' => 'give_v20_upgrades_form_metadata_callback', ] ); // v2.0.0 User Address Upgrades $give_updates->register( [ 'id' => 'v20_upgrades_user_address', 'version' => '2.0.0', 'callback' => 'give_v20_upgrades_user_address', ] ); // v2.0.0 Upgrades $give_updates->register( [ 'id' => 'v20_upgrades_payment_metadata', 'version' => '2.0.0', 'callback' => 'give_v20_upgrades_payment_metadata_callback', ] ); // v2.0.0 Donor Name Upgrades $give_updates->register( [ 'id' => 'v20_upgrades_donor_name', 'version' => '2.0.0', 'callback' => 'give_v20_upgrades_donor_name', ] ); // v2.0.0 Upgrades $give_updates->register( [ 'id' => 'v20_move_metadata_into_new_table', 'version' => '2.0.0', 'callback' => 'give_v20_move_metadata_into_new_table_callback', 'depend' => [ 'v20_upgrades_payment_metadata', 'v20_upgrades_form_metadata' ], ] ); // v2.0.0 Upgrades $give_updates->register( [ 'id' => 'v20_rename_donor_tables', 'version' => '2.0.0', 'callback' => 'give_v20_rename_donor_tables_callback', 'depend' => [ 'v20_move_metadata_into_new_table', 'v20_upgrades_form_metadata', 'v20_upgrades_payment_metadata', 'v20_upgrades_user_address', 'v20_upgrades_donor_name', ], ] ); // v2.0.1 Upgrades $give_updates->register( [ 'id' => 'v201_upgrades_payment_metadata', 'version' => '2.0.1', 'callback' => 'give_v201_upgrades_payment_metadata_callback', ] ); // v2.0.1 Upgrades $give_updates->register( [ 'id' => 'v201_add_missing_donors', 'version' => '2.0.1', 'callback' => 'give_v201_add_missing_donors_callback', ] ); // Run v2.0.0 Upgrades again in 2.0.1 $give_updates->register( [ 'id' => 'v201_move_metadata_into_new_table', 'version' => '2.0.1', 'callback' => 'give_v201_move_metadata_into_new_table_callback', 'depend' => [ 'v201_upgrades_payment_metadata', 'v201_add_missing_donors' ], ] ); // v2.1 Verify Form Status Upgrade. $give_updates->register( [ 'id' => 'v210_verify_form_status_upgrades', 'version' => '2.1.0', 'callback' => 'give_v210_verify_form_status_upgrades_callback', ] ); // v2.1.3 Delete non attached donation meta. $give_updates->register( [ 'id' => 'v213_delete_donation_meta', 'version' => '2.1.3', 'callback' => 'give_v213_delete_donation_meta_callback', 'depends' => [ 'v201_move_metadata_into_new_table' ], ] ); // v2.1.5 Add additional capability to the give_manager role. $give_updates->register( [ 'id' => 'v215_update_donor_user_roles', 'version' => '2.1.5', 'callback' => 'give_v215_update_donor_user_roles_callback', ] ); // v2.2.4 set each donor to anonymous by default. $give_updates->register( [ 'id' => 'v224_update_donor_meta', 'version' => '2.2.4', 'callback' => 'give_v224_update_donor_meta_callback', ] ); // v2.2.4 Associate form IDs with donor meta of anonymous donations. $give_updates->register( [ 'id' => 'v224_update_donor_meta_forms_id', 'version' => '2.2.4', 'callback' => 'give_v224_update_donor_meta_forms_id_callback', 'depend' => 'v224_update_donor_meta', ] ); // v2.3.0 Move donor notes to custom comment table. $give_updates->register( [ 'id' => 'v230_move_donor_note', 'version' => '2.3.0', 'callback' => 'give_v230_move_donor_note_callback', ] ); // v2.3.0 Move donation notes to custom comment table. $give_updates->register( [ 'id' => 'v230_move_donation_note', 'version' => '2.3.0', 'callback' => 'give_v230_move_donation_note_callback', ] ); // v2.3.0 remove donor wall related donor meta data. $give_updates->register( [ 'id' => 'v230_delete_donor_wall_related_donor_data', 'version' => '2.3.0', 'depend' => [ 'v224_update_donor_meta', 'v224_update_donor_meta_forms_id', 'v230_move_donor_note', 'v230_move_donation_note', ], 'callback' => 'give_v230_delete_dw_related_donor_data_callback', ] ); // v2.3.0 remove donor wall related comment meta data. $give_updates->register( [ 'id' => 'v230_delete_donor_wall_related_comment_data', 'version' => '2.3.0', 'callback' => 'give_v230_delete_dw_related_comment_data_callback', 'depend' => [ 'v230_move_donor_note', 'v230_move_donation_note', ], ] ); // v2.4.0 Update donation form goal progress data. $give_updates->register( [ 'id' => 'v240_update_form_goal_progress', 'version' => '2.4.0', 'callback' => 'give_v240_update_form_goal_progress_callback', ] ); $give_updates->register( [ 'id' => 'v270_store_stripe_account_for_donation', 'version' => '2.7.0', 'callback' => 'give_v270_store_stripe_account_for_donation_callback', ] ); } add_action( 'give_register_updates', 'give_show_upgrade_notices' ); /** * Triggers all upgrade functions * * This function is usually triggered via AJAX * * @since 1.0 * @return void */ function give_trigger_upgrades() { if ( ! current_user_can( 'manage_give_settings' ) ) { wp_die( esc_html__( 'You do not have permission to do GiveWP upgrades.', 'give' ), esc_html__( 'Error', 'give' ), [ 'response' => 403, ] ); } $give_version = get_option( 'give_version' ); if ( ! $give_version ) { // 1.0 is the first version to use this option so we must add it. $give_version = '1.0'; add_option( 'give_version', $give_version, '', false ); } update_option( 'give_version', GIVE_VERSION, false ); delete_option( 'give_doing_upgrade' ); if ( DOING_AJAX ) { die( 'complete' ); } // End if(). } add_action( 'wp_ajax_give_trigger_upgrades', 'give_trigger_upgrades' ); /** * Upgrades the * * Standardizes the discrepancies between two metakeys `_give_payment_customer_id` and `_give_payment_donor_id` * * @since 1.3.2 */ function give_v132_upgrade_give_payment_customer_id() { global $wpdb; /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); // UPDATE DB METAKEYS. $sql = "UPDATE $wpdb->postmeta SET meta_key = '_give_payment_customer_id' WHERE meta_key = '_give_payment_donor_id'"; $query = $wpdb->query( $sql ); $give_updates->percentage = 100; give_set_upgrade_complete( 'upgrade_give_payment_customer_id' ); } /** * Upgrades the Offline Status * * Reverses the issue where offline donations in "pending" status where inappropriately marked as abandoned * * @since 1.3.4 */ function give_v134_upgrade_give_offline_status() { global $wpdb; /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); // Get abandoned offline payments. $select = "SELECT ID FROM $wpdb->posts p "; $join = "LEFT JOIN $wpdb->postmeta m ON p.ID = m.post_id "; $where = "WHERE p.post_type = 'give_payment' "; $where .= "AND ( p.post_status = 'abandoned' )"; $where .= "AND ( m.meta_key = '_give_payment_gateway' AND m.meta_value = 'offline' )"; $sql = $select . $join . $where; $found_payments = $wpdb->get_col( $sql ); foreach ( $found_payments as $payment ) { // Only change ones marked abandoned since our release last week because the admin may have marked some abandoned themselves. $modified_time = get_post_modified_time( 'U', false, $payment ); // 1450124863 = 12/10/2015 20:42:25. if ( $modified_time >= 1450124863 ) { give_update_payment_status( $payment, 'pending' ); } } $give_updates->percentage = 100; give_set_upgrade_complete( 'upgrade_give_offline_status' ); } /** * Cleanup User Roles * * This upgrade routine removes unused roles and roles with typos * * @since 1.5.2 */ function give_v152_cleanup_users() { $give_version = get_option( 'give_version' ); if ( ! $give_version ) { // 1.0 is the first version to use this option so we must add it. $give_version = '1.0'; } $give_version = preg_replace( '/[^0-9.].*/', '', $give_version ); // v1.5.2 Upgrades if ( version_compare( $give_version, '1.5.2', '<' ) || ! give_has_upgrade_completed( 'upgrade_give_user_caps_cleanup' ) ) { // Delete all caps with "ss". // Also delete all unused "campaign" roles. $delete_caps = [ 'delete_give_formss', 'delete_others_give_formss', 'delete_private_give_formss', 'delete_published_give_formss', 'read_private_forms', 'edit_give_formss', 'edit_others_give_formss', 'edit_private_give_formss', 'edit_published_give_formss', 'publish_give_formss', 'read_private_give_formss', 'assign_give_campaigns_terms', 'delete_give_campaigns', 'delete_give_campaigns_terms', 'delete_give_campaignss', 'delete_others_give_campaignss', 'delete_private_give_campaignss', 'delete_published_give_campaignss', 'edit_give_campaigns', 'edit_give_campaigns_terms', 'edit_give_campaignss', 'edit_others_give_campaignss', 'edit_private_give_campaignss', 'edit_published_give_campaignss', 'manage_give_campaigns_terms', 'publish_give_campaignss', 'read_give_campaigns', 'read_private_give_campaignss', 'view_give_campaigns_stats', 'delete_give_paymentss', 'delete_others_give_paymentss', 'delete_private_give_paymentss', 'delete_published_give_paymentss', 'edit_give_paymentss', 'edit_others_give_paymentss', 'edit_private_give_paymentss', 'edit_published_give_paymentss', 'publish_give_paymentss', 'read_private_give_paymentss', ]; global $wp_roles; foreach ( $delete_caps as $cap ) { foreach ( array_keys( $wp_roles->roles ) as $role ) { $wp_roles->remove_cap( $role, $cap ); } } // Create Give plugin roles. $roles = new Give_Roles(); $roles->add_roles(); $roles->add_caps(); // The Update Ran. update_option( 'give_version', GIVE_VERSION, false ); give_set_upgrade_complete( 'upgrade_give_user_caps_cleanup' ); delete_option( 'give_doing_upgrade' ); }// End if(). } add_action( 'admin_init', 'give_v152_cleanup_users' ); /** * 1.6 Upgrade routine to create the customer meta table. * * @since 1.6 * @return void */ function give_v16_upgrades() { // Create the donor databases. $donors_db = new Give_DB_Donors(); $donors_db->create_table(); $donor_meta = new Give_DB_Donor_Meta(); $donor_meta->create_table(); } /** * 1.7 Upgrades. * * a. Update license api data for plugin addons. * b. Cleanup user roles. * * @since 1.7 * @return void */ function give_v17_upgrades() { // Upgrade license data. give_v17_upgrade_addon_license_data(); give_v17_cleanup_roles(); } /** * Upgrade license data * * @since 1.7 */ function give_v17_upgrade_addon_license_data() { $give_options = give_get_settings(); $api_url = 'https://givewp.com/give-sl-api/'; // Get addons license key. $addons = []; foreach ( $give_options as $key => $value ) { if ( false !== strpos( $key, '_license_key' ) ) { $addons[ $key ] = $value; } } // Bailout: We do not have any addon license data to upgrade. if ( empty( $addons ) ) { return false; } foreach ( $addons as $key => $addon_license ) { // Get addon shortname. $shortname = str_replace( '_license_key', '', $key ); // Addon license option name. $addon_license_option_name = $shortname . '_license_active'; // bailout if license is empty. if ( empty( $addon_license ) ) { delete_option( $addon_license_option_name ); continue; } // Get addon name. $addon_name = []; $addon_name_parts = explode( '_', str_replace( 'give_', '', $shortname ) ); foreach ( $addon_name_parts as $name_part ) { // Fix addon name switch ( $name_part ) { case 'authorizenet': $name_part = 'authorize.net'; break; } $addon_name[] = ucfirst( $name_part ); } $addon_name = implode( ' ', $addon_name ); // Data to send to the API. $api_params = [ 'edd_action' => 'activate_license', // never change from "edd_" to "give_"! 'license' => $addon_license, 'item_name' => urlencode( $addon_name ), 'url' => home_url(), ]; // Call the API. $response = wp_remote_post( $api_url, [ 'timeout' => 15, 'sslverify' => false, 'body' => $api_params, ] ); // Make sure there are no errors. if ( is_wp_error( $response ) ) { delete_option( $addon_license_option_name ); continue; } // Tell WordPress to look for updates. set_site_transient( 'update_plugins', null ); // Decode license data. $license_data = json_decode( wp_remote_retrieve_body( $response ) ); update_option( $addon_license_option_name, $license_data, false ); }// End foreach(). } /** * Cleanup User Roles. * * This upgrade routine removes unused roles and roles with typos. * * @since 1.7 */ function give_v17_cleanup_roles() { // Delete all caps with "_give_forms_" and "_give_payments_". // These roles have no usage; the proper is singular. $delete_caps = [ 'view_give_forms_stats', 'delete_give_forms_terms', 'assign_give_forms_terms', 'edit_give_forms_terms', 'manage_give_forms_terms', 'view_give_payments_stats', 'manage_give_payments_terms', 'edit_give_payments_terms', 'assign_give_payments_terms', 'delete_give_payments_terms', ]; global $wp_roles; foreach ( $delete_caps as $cap ) { foreach ( array_keys( $wp_roles->roles ) as $role ) { $wp_roles->remove_cap( $role, $cap ); } } // Set roles again. $roles = new Give_Roles(); $roles->add_roles(); $roles->add_caps(); } /** * 1.8 Upgrades. * * a. Upgrade checkbox settings to radio button settings. * a. Update form meta for new metabox settings. * * @since 1.8 * @return void */ function give_v18_upgrades() { // Upgrade checkbox settings to radio button settings. give_v18_upgrades_core_setting(); } /** * Upgrade core settings. * * @since 1.8 * @return void */ function give_v18_upgrades_core_setting() { // Core settings which changes from checkbox to radio. $core_setting_names = array_merge( array_keys( give_v18_renamed_core_settings() ), [ 'uninstall_on_delete', 'scripts_footer', 'test_mode', 'email_access', 'terms', 'give_offline_donation_enable_billing_fields', ] ); // Bailout: If not any setting define. if ( $give_settings = get_option( 'give_settings' ) ) { $setting_changed = false; // Loop: check each setting field. foreach ( $core_setting_names as $setting_name ) { // New setting name. $new_setting_name = preg_replace( '/^(enable_|disable_)/', '', $setting_name ); // Continue: If setting already set. if ( array_key_exists( $new_setting_name, $give_settings ) && in_array( $give_settings[ $new_setting_name ], [ 'enabled', 'disabled' ] ) ) { continue; } // Set checkbox value to radio value. $give_settings[ $setting_name ] = ( ! empty( $give_settings[ $setting_name ] ) && 'on' === $give_settings[ $setting_name ] ? 'enabled' : 'disabled' ); // @see https://github.com/impress-org/give/issues/1063. if ( false !== strpos( $setting_name, 'disable_' ) ) { $give_settings[ $new_setting_name ] = ( give_is_setting_enabled( $give_settings[ $setting_name ] ) ? 'disabled' : 'enabled' ); } elseif ( false !== strpos( $setting_name, 'enable_' ) ) { $give_settings[ $new_setting_name ] = ( give_is_setting_enabled( $give_settings[ $setting_name ] ) ? 'enabled' : 'disabled' ); } // Tell bot to update core setting to db. if ( ! $setting_changed ) { $setting_changed = true; } } // Update setting only if they changed. if ( $setting_changed ) { update_option( 'give_settings', $give_settings, false ); } }// End if(). give_set_upgrade_complete( 'v18_upgrades_core_setting' ); } /** * Upgrade form metadata for new metabox settings. * * @since 1.8 * @return void */ function give_v18_upgrades_form_metadata() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); // form query $forms = new WP_Query( [ 'paged' => $give_updates->step, 'status' => 'any', 'order' => 'ASC', 'post_type' => 'give_forms', 'posts_per_page' => 20, ] ); if ( $forms->have_posts() ) { $give_updates->set_percentage( $forms->found_posts, ( $give_updates->step * 20 ) ); while ( $forms->have_posts() ) { $forms->the_post(); // Form content. // Note in version 1.8 display content setting split into display content and content placement setting. // You can delete _give_content_option in future. $show_content = give_get_meta( get_the_ID(), '_give_content_option', true ); if ( $show_content && ! give_get_meta( get_the_ID(), '_give_display_content', true ) ) { $field_value = ( 'none' !== $show_content ? 'enabled' : 'disabled' ); give_update_meta( get_the_ID(), '_give_display_content', $field_value ); $field_value = ( 'none' !== $show_content ? $show_content : 'give_pre_form' ); give_update_meta( get_the_ID(), '_give_content_placement', $field_value ); } // "Disable" Guest Donation. Checkbox. // See: https://github.com/impress-org/give/issues/1470. $guest_donation = give_get_meta( get_the_ID(), '_give_logged_in_only', true ); $guest_donation_newval = ( in_array( $guest_donation, [ 'yes', 'on' ] ) ? 'disabled' : 'enabled' ); give_update_meta( get_the_ID(), '_give_logged_in_only', $guest_donation_newval ); // Offline Donations. // See: https://github.com/impress-org/give/issues/1579. $offline_donation = give_get_meta( get_the_ID(), '_give_customize_offline_donations', true ); if ( 'no' === $offline_donation ) { $offline_donation_newval = 'global'; } elseif ( 'yes' === $offline_donation ) { $offline_donation_newval = 'enabled'; } else { $offline_donation_newval = 'disabled'; } give_update_meta( get_the_ID(), '_give_customize_offline_donations', $offline_donation_newval ); // Convert yes/no setting field to enabled/disabled. $form_radio_settings = [ // Custom Amount. '_give_custom_amount', // Donation Gaol. '_give_goal_option', // Close Form. '_give_close_form_when_goal_achieved', // Term & conditions. '_give_terms_option', // Billing fields. '_give_offline_donation_enable_billing_fields_single', ]; foreach ( $form_radio_settings as $meta_key ) { // Get value. $field_value = give_get_meta( get_the_ID(), $meta_key, true ); // Convert meta value only if it is in yes/no/none. if ( in_array( $field_value, [ 'yes', 'on', 'no', 'none' ] ) ) { $field_value = ( in_array( $field_value, [ 'yes', 'on' ] ) ? 'enabled' : 'disabled' ); give_update_meta( get_the_ID(), $meta_key, $field_value ); } } }// End while(). wp_reset_postdata(); } else { // No more forms found, finish up. give_set_upgrade_complete( 'v18_upgrades_form_metadata' ); } } /** * Get list of core setting renamed in version 1.8. * * @since 1.8 * @return array */ function give_v18_renamed_core_settings() { return [ 'disable_paypal_verification' => 'paypal_verification', 'disable_css' => 'css', 'disable_forms_singular' => 'forms_singular', 'disable_forms_archives' => 'forms_archives', 'disable_forms_excerpt' => 'forms_excerpt', 'disable_form_featured_img' => 'form_featured_img', 'disable_form_sidebar' => 'form_sidebar', 'disable_admin_notices' => 'admin_notices', 'disable_the_content_filter' => 'the_content_filter', 'enable_floatlabels' => 'floatlabels', 'enable_categories' => 'categories', 'enable_tags' => 'tags', ]; } /** * Upgrade core settings. * * @since 1.8.7 * @return void */ function give_v187_upgrades() { global $wpdb; /** * Upgrade 1: Remove stat and cache transients. */ $cached_options = $wpdb->get_col( $wpdb->prepare( " SELECT * FROM {$wpdb->options} WHERE ( option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s ) ", [ '%_transient_give_stats_%', 'give_cache%', '%_transient_give_add_ons_feed%', '%_transient__give_ajax_works' . '%_transient_give_total_api_keys%', '%_transient_give_i18n_give_promo_hide%', '%_transient_give_contributors%', '%_transient_give_estimated_monthly_stats%', '%_transient_give_earnings_total%', '%_transient_give_i18n_give_%', '%_transient__give_installed%', '%_transient__give_activation_redirect%', '%_transient__give_hide_license_notices_shortly_%', '%give_income_total%', ] ), 1 ); // User related transients. $user_apikey_options = $wpdb->get_results( $wpdb->prepare( "SELECT user_id, meta_key FROM $wpdb->usermeta WHERE meta_value=%s", 'give_user_public_key' ), ARRAY_A ); if ( ! empty( $user_apikey_options ) ) { foreach ( $user_apikey_options as $user ) { $cached_options[] = '_transient_' . md5( 'give_api_user_' . $user['meta_key'] ); $cached_options[] = '_transient_' . md5( 'give_api_user_public_key' . $user['user_id'] ); $cached_options[] = '_transient_' . md5( 'give_api_user_secret_key' . $user['user_id'] ); } } if ( ! empty( $cached_options ) ) { foreach ( $cached_options as $option ) { switch ( true ) { case ( false !== strpos( $option, 'transient' ) ): $option = str_replace( '_transient_', '', $option ); delete_transient( $option ); break; default: delete_option( $option ); } } } } /** * Update Capabilities for Give_Worker User Role. * * This upgrade routine will update access rights for Give_Worker User Role. * * @since 1.8.8 */ function give_v188_upgrades() { global $wp_roles; // Get the role object. $give_worker = get_role( 'give_worker' ); // A list of capabilities to add for give workers. $caps_to_add = [ 'edit_posts', 'edit_pages', ]; foreach ( $caps_to_add as $cap ) { // Add the capability. $give_worker->add_cap( $cap ); } } /** * Update Post meta for minimum and maximum amount for multi level donation forms * * This upgrade routine adds post meta for give_forms CPT for multi level donation form. * * @since 1.8.9 */ function give_v189_upgrades_levels_post_meta_callback() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); // form query. $donation_forms = new WP_Query( [ 'paged' => $give_updates->step, 'status' => 'any', 'order' => 'ASC', 'post_type' => 'give_forms', 'posts_per_page' => 20, ] ); if ( $donation_forms->have_posts() ) { $give_updates->set_percentage( $donation_forms->found_posts, ( $give_updates->step * 20 ) ); while ( $donation_forms->have_posts() ) { $donation_forms->the_post(); $form_id = get_the_ID(); // Remove formatting from _give_set_price. update_post_meta( $form_id, '_give_set_price', give_sanitize_amount( get_post_meta( $form_id, '_give_set_price', true ) ) ); // Remove formatting from _give_custom_amount_minimum. update_post_meta( $form_id, '_give_custom_amount_minimum', give_sanitize_amount( get_post_meta( $form_id, '_give_custom_amount_minimum', true ) ) ); // Bailout. if ( 'set' === get_post_meta( $form_id, '_give_price_option', true ) ) { continue; } $donation_levels = get_post_meta( $form_id, '_give_donation_levels', true ); if ( ! empty( $donation_levels ) ) { foreach ( $donation_levels as $index => $donation_level ) { if ( isset( $donation_level['_give_amount'] ) ) { $donation_levels[ $index ]['_give_amount'] = give_sanitize_amount( $donation_level['_give_amount'] ); } } update_post_meta( $form_id, '_give_donation_levels', $donation_levels ); $donation_levels_amounts = wp_list_pluck( $donation_levels, '_give_amount' ); $min_amount = min( $donation_levels_amounts ); $max_amount = max( $donation_levels_amounts ); // Set Minimum and Maximum amount for Multi Level Donation Forms give_update_meta( $form_id, '_give_levels_minimum_amount', $min_amount ? give_sanitize_amount( $min_amount ) : 0 ); give_update_meta( $form_id, '_give_levels_maximum_amount', $max_amount ? give_sanitize_amount( $max_amount ) : 0 ); } } /* Restore original Post Data */ wp_reset_postdata(); } else { // The Update Ran. give_set_upgrade_complete( 'v189_upgrades_levels_post_meta' ); } } /** * Give version 1.8.9 upgrades * * @since 1.8.9 */ function give_v189_upgrades() { /** * 1. Remove user license related notice show blocked ( Give_Notice will handle ) */ global $wpdb; // Delete permanent notice blocker. $wpdb->query( $wpdb->prepare( " DELETE FROM $wpdb->usermeta WHERE meta_key LIKE '%s' ", '%_give_hide_license_notices_permanently%' ) ); // Delete short notice blocker. $wpdb->query( $wpdb->prepare( " DELETE FROM $wpdb->options WHERE option_name LIKE '%s' ", '%__give_hide_license_notices_shortly_%' ) ); } /** * 2.0 Upgrades. * * @since 2.0 * @return void */ function give_v20_upgrades() { // Update cache setting. give_update_option( 'cache', 'enabled' ); // Upgrade email settings. give_v20_upgrades_email_setting(); } /** * Move old email api settings to new email setting api for following emails: * 1. new offline donation [This was hard coded] * 2. offline donation instruction * 3. new donation * 4. donation receipt * * @since 2.0 */ function give_v20_upgrades_email_setting() { $all_setting = give_get_settings(); // Bailout on fresh install. if ( empty( $all_setting ) ) { return; } $settings = [ 'offline_donation_subject' => 'offline-donation-instruction_email_subject', 'global_offline_donation_email' => 'offline-donation-instruction_email_message', 'donation_subject' => 'donation-receipt_email_subject', 'donation_receipt' => 'donation-receipt_email_message', 'donation_notification_subject' => 'new-donation_email_subject', 'donation_notification' => 'new-donation_email_message', 'admin_notice_emails' => [ 'new-donation_recipient', 'new-offline-donation_recipient', 'new-donor-register_recipient', ], 'admin_notices' => 'new-donation_notification', ]; foreach ( $settings as $old_setting => $new_setting ) { // Do not update already modified if ( ! is_array( $new_setting ) ) { if ( array_key_exists( $new_setting, $all_setting ) || ! array_key_exists( $old_setting, $all_setting ) ) { continue; } } switch ( $old_setting ) { case 'admin_notices': $notification_status = give_get_option( $old_setting, 'enabled' ); give_update_option( $new_setting, $notification_status ); // @todo: Delete this option later ( version > 2.0 ), We need this for per form email addon. // give_delete_option( $old_setting ); break; // @todo: Delete this option later ( version > 2.0 ) because we need this for backward compatibility give_get_admin_notice_emails. case 'admin_notice_emails': $recipients = give_get_admin_notice_emails(); foreach ( $new_setting as $setting ) { // bailout if setting already exist. if ( array_key_exists( $setting, $all_setting ) ) { continue; } give_update_option( $setting, $recipients ); } break; default: give_update_option( $new_setting, give_get_option( $old_setting ) ); give_delete_option( $old_setting ); } } } /** * Give version 1.8.9 upgrades * * @since 1.8.9 */ function give_v1812_upgrades() { /** * Validate number format settings. */ $give_settings = give_get_settings(); $give_setting_updated = false; if ( $give_settings['thousands_separator'] === $give_settings['decimal_separator'] ) { $give_settings['number_decimals'] = 0; $give_settings['decimal_separator'] = ''; $give_setting_updated = true; } elseif ( empty( $give_settings['decimal_separator'] ) ) { $give_settings['number_decimals'] = 0; $give_setting_updated = true; } elseif ( 6 < absint( $give_settings['number_decimals'] ) ) { $give_settings['number_decimals'] = 5; $give_setting_updated = true; } if ( $give_setting_updated ) { update_option( 'give_settings', $give_settings, false ); } } /** * Give version 1.8.12 update * * Standardized amount values to six decimal * * @see https://github.com/impress-org/give/issues/1849#issuecomment-315128602 * * @since 1.8.12 */ function give_v1812_update_amount_values_callback() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); // form query. $donation_forms = new WP_Query( [ 'paged' => $give_updates->step, 'status' => 'any', 'order' => 'ASC', 'post_type' => [ 'give_forms', 'give_payment' ], 'posts_per_page' => 20, ] ); if ( $donation_forms->have_posts() ) { $give_updates->set_percentage( $donation_forms->found_posts, ( $give_updates->step * 20 ) ); while ( $donation_forms->have_posts() ) { $donation_forms->the_post(); global $post; $meta = get_post_meta( $post->ID ); switch ( $post->post_type ) { case 'give_forms': // _give_set_price. if ( ! empty( $meta['_give_set_price'][0] ) ) { update_post_meta( $post->ID, '_give_set_price', give_sanitize_amount_for_db( $meta['_give_set_price'][0] ) ); } // _give_custom_amount_minimum. if ( ! empty( $meta['_give_custom_amount_minimum'][0] ) ) { update_post_meta( $post->ID, '_give_custom_amount_minimum', give_sanitize_amount_for_db( $meta['_give_custom_amount_minimum'][0] ) ); } // _give_levels_minimum_amount. if ( ! empty( $meta['_give_levels_minimum_amount'][0] ) ) { update_post_meta( $post->ID, '_give_levels_minimum_amount', give_sanitize_amount_for_db( $meta['_give_levels_minimum_amount'][0] ) ); } // _give_levels_maximum_amount. if ( ! empty( $meta['_give_levels_maximum_amount'][0] ) ) { update_post_meta( $post->ID, '_give_levels_maximum_amount', give_sanitize_amount_for_db( $meta['_give_levels_maximum_amount'][0] ) ); } // _give_set_goal. if ( ! empty( $meta['_give_set_goal'][0] ) ) { update_post_meta( $post->ID, '_give_set_goal', give_sanitize_amount_for_db( $meta['_give_set_goal'][0] ) ); } // _give_form_earnings. if ( ! empty( $meta['_give_form_earnings'][0] ) ) { update_post_meta( $post->ID, '_give_form_earnings', give_sanitize_amount_for_db( $meta['_give_form_earnings'][0] ) ); } // _give_custom_amount_minimum. if ( ! empty( $meta['_give_donation_levels'][0] ) ) { $donation_levels = unserialize( $meta['_give_donation_levels'][0] ); foreach ( $donation_levels as $index => $level ) { if ( empty( $level['_give_amount'] ) ) { continue; } $donation_levels[ $index ]['_give_amount'] = give_sanitize_amount_for_db( $level['_give_amount'] ); } $meta['_give_donation_levels'] = $donation_levels; update_post_meta( $post->ID, '_give_donation_levels', $meta['_give_donation_levels'] ); } break; case 'give_payment': // _give_payment_total. if ( ! empty( $meta['_give_payment_total'][0] ) ) { update_post_meta( $post->ID, '_give_payment_total', give_sanitize_amount_for_db( $meta['_give_payment_total'][0] ) ); } break; } } /* Restore original Post Data */ wp_reset_postdata(); } else { // The Update Ran. give_set_upgrade_complete( 'v1812_update_amount_values' ); } } /** * Give version 1.8.12 update * * Standardized amount values to six decimal for donor * * @see https://github.com/impress-org/give/issues/1849#issuecomment-315128602 * * @since 1.8.12 */ function give_v1812_update_donor_purchase_value_callback() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); // form query. $donors = Give()->donors->get_donors( [ 'number' => 20, 'offset' => $give_updates->get_offset( 20 ), ] ); if ( ! empty( $donors ) ) { $give_updates->set_percentage( Give()->donors->count(), $give_updates->get_offset( 20 ) ); /* @var Object $donor */ foreach ( $donors as $donor ) { Give()->donors->update( $donor->id, [ 'purchase_value' => give_sanitize_amount_for_db( $donor->purchase_value ) ] ); } } else { // The Update Ran. give_set_upgrade_complete( 'v1812_update_donor_purchase_values' ); } } /** * Upgrade routine for updating user roles for existing donors. * * @since 1.8.13 */ function give_v1813_update_donor_user_roles_callback() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); // Fetch all the existing donors. $donors = Give()->donors->get_donors( [ 'number' => 20, 'offset' => $give_updates->get_offset( 20 ), ] ); if ( ! empty( $donors ) ) { $give_updates->set_percentage( Give()->donors->count(), $give_updates->get_offset( 20 ) ); /* @var Object $donor */ foreach ( $donors as $donor ) { $user_id = $donor->user_id; // Proceed, if donor is attached with user. if ( $user_id ) { $user = get_userdata( $user_id ); // Update user role, if user has subscriber role. if ( is_array( $user->roles ) && in_array( 'subscriber', $user->roles ) ) { wp_update_user( [ 'ID' => $user_id, 'role' => 'give_donor', ] ); } } } } else { // The Update Ran. give_set_upgrade_complete( 'v1813_update_donor_user_roles' ); } } /** * Version 1.8.13 automatic updates * * @since 1.8.13 */ function give_v1813_upgrades() { // Update admin setting. give_update_option( 'donor_default_user_role', 'give_donor' ); // Update Give roles. $roles = new Give_Roles(); $roles->add_roles(); $roles->add_caps(); } /** * Correct currency code for "Iranian Currency" for all of the payments. * * @since 1.8.17 */ function give_v1817_update_donation_iranian_currency_code() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); // form query. $payments = new WP_Query( [ 'paged' => $give_updates->step, 'status' => 'any', 'order' => 'ASC', 'post_type' => [ 'give_payment' ], 'posts_per_page' => 100, ] ); if ( $payments->have_posts() ) { $give_updates->set_percentage( $payments->found_posts, ( $give_updates->step * 100 ) ); while ( $payments->have_posts() ) { $payments->the_post(); $payment_meta = give_get_payment_meta( get_the_ID() ); if ( 'RIAL' === $payment_meta['currency'] ) { $payment_meta['currency'] = 'IRR'; give_update_meta( get_the_ID(), '_give_payment_meta', $payment_meta ); } } } else { // The Update Ran. give_set_upgrade_complete( 'v1817_update_donation_iranian_currency_code' ); } } /** * Correct currency code for "Iranian Currency" in Give setting. * Version 1.8.17 automatic updates * * @since 1.8.17 */ function give_v1817_upgrades() { $give_settings = give_get_settings(); if ( 'RIAL' === $give_settings['currency'] ) { $give_settings['currency'] = 'IRR'; update_option( 'give_settings', $give_settings, false ); } } /** * Process Clean up of User Roles for more flexibility. * * @since 1.8.17 */ function give_v1817_process_cleanup_user_roles() { global $wp_roles; if ( ! ( $wp_roles instanceof WP_Roles ) ) { return; } // Add Capabilities to user roles as required. $add_caps = [ 'administrator' => [ 'view_give_payments', ], ]; // Remove Capabilities to user roles as required. $remove_caps = [ 'give_manager' => [ 'edit_others_pages', 'edit_others_posts', 'delete_others_pages', 'delete_others_posts', 'manage_categories', 'import', 'export', ], ]; foreach ( $add_caps as $role => $caps ) { foreach ( $caps as $cap ) { $wp_roles->add_cap( $role, $cap ); } } foreach ( $remove_caps as $role => $caps ) { foreach ( $caps as $cap ) { $wp_roles->remove_cap( $role, $cap ); } } } /** * Upgrade Routine - Clean up of User Roles for more flexibility. * * @since 1.8.17 */ function give_v1817_cleanup_user_roles() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); give_v1817_process_cleanup_user_roles(); $give_updates->percentage = 100; // Create Give plugin roles. $roles = new Give_Roles(); $roles->add_roles(); $roles->add_caps(); give_set_upgrade_complete( 'v1817_cleanup_user_roles' ); } /** * Automatic Upgrade for release 1.8.18. * * @since 1.8.18 */ function give_v1818_upgrades() { // Remove email_access_installed from give_settings. give_delete_option( 'email_access_installed' ); } /** * Upgrade Routine - Assigns Custom Amount to existing donation of type set donation. * * @since 1.8.18 */ function give_v1818_assign_custom_amount_set_donation() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); $donations = new WP_Query( [ 'paged' => $give_updates->step, 'status' => 'any', 'order' => 'ASC', 'post_type' => [ 'give_payment' ], 'posts_per_page' => 100, ] ); if ( $donations->have_posts() ) { $give_updates->set_percentage( $donations->found_posts, $give_updates->step * 100 ); while ( $donations->have_posts() ) { $donations->the_post(); $form = new Give_Donate_Form( give_get_meta( get_the_ID(), '_give_payment_form_id', true ) ); $donation_meta = give_get_payment_meta( get_the_ID() ); // Update Donation meta with price_id set as custom, only if it is: // 1. Donation Type = Set Donation. // 2. Donation Price Id is not set to custom. // 3. Form has not enabled custom price and donation amount assures that it is custom amount. if ( $form->ID && $form->is_set_type_donation_form() && ( 'custom' !== $donation_meta['price_id'] ) && $form->is_custom_price( give_get_meta( get_the_ID(), '_give_payment_total', true ) ) ) { $donation_meta['price_id'] = 'custom'; give_update_meta( get_the_ID(), '_give_payment_meta', $donation_meta ); give_update_meta( get_the_ID(), '_give_payment_price_id', 'custom' ); } } wp_reset_postdata(); } else { // Update Ran Successfully. give_set_upgrade_complete( 'v1818_assign_custom_amount_set_donation' ); } } /** * Upgrade Routine - Removed Give Worker caps. * * See: https://github.com/impress-org/give/issues/2476 * * @since 1.8.18 */ function give_v1818_give_worker_role_cleanup() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); global $wp_roles; if ( ! ( $wp_roles instanceof WP_Roles ) ) { return; } // Remove Capabilities to user roles as required. $remove_caps = [ 'give_worker' => [ 'delete_give_payments', 'delete_others_give_payments', 'delete_private_give_payments', 'delete_published_give_payments', 'edit_others_give_payments', 'edit_private_give_payments', 'edit_published_give_payments', 'read_private_give_payments', ], ]; foreach ( $remove_caps as $role => $caps ) { foreach ( $caps as $cap ) { $wp_roles->remove_cap( $role, $cap ); } } $give_updates->percentage = 100; // Create Give plugin roles. $roles = new Give_Roles(); $roles->add_roles(); $roles->add_caps(); give_set_upgrade_complete( 'v1818_give_worker_role_cleanup' ); } /** * * Upgrade form metadata for new metabox settings. * * @since 2.0 * @return void */ function give_v20_upgrades_form_metadata_callback() { $give_updates = Give_Updates::get_instance(); // form query $forms = new WP_Query( [ 'paged' => $give_updates->step, 'status' => 'any', 'order' => 'ASC', 'post_type' => 'give_forms', 'posts_per_page' => 100, ] ); if ( $forms->have_posts() ) { $give_updates->set_percentage( $forms->found_posts, ( $give_updates->step * 100 ) ); while ( $forms->have_posts() ) { $forms->the_post(); global $post; // Update offline instruction email notification status. $offline_instruction_notification_status = get_post_meta( get_the_ID(), '_give_customize_offline_donations', true ); $offline_instruction_notification_status = give_is_setting_enabled( $offline_instruction_notification_status, [ 'enabled', 'global', ] ) ? $offline_instruction_notification_status : 'global'; update_post_meta( get_the_ID(), '_give_offline-donation-instruction_notification', $offline_instruction_notification_status ); // Update offline instruction email message. update_post_meta( get_the_ID(), '_give_offline-donation-instruction_email_message', get_post_meta( get_the_ID(), // @todo: Delete this option later ( version > 2.0 ). '_give_offline_donation_email', true ) ); // Update offline instruction email subject. update_post_meta( get_the_ID(), '_give_offline-donation-instruction_email_subject', get_post_meta( get_the_ID(), // @todo: Delete this option later ( version > 2.0 ). '_give_offline_donation_subject', true ) ); }// End while(). wp_reset_postdata(); } else { // No more forms found, finish up. give_set_upgrade_complete( 'v20_upgrades_form_metadata' ); } } /** * Upgrade payment metadata for new metabox settings. * * @since 2.0 * @return void * @global wpdb $wpdb */ function give_v20_upgrades_payment_metadata_callback() { global $wpdb; $give_updates = Give_Updates::get_instance(); // form query $forms = new WP_Query( [ 'paged' => $give_updates->step, 'status' => 'any', 'order' => 'ASC', 'post_type' => 'give_payment', 'posts_per_page' => 100, ] ); if ( $forms->have_posts() ) { $give_updates->set_percentage( $forms->found_posts, ( $give_updates->step * 100 ) ); while ( $forms->have_posts() ) { $forms->the_post(); global $post; // Split _give_payment_meta meta. // @todo Remove _give_payment_meta after releases 2.0 $payment_meta = give_get_meta( $post->ID, '_give_payment_meta', true ); if ( ! empty( $payment_meta ) ) { _give_20_bc_split_and_save_give_payment_meta( $post->ID, $payment_meta ); } $deprecated_meta_keys = [ '_give_payment_customer_id' => '_give_payment_donor_id', '_give_payment_user_email' => '_give_payment_donor_email', '_give_payment_user_ip' => '_give_payment_donor_ip', ]; foreach ( $deprecated_meta_keys as $old_meta_key => $new_meta_key ) { // Do not add new meta key if already exist. 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 ) ) ) { continue; } $wpdb->insert( $wpdb->postmeta, [ 'post_id' => $post->ID, 'meta_key' => $new_meta_key, 'meta_value' => give_get_meta( $post->ID, $old_meta_key, true ), ] ); } // Bailout if ( $donor_id = give_get_meta( $post->ID, '_give_payment_donor_id', true ) ) { /* @var Give_Donor $donor */ $donor = new Give_Donor( $donor_id ); $address['line1'] = give_get_meta( $post->ID, '_give_donor_billing_address1', true, '' ); $address['line2'] = give_get_meta( $post->ID, '_give_donor_billing_address2', true, '' ); $address['city'] = give_get_meta( $post->ID, '_give_donor_billing_city', true, '' ); $address['state'] = give_get_meta( $post->ID, '_give_donor_billing_state', true, '' ); $address['zip'] = give_get_meta( $post->ID, '_give_donor_billing_zip', true, '' ); $address['country'] = give_get_meta( $post->ID, '_give_donor_billing_country', true, '' ); // Save address. $donor->add_address( 'billing[]', $address ); } }// End while(). wp_reset_postdata(); } else { // @todo Delete user id meta after releases 2.0 // $wpdb->get_var( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE meta_key=%s", '_give_payment_user_id' ) ); // No more forms found, finish up. give_set_upgrade_complete( 'v20_upgrades_payment_metadata' ); } } /** * Move payment and form metadata to new table * * @since 2.0 * @return void */ function give_v20_move_metadata_into_new_table_callback() { global $wpdb; $give_updates = Give_Updates::get_instance(); // form query $payments = new WP_Query( [ 'paged' => $give_updates->step, 'status' => 'any', 'order' => 'ASC', 'post_type' => [ 'give_forms', 'give_payment' ], 'posts_per_page' => 100, ] ); if ( $payments->have_posts() ) { $give_updates->set_percentage( $payments->found_posts, $give_updates->step * 100 ); while ( $payments->have_posts() ) { $payments->the_post(); global $post; $meta_data = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta where post_id=%d", get_the_ID() ), ARRAY_A ); if ( ! empty( $meta_data ) ) { foreach ( $meta_data as $index => $data ) { // Check for duplicate meta values. 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 ) ) { continue; } switch ( $post->post_type ) { case 'give_forms': $data['form_id'] = $data['post_id']; unset( $data['post_id'] ); Give()->form_meta->insert( $data ); // @todo: delete form meta from post meta table after releases 2.0. /*delete_post_meta( get_the_ID(), $data['meta_key'] );*/ break; case 'give_payment': $data['payment_id'] = $data['post_id']; unset( $data['post_id'] ); Give()->payment_meta->insert( $data ); // @todo: delete donation meta from post meta table after releases 2.0. /*delete_post_meta( get_the_ID(), $data['meta_key'] );*/ break; } } } }// End while(). wp_reset_postdata(); } else { // No more forms found, finish up. give_set_upgrade_complete( 'v20_move_metadata_into_new_table' ); } } /** * Upgrade routine for splitting donor name into first name and last name. * * @since 2.0 * * @return void */ function give_v20_upgrades_donor_name() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); $donors = Give()->donors->get_donors( [ 'paged' => $give_updates->step, 'number' => 100, ] ); if ( $donors ) { $give_updates->set_percentage( count( $donors ), $give_updates->step * 100 ); // Loop through Donors foreach ( $donors as $donor ) { $donor_name = explode( ' ', $donor->name, 2 ); $donor_first_name = Give()->donor_meta->get_meta( $donor->id, '_give_donor_first_name' ); $donor_last_name = Give()->donor_meta->get_meta( $donor->id, '_give_donor_last_name' ); // If first name meta of donor is not created, then create it. if ( ! $donor_first_name && isset( $donor_name[0] ) ) { Give()->donor_meta->add_meta( $donor->id, '_give_donor_first_name', $donor_name[0] ); } // If last name meta of donor is not created, then create it. if ( ! $donor_last_name && isset( $donor_name[1] ) ) { Give()->donor_meta->add_meta( $donor->id, '_give_donor_last_name', $donor_name[1] ); } // If Donor is connected with WP User then update user meta. if ( $donor->user_id ) { if ( isset( $donor_name[0] ) ) { update_user_meta( $donor->user_id, 'first_name', $donor_name[0] ); } if ( isset( $donor_name[1] ) ) { update_user_meta( $donor->user_id, 'last_name', $donor_name[1] ); } } } } else { // The Update Ran. give_set_upgrade_complete( 'v20_upgrades_donor_name' ); } } /** * Upgrade routine for user addresses. * * @since 2.0 * @return void * @global wpdb $wpdb * */ function give_v20_upgrades_user_address() { global $wpdb; /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); /* @var WP_User_Query $user_query */ $user_query = new WP_User_Query( [ 'number' => 100, 'paged' => $give_updates->step, ] ); $users = $user_query->get_results(); if ( $users ) { $give_updates->set_percentage( $user_query->get_total(), $give_updates->step * 100 ); // Loop through Donors foreach ( $users as $user ) { /* @var Give_Donor $donor */ $donor = new Give_Donor( $user->ID, true ); if ( ! $donor->id ) { continue; } $address = $wpdb->get_var( $wpdb->prepare( " SELECT meta_value FROM {$wpdb->usermeta} WHERE user_id=%s AND meta_key=%s ", $user->ID, '_give_user_address' ) ); if ( ! empty( $address ) ) { $address = maybe_unserialize( $address ); $donor->add_address( 'personal', $address ); $donor->add_address( 'billing[]', $address ); // @todo: delete _give_user_address from user meta after releases 2.0. /*delete_user_meta( $user->ID, '_give_user_address' );*/ } } } else { // The Update Ran. give_set_upgrade_complete( 'v20_upgrades_user_address' ); } } /** * Upgrade logs data. * * @since 2.0 * @return void * @global wpdb $wpdb */ function give_v20_rename_donor_tables_callback() { global $wpdb; /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); $tables = [ "{$wpdb->prefix}give_customers" => "{$wpdb->prefix}give_donors", "{$wpdb->prefix}give_customermeta" => "{$wpdb->prefix}give_donormeta", ]; // Alter customer table foreach ( $tables as $old_table => $new_table ) { if ( $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', $old_table ) ) && ! $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', $new_table ) ) ) { $wpdb->query( "ALTER TABLE {$old_table} RENAME TO {$new_table}" ); if ( "{$wpdb->prefix}give_donormeta" === $new_table ) { $wpdb->query( "ALTER TABLE {$new_table} CHANGE COLUMN customer_id donor_id bigint(20)" ); } } } $give_updates->percentage = 100; // No more forms found, finish up. give_set_upgrade_complete( 'v20_rename_donor_tables' ); // Re initiate donor classes. Give()->donors = new Give_DB_Donors(); Give()->donor_meta = new Give_DB_Donor_Meta(); } /** * Create missing meta tables. * * @since 2.0.1 * @return void * @global wpdb $wpdb */ function give_v201_create_tables() { global $wpdb; if ( ! $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', "{$wpdb->prefix}give_paymentmeta" ) ) ) { Give()->payment_meta->create_table(); } if ( ! $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', "{$wpdb->prefix}give_formmeta" ) ) ) { Give()->form_meta->create_table(); } } /** * Upgrade payment metadata for new metabox settings. * * @since 2.0.1 * @return void * @global wpdb $wpdb */ function give_v201_upgrades_payment_metadata_callback() { global $wpdb, $post; $give_updates = Give_Updates::get_instance(); give_v201_create_tables(); $payments = $wpdb->get_col( " SELECT ID FROM $wpdb->posts WHERE 1=1 AND ( $wpdb->posts.post_date >= '2018-01-08 00:00:00' ) AND $wpdb->posts.post_type = 'give_payment' AND {$wpdb->posts}.post_status IN ('" . implode( "','", array_keys( give_get_payment_statuses() ) ) . "') ORDER BY $wpdb->posts.post_date ASC LIMIT 100 OFFSET " . $give_updates->get_offset( 100 ) ); if ( ! empty( $payments ) ) { $give_updates->set_percentage( give_get_total_post_type_count( 'give_payment' ), ( $give_updates->step * 100 ) ); foreach ( $payments as $payment_id ) { $post = get_post( $payment_id ); setup_postdata( $post ); // Do not add new meta keys if already refactored. 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' ) ) ) { continue; } // Split _give_payment_meta meta. // @todo Remove _give_payment_meta after releases 2.0 $payment_meta = give_get_meta( $post->ID, '_give_payment_meta', true ); if ( ! empty( $payment_meta ) ) { _give_20_bc_split_and_save_give_payment_meta( $post->ID, $payment_meta ); } $deprecated_meta_keys = [ '_give_payment_customer_id' => '_give_payment_donor_id', '_give_payment_user_email' => '_give_payment_donor_email', '_give_payment_user_ip' => '_give_payment_donor_ip', ]; foreach ( $deprecated_meta_keys as $old_meta_key => $new_meta_key ) { // Do not add new meta key if already exist. 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 ) ) ) { continue; } $wpdb->insert( $wpdb->postmeta, [ 'post_id' => $post->ID, 'meta_key' => $new_meta_key, 'meta_value' => give_get_meta( $post->ID, $old_meta_key, true ), ] ); } // Bailout if ( $donor_id = give_get_meta( $post->ID, '_give_payment_donor_id', true ) ) { /* @var Give_Donor $donor */ $donor = new Give_Donor( $donor_id ); $address['line1'] = give_get_meta( $post->ID, '_give_donor_billing_address1', true, '' ); $address['line2'] = give_get_meta( $post->ID, '_give_donor_billing_address2', true, '' ); $address['city'] = give_get_meta( $post->ID, '_give_donor_billing_city', true, '' ); $address['state'] = give_get_meta( $post->ID, '_give_donor_billing_state', true, '' ); $address['zip'] = give_get_meta( $post->ID, '_give_donor_billing_zip', true, '' ); $address['country'] = give_get_meta( $post->ID, '_give_donor_billing_country', true, '' ); // Save address. $donor->add_address( 'billing[]', $address ); } }// End while(). wp_reset_postdata(); } else { // @todo Delete user id meta after releases 2.0 // $wpdb->get_var( $wpdb->prepare( "DELETE FROM $wpdb->postmeta WHERE meta_key=%s", '_give_payment_user_id' ) ); // No more forms found, finish up. give_set_upgrade_complete( 'v201_upgrades_payment_metadata' ); } } /** * Move payment and form metadata to new table * * @since 2.0.1 * @return void */ function give_v201_move_metadata_into_new_table_callback() { global $wpdb, $post; $give_updates = Give_Updates::get_instance(); give_v201_create_tables(); $payments = $wpdb->get_col( " SELECT ID FROM $wpdb->posts WHERE 1=1 AND ( $wpdb->posts.post_type = 'give_payment' OR $wpdb->posts.post_type = 'give_forms' ) AND {$wpdb->posts}.post_status IN ('" . implode( "','", array_keys( give_get_payment_statuses() ) ) . "') ORDER BY $wpdb->posts.post_date ASC LIMIT 100 OFFSET " . $give_updates->get_offset( 100 ) ); if ( ! empty( $payments ) ) { $give_updates->set_percentage( give_get_total_post_type_count( [ 'give_forms', 'give_payment', ] ), $give_updates->step * 100 ); foreach ( $payments as $payment_id ) { $post = get_post( $payment_id ); setup_postdata( $post ); $meta_data = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta where post_id=%d", get_the_ID() ), ARRAY_A ); if ( ! empty( $meta_data ) ) { foreach ( $meta_data as $index => $data ) { // Check for duplicate meta values. 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 ) ) { continue; } switch ( $post->post_type ) { case 'give_forms': $data['form_id'] = $data['post_id']; unset( $data['post_id'] ); Give()->form_meta->insert( $data ); // @todo: delete form meta from post meta table after releases 2.0. /*delete_post_meta( get_the_ID(), $data['meta_key'] );*/ break; case 'give_payment': $data['payment_id'] = $data['post_id']; unset( $data['post_id'] ); Give()->payment_meta->insert( $data ); // @todo: delete donation meta from post meta table after releases 2.0. /*delete_post_meta( get_the_ID(), $data['meta_key'] );*/ break; } } } }// End while(). wp_reset_postdata(); } else { // No more forms found, finish up. give_set_upgrade_complete( 'v201_move_metadata_into_new_table' ); } } /** * Add missing donor. * * @since 2.0.1 * @return void */ function give_v201_add_missing_donors_callback() { global $wpdb; give_v201_create_tables(); $give_updates = Give_Updates::get_instance(); // Bailout. if ( ! $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', "{$wpdb->prefix}give_customers" ) ) ) { Give_Updates::get_instance()->percentage = 100; give_set_upgrade_complete( 'v201_add_missing_donors' ); } $total_customers = $wpdb->get_var( "SELECT COUNT(id) FROM {$wpdb->prefix}give_customers " ); $customers = wp_list_pluck( $wpdb->get_results( "SELECT id FROM {$wpdb->prefix}give_customers LIMIT 20 OFFSET " . $give_updates->get_offset( 20 ) ), 'id' ); $donors = wp_list_pluck( $wpdb->get_results( "SELECT id FROM {$wpdb->prefix}give_donors" ), 'id' ); if ( ! empty( $customers ) ) { $give_updates->set_percentage( $total_customers, ( $give_updates->step * 20 ) ); $missing_donors = array_diff( $customers, $donors ); $donor_data = []; if ( $missing_donors ) { foreach ( $missing_donors as $donor_id ) { $donor_data[] = [ 'info' => $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_customers WHERE id=%d", $donor_id ) ), 'meta' => $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_customermeta WHERE customer_id=%d", $donor_id ) ), ]; } } if ( ! empty( $donor_data ) ) { $donor_table_name = Give()->donors->table_name; $donor_meta_table_name = Give()->donor_meta->table_name; Give()->donors->table_name = "{$wpdb->prefix}give_donors"; Give()->donor_meta->table_name = "{$wpdb->prefix}give_donormeta"; foreach ( $donor_data as $donor ) { $donor['info'][0] = (array) $donor['info'][0]; // Prevent duplicate meta id issue. if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_donors WHERE id=%d", $donor['info'][0]['id'] ) ) ) { continue; } $donor_id = Give()->donors->add( $donor['info'][0] ); if ( ! empty( $donor['meta'] ) ) { foreach ( $donor['meta'] as $donor_meta ) { $donor_meta = (array) $donor_meta; // Prevent duplicate meta id issue. if ( $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}give_donormeta WHERE meta_id=%d", $donor_meta['meta_id'] ) ) ) { unset( $donor_meta['meta_id'] ); } $donor_meta['donor_id'] = $donor_meta['customer_id']; unset( $donor_meta['customer_id'] ); Give()->donor_meta->insert( $donor_meta ); } } /** * Fix donor name and address */ $address = $wpdb->get_var( $wpdb->prepare( " SELECT meta_value FROM {$wpdb->usermeta} WHERE user_id=%s AND meta_key=%s ", $donor['info'][0]['user_id'], '_give_user_address' ) ); $donor = new Give_Donor( $donor_id ); if ( ! empty( $address ) ) { $address = maybe_unserialize( $address ); $donor->add_address( 'personal', $address ); $donor->add_address( 'billing[]', $address ); } $donor_name = explode( ' ', $donor->name, 2 ); $donor_first_name = Give()->donor_meta->get_meta( $donor->id, '_give_donor_first_name' ); $donor_last_name = Give()->donor_meta->get_meta( $donor->id, '_give_donor_last_name' ); // If first name meta of donor is not created, then create it. if ( ! $donor_first_name && isset( $donor_name[0] ) ) { Give()->donor_meta->add_meta( $donor->id, '_give_donor_first_name', $donor_name[0] ); } // If last name meta of donor is not created, then create it. if ( ! $donor_last_name && isset( $donor_name[1] ) ) { Give()->donor_meta->add_meta( $donor->id, '_give_donor_last_name', $donor_name[1] ); } // If Donor is connected with WP User then update user meta. if ( $donor->user_id ) { if ( isset( $donor_name[0] ) ) { update_user_meta( $donor->user_id, 'first_name', $donor_name[0] ); } if ( isset( $donor_name[1] ) ) { update_user_meta( $donor->user_id, 'last_name', $donor_name[1] ); } } } Give()->donors->table_name = $donor_table_name; Give()->donor_meta->table_name = $donor_meta_table_name; } } else { give_set_upgrade_complete( 'v201_add_missing_donors' ); } } /** * Version 2.0.3 automatic updates * * @since 2.0.3 */ function give_v203_upgrades() { global $wpdb; // Do not auto load option. $wpdb->update( $wpdb->options, [ 'autoload' => 'no' ], [ 'option_name' => 'give_completed_upgrades' ] ); // Remove from cache. $all_options = wp_load_alloptions(); if ( isset( $all_options['give_completed_upgrades'] ) ) { unset( $all_options['give_completed_upgrades'] ); wp_cache_set( 'alloptions', $all_options, 'options' ); } } /** * Version 2.2.0 automatic updates * * @since 2.2.0 */ function give_v220_upgrades() { global $wpdb; /** * Update 1 * * Delete wp session data */ give_v220_delete_wp_session_data(); /** * Update 2 * * Rename payment table */ give_v220_rename_donation_meta_type_callback(); /** * Update 2 * * Set autoload to no to reduce result weight from WordPress query */ $options = [ 'give_settings', 'give_version', 'give_version_upgraded_from', 'give_default_api_version', 'give_site_address_before_migrate', '_give_table_check', 'give_recently_activated_addons', 'give_is_addon_activated', 'give_last_paypal_ipn_received', 'give_use_php_sessions', 'give_subscriptions', '_give_subscriptions_edit_last', ]; // Add all table version option name // Add banner option *_active_by_user $option_like = $wpdb->get_col( " SELECT option_name FROM $wpdb->options WHERE option_name like '%give%' AND ( option_name like '%_db_version%' OR option_name like '%_active_by_user%' OR option_name like '%_license_active%' ) " ); if ( ! empty( $option_like ) ) { $options = array_merge( $options, $option_like ); } $options_str = '\'' . implode( "','", $options ) . '\''; $wpdb->query( " UPDATE $wpdb->options SET autoload = 'no' WHERE option_name IN ( {$options_str} ) " ); } /** * Version 2.2.1 automatic updates * * @since 2.2.1 */ function give_v221_upgrades() { global $wpdb; /** * Update 1 * * Change column length */ $wpdb->query( "ALTER TABLE $wpdb->donors MODIFY email varchar(255) NOT NULL" ); } /** * Version 2.3.0 automatic updates * * @since 2.3.0 */ function give_v230_upgrades() { $options_key = [ 'give_temp_delete_form_ids', // delete import donor 'give_temp_delete_donation_ids', // delete import donor 'give_temp_delete_step', // delete import donor 'give_temp_delete_donor_ids', // delete import donor 'give_temp_delete_step_on', // delete import donor 'give_temp_delete_donation_ids', // delete test donor 'give_temp_delete_donor_ids', // delete test donor 'give_temp_delete_step', // delete test donor 'give_temp_delete_step_on', // delete test donor 'give_temp_delete_test_ids', // delete test donations 'give_temp_all_payments_data', // delete all stats 'give_recount_all_total', // delete all stats 'give_temp_recount_all_stats', // delete all stats 'give_temp_payment_items', // delete all stats 'give_temp_form_ids', // delete all stats 'give_temp_processed_payments', // delete all stats 'give_temp_recount_form_stats', // delete form stats 'give_temp_recount_earnings', // recount income 'give_recount_earnings_total', // recount income 'give_temp_reset_ids', // reset stats ]; $options_key = '\'' . implode( "','", $options_key ) . '\''; global $wpdb; /** * Update 1 * * delete unwanted key from option table */ $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name IN ( {$options_key} )" ); } /** * Upgrade routine for 2.1 to set form closed status for all the donation forms. * * @since 2.1 */ function give_v210_verify_form_status_upgrades_callback() { $give_updates = Give_Updates::get_instance(); // form query. $donation_forms = new WP_Query( [ 'paged' => $give_updates->step, 'status' => 'any', 'order' => 'ASC', 'post_type' => 'give_forms', 'posts_per_page' => 20, ] ); if ( $donation_forms->have_posts() ) { $give_updates->set_percentage( $donation_forms->found_posts, ( $give_updates->step * 20 ) ); while ( $donation_forms->have_posts() ) { $donation_forms->the_post(); $form_id = get_the_ID(); $form_closed_status = give_get_meta( $form_id, '_give_form_status', true ); if ( empty( $form_closed_status ) ) { give_set_form_closed_status( $form_id ); } } /* Restore original Post Data */ wp_reset_postdata(); } else { // The Update Ran. give_set_upgrade_complete( 'v210_verify_form_status_upgrades' ); } } /** * Upgrade routine for 2.1.3 to delete meta which is not attach to any donation. * * @since 2.1 */ function give_v213_delete_donation_meta_callback() { global $wpdb; $give_updates = Give_Updates::get_instance(); $donation_meta_table = Give()->payment_meta->table_name; $donations = $wpdb->get_col( " SELECT DISTINCT payment_id FROM {$donation_meta_table} LIMIT 20 OFFSET {$give_updates->get_offset( 20 )} " ); if ( ! empty( $donations ) ) { foreach ( $donations as $donation ) { $donation_obj = get_post( $donation ); if ( ! $donation_obj instanceof WP_Post ) { Give()->payment_meta->delete_all_meta( $donation ); } } } else { // The Update Ran. give_set_upgrade_complete( 'v213_delete_donation_meta' ); } } /** * Rename donation meta type * * @see https://github.com/restrictcontentpro/restrict-content-pro/issues/1656 * * @since 2.2.0 */ function give_v220_rename_donation_meta_type_callback() { global $wpdb; // Check upgrade before running. if ( give_has_upgrade_completed( 'v220_rename_donation_meta_type' ) || ! $wpdb->query( $wpdb->prepare( 'SHOW TABLES LIKE %s', "{$wpdb->prefix}give_paymentmeta" ) ) ) { // Complete update if skip somehow give_set_upgrade_complete( 'v220_rename_donation_meta_type' ); return; } $wpdb->query( "ALTER TABLE {$wpdb->prefix}give_paymentmeta CHANGE COLUMN payment_id donation_id bigint(20)" ); $wpdb->query( "ALTER TABLE {$wpdb->prefix}give_paymentmeta RENAME TO {$wpdb->prefix}give_donationmeta" ); give_set_upgrade_complete( 'v220_rename_donation_meta_type' ); } /** * Adds 'view_give_payments' capability to 'give_manager' user role. * * @since 2.1.5 */ function give_v215_update_donor_user_roles_callback() { $role = get_role( 'give_manager' ); $role->add_cap( 'view_give_payments' ); give_set_upgrade_complete( 'v215_update_donor_user_roles' ); } /** * Remove all wp session data from the options table, regardless of expiration. * * @since 2.2.0 * * @global wpdb $wpdb */ function give_v220_delete_wp_session_data() { global $wpdb; $wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '_wp_session_%'" ); } /** * Update donor meta * Set "_give_anonymous_donor" meta key to "0" if not exist * * @since 2.2.4 */ function give_v224_update_donor_meta_callback() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); $donor_count = Give()->donors->count( [ 'number' => - 1, ] ); $donors = Give()->donors->get_donors( [ 'paged' => $give_updates->step, 'number' => 100, ] ); if ( $donors ) { $give_updates->set_percentage( $donor_count, $give_updates->step * 100 ); // Loop through Donors foreach ( $donors as $donor ) { $anonymous_metadata = Give()->donor_meta->get_meta( $donor->id, '_give_anonymous_donor', true ); // If first name meta of donor is not created, then create it. if ( ! in_array( $anonymous_metadata, [ '0', '1' ] ) ) { Give()->donor_meta->add_meta( $donor->id, '_give_anonymous_donor', '0' ); } } } else { // The Update Ran. give_set_upgrade_complete( 'v224_update_donor_meta' ); } } /** Update donor meta * Set "_give_anonymous_donor_forms" meta key if not exist * * @since 2.2.4 */ function give_v224_update_donor_meta_forms_id_callback() { $give_updates = Give_Updates::get_instance(); $donations = new WP_Query( [ 'paged' => $give_updates->step, 'status' => 'any', 'order' => 'ASC', 'post_type' => [ 'give_payment' ], 'posts_per_page' => 20, ] ); if ( $donations->have_posts() ) { $give_updates->set_percentage( $donations->found_posts, $give_updates->step * 20 ); while ( $donations->have_posts() ) { $donations->the_post(); $donation_id = get_the_ID(); $form_id = give_get_payment_form_id( $donation_id ); $donor_id = give_get_payment_donor_id( $donation_id ); $is_donated_as_anonymous = give_is_anonymous_donation( $donation_id ); $is_anonymous_donor = Give()->donor_meta->get_meta( $donor_id, "_give_anonymous_donor_form_{$form_id}", true ); $is_edit_donor_meta = ! in_array( $is_anonymous_donor, [ '0', '1' ] ) ? true : ( 0 !== absint( $is_anonymous_donor ) ); if ( $is_edit_donor_meta ) { Give()->donor_meta->update_meta( $donor_id, "_give_anonymous_donor_form_{$form_id}", absint( $is_donated_as_anonymous ) ); } } wp_reset_postdata(); } else { give_set_upgrade_complete( 'v224_update_donor_meta_forms_id' ); } } /** * Add custom comment table * * @since 2.4.0 */ function give_v230_add_missing_comment_tables() { $custom_tables = [ Give()->comment->db, Give()->comment->db_meta, ]; /* @var Give_DB $table */ foreach ( $custom_tables as $table ) { if ( ! $table->installed() ) { $table->register_table(); } } } /** * Move donor notes to comment table * * @since 2.3.0 */ function give_v230_move_donor_note_callback() { // Add comment table if missing. give_v230_add_missing_comment_tables(); /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); $donor_count = Give()->donors->count( [ 'number' => - 1, ] ); $donors = Give()->donors->get_donors( [ 'paged' => $give_updates->step, 'number' => 100, ] ); if ( $donors ) { $give_updates->set_percentage( $donor_count, $give_updates->step * 100 ); // Loop through Donors foreach ( $donors as $donor ) { $notes = trim( Give()->donors->get_column( 'notes', $donor->id ) ); // If first name meta of donor is not created, then create it. if ( ! empty( $notes ) ) { $notes = array_values( array_filter( array_map( 'trim', explode( "\n", $notes ) ), 'strlen' ) ); foreach ( $notes as $note ) { $note = array_map( 'trim', explode( '-', $note ) ); $timestamp = strtotime( $note[0] ); Give()->comment->db->add( [ 'comment_content' => $note[1], 'user_id' => absint( Give()->donors->get_column_by( 'user_id', 'id', $donor->id ) ), 'comment_date' => date( 'Y-m-d H:i:s', $timestamp ), 'comment_date_gmt' => get_gmt_from_date( date( 'Y-m-d H:i:s', $timestamp ) ), 'comment_parent' => $donor->id, 'comment_type' => 'donor', ] ); } } } } else { // The Update Ran. give_set_upgrade_complete( 'v230_move_donor_note' ); } } /** * Move donation notes to comment table * * @since 2.3.0 */ function give_v230_move_donation_note_callback() { global $wpdb; // Add comment table if missing. give_v230_add_missing_Comment_tables(); /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); $donation_note_count = $wpdb->get_var( $wpdb->prepare( " SELECT count(*) FROM {$wpdb->comments} WHERE comment_type=%s ", 'give_payment_note' ) ); $query = $wpdb->prepare( " SELECT * FROM {$wpdb->comments} WHERE comment_type=%s ORDER BY comment_ID ASC LIMIT 100 OFFSET %d ", 'give_payment_note', $give_updates->get_offset( 100 ) ); $comments = $wpdb->get_results( $query ); if ( $comments ) { $give_updates->set_percentage( $donation_note_count, $give_updates->step * 100 ); // Loop through Donors foreach ( $comments as $comment ) { $donation_id = $comment->comment_post_ID; $form_id = give_get_payment_form_id( $donation_id ); $comment_id = Give()->comment->db->add( [ 'comment_content' => $comment->comment_content, 'user_id' => $comment->user_id, 'comment_date' => date( 'Y-m-d H:i:s', strtotime( $comment->comment_date ) ), 'comment_date_gmt' => get_gmt_from_date( date( 'Y-m-d H:i:s', strtotime( $comment->comment_date_gmt ) ) ), 'comment_parent' => $comment->comment_post_ID, 'comment_type' => is_numeric( get_comment_meta( $comment->comment_ID, '_give_donor_id', true ) ) ? 'donor_donation' : 'donation', ] ); if ( ! $comment_id ) { continue; } // @see https://github.com/impress-org/give/issues/3737#issuecomment-428460802 $restricted_meta_keys = [ 'akismet_result', 'akismet_as_submitted', 'akismet_history', ]; if ( $comment_meta = get_comment_meta( $comment->comment_ID ) ) { foreach ( $comment_meta as $meta_key => $meta_value ) { // Skip few comment meta keys. if ( in_array( $meta_key, $restricted_meta_keys ) ) { continue; } $meta_value = maybe_unserialize( $meta_value ); $meta_value = is_array( $meta_value ) ? current( $meta_value ) : $meta_value; Give()->comment->db_meta->update_meta( $comment_id, $meta_key, $meta_value ); } } Give()->comment->db_meta->update_meta( $comment_id, '_give_form_id', $form_id ); // Delete comment. update_comment_meta( $comment->comment_ID, '_give_comment_moved', 1 ); } } else { $comment_ids = $wpdb->get_col( $wpdb->prepare( " SELECT DISTINCT comment_id FROM {$wpdb->commentmeta} WHERE meta_key=%s AND meta_value=%d ", '_give_comment_moved', 1 ) ); if ( ! empty( $comment_ids ) ) { $comment_ids = "'" . implode( "','", $comment_ids ) . "'"; $wpdb->query( "DELETE FROM {$wpdb->comments} WHERE comment_ID IN ({$comment_ids})" ); $wpdb->query( "DELETE FROM {$wpdb->commentmeta} WHERE comment_id IN ({$comment_ids})" ); } // The Update Ran. give_set_upgrade_complete( 'v230_move_donation_note' ); } } /** * Delete donor wall related donor meta data * * @since 2.3.0 */ function give_v230_delete_dw_related_donor_data_callback() { global $wpdb; $give_updates = Give_Updates::get_instance(); $wpdb->query( "DELETE FROM {$wpdb->donormeta} WHERE meta_key LIKE '%_give_anonymous_donor%' OR meta_key='_give_has_comment';" ); $give_updates->percentage = 100; // The Update Ran. give_set_upgrade_complete( 'v230_delete_donor_wall_related_donor_data' ); } /** * Delete donor wall related comment meta data * * @since 2.3.0 */ function give_v230_delete_dw_related_comment_data_callback() { global $wpdb; $give_updates = Give_Updates::get_instance(); $wpdb->query( "DELETE FROM {$wpdb->give_commentmeta} WHERE meta_key='_give_anonymous_donation';" ); $give_updates->percentage = 100; // The Update Ran. give_set_upgrade_complete( 'v230_delete_donor_wall_related_comment_data' ); } /** * Update donation form goal progress data. * * @since 2.4.0 */ function give_v240_update_form_goal_progress_callback() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); // form query $forms = new WP_Query( [ 'paged' => $give_updates->step, 'status' => 'any', 'order' => 'ASC', 'post_type' => 'give_forms', 'posts_per_page' => 20, ] ); if ( $forms->have_posts() ) { while ( $forms->have_posts() ) { $forms->the_post(); // Update the goal progress for donation form. give_update_goal_progress( get_the_ID() ); }// End while(). wp_reset_postdata(); } else { // No more forms found, finish up. give_set_upgrade_complete( 'v240_update_form_goal_progress' ); } } /** * DB upgrades for Give 2.5.0 * * @since 2.5.0 */ function give_v250_upgrades() { global $wpdb; $old_license = []; $new_license = []; $give_licenses = get_option( 'give_licenses', [] ); $give_options = give_get_settings(); // Get add-ons license key. $addons = []; foreach ( $give_options as $key => $value ) { if ( false !== strpos( $key, '_license_key' ) ) { $addons[ $key ] = $value; } } // Bailout: We do not have any add-on license data to upgrade. if ( empty( $addons ) ) { return false; } foreach ( $addons as $key => $license_key ) { // Get addon shortname. $addon_shortname = str_replace( '_license_key', '', $key ); // Addon license option name. $addon_shortname = "{$addon_shortname}_license_active"; $addon_license_data = get_option( "{$addon_shortname}_license_active", [] ); if ( ! $license_key || array_key_exists( $license_key, $give_licenses ) ) { continue; } $old_license[ $license_key ] = $addon_license_data; } // Bailout. if ( empty( $old_license ) ) { return false; } /* @var stdClass $data */ foreach ( $old_license as $key => $data ) { $tmp = Give_License::request_license_api( [ 'edd_action' => 'check_license', 'license' => $key, ], true ); if ( is_wp_error( $tmp ) || ! $tmp['success'] ) { continue; } $new_license[ $key ] = $tmp; } // Bailout. if ( empty( $new_license ) ) { return false; } $give_licenses = array_merge( $give_licenses, $new_license ); update_option( 'give_licenses', $give_licenses ); /** * Delete data. */ // 1. license keys foreach ( get_option( 'give_settings' ) as $index => $setting ) { if ( false !== strpos( $index, '_license_key' ) ) { give_delete_option( $index ); } } // 2. license api data $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name like '%_license_active%' AND option_name like 'give_%'" ); // 3. subscriptions data delete_option( '_give_subscriptions_edit_last' ); delete_option( 'give_subscriptions' ); // 4. misc delete_option( 'give_is_addon_activated' ); give_refresh_licenses(); } /** * DB upgrades for Give 2.5.8 * * @since 2.5.8 */ function give_v258_upgrades() { $is_checkout_enabled = give_is_setting_enabled( give_get_option( 'stripe_checkout_enabled', 'disabled' ) ); // Bailout, if stripe checkout is not active as a gateway. if ( ! $is_checkout_enabled ) { return; } $enabled_gateways = give_get_option( 'gateways', [] ); // Bailout, if Stripe Checkout is already enabled. if ( ! empty( $enabled_gateways['stripe_checkout'] ) ) { return; } $gateways_label = give_get_option( 'gateways_label', [] ); $default_gateway = give_get_option( 'default_gateway' ); // Set Stripe Checkout as active gateway. $enabled_gateways['stripe_checkout'] = 1; // Unset Stripe - Credit Card as an active gateway. unset( $enabled_gateways['stripe'] ); // Set Stripe Checkout same as Stripe as they have enabled Stripe Checkout under Stripe using same label. $gateways_label['stripe_checkout'] = $gateways_label['stripe']; give_update_option( 'gateways_label', $gateways_label ); // If default gateway selected is `stripe` then set `stripe checkout` as default. if ( 'stripe' === $default_gateway ) { give_update_option( 'default_gateway', 'stripe_checkout' ); } // Update the enabled gateways in database. give_update_option( 'gateways', $enabled_gateways ); // Delete the old legacy settings. give_delete_option( 'stripe_checkout_enabled' ); } /** * DB upgrades for Give 2.5.11 * * @since 2.5.11 */ function give_v2511_upgrades() { global $wp_roles, $wpdb; $all_roles = get_editable_roles(); // Run code only if not a fresh install. if ( Give_Cache_Setting::get_option( 'give_version' ) ) { // Remove unused notes column from donor table. $wpdb->query( "ALTER TABLE {$wpdb->prefix}give_donors DROP COLUMN notes;" ); } foreach ( $all_roles as $role => $data ) { $wp_roles->remove_cap( $role, 'delete_give_form' ); $wp_roles->remove_cap( $role, 'delete_give_payment' ); $wp_roles->remove_cap( $role, 'edit_give_form' ); $wp_roles->remove_cap( $role, 'edit_give_payment' ); $wp_roles->remove_cap( $role, 'read_give_form' ); $wp_roles->remove_cap( $role, 'read_give_payment' ); } } /** * Upgrade for version 2.6.3 * * @since 2.6.3 */ function give_v263_upgrades() { $licenses = get_option( 'give_licenses', [] ); if ( $licenses ) { foreach ( $licenses as $license ) { if ( ! empty( $license['is_all_access_pass'] ) ) { // Remove single license which is part of all access pass. // @see https://github.com/impress-org/givewp/issues/4669 $addonSlugs = Give_License::getAddonSlugsFromAllAccessPassLicense( $license ); foreach ( $licenses as $license_key => $data ) { // Skip bundle plan license key. if ( ! empty( $data['is_all_access_pass'] ) ) { continue; } if ( in_array( $data['plugin_slug'], $addonSlugs, true ) ) { unset( $licenses[ $license_key ] ); } } } } update_option( 'give_licenses', $licenses ); } } /** * Upgrade routine to call for backward compatibility to manage default Stripe account. * * @since 2.7.0 * @return void * @global wpdb $wpdb */ function give_v270_upgrades() { global $wpdb; $settingKey = '_give_stripe_get_all_accounts'; $giveSettings = give_get_settings(); $isStripeAccountMigrated = array_key_exists( $settingKey, $giveSettings ); $stripeAccounts = $isStripeAccountMigrated ? $giveSettings[ $settingKey ] : []; // Process, only when there is no Stripe accounts stored. if ( ! $isStripeAccountMigrated ) { $liveSecretKey = give_get_option( 'live_secret_key' ); $testSecretKey = give_get_option( 'test_secret_key' ); $livePublishableKey = give_get_option( 'live_publishable_key' ); $testPublishableKey = give_get_option( 'test_publishable_key' ); $isStripeConfigurationExist = $liveSecretKey || $testSecretKey || $livePublishableKey || $testPublishableKey; if ( $isStripeConfigurationExist ) { // Manual API Keys are enabled. if ( ! give_get_option( 'give_stripe_user_id' ) ) { $uniqueSlug = 'account_1'; $stripeAccounts[ $uniqueSlug ] = [ 'type' => 'manual', 'account_name' => give_stripe_convert_slug_to_title( $uniqueSlug ), 'account_slug' => $uniqueSlug, 'account_email' => '', 'account_country' => '', 'account_id' => '', // This parameter will be empty for manual API Keys Stripe account. 'live_secret_key' => $liveSecretKey, 'test_secret_key' => $testSecretKey, 'live_publishable_key' => $livePublishableKey, 'test_publishable_key' => $testPublishableKey, ]; // Set first Stripe account as default. give_update_option( '_give_stripe_default_account', $uniqueSlug ); } else { $secret_key = give_get_option( 'live_secret_key' ); if ( give_is_test_mode() ) { $secret_key = give_get_option( 'test_secret_key' ); } \Stripe\Stripe::setApiKey( $secret_key ); $accounts_count = is_countable( $stripeAccounts ) ? count( $stripeAccounts ) + 1 : 1; $all_account_slugs = array_keys( $stripeAccounts ); $accountSlug = give_stripe_get_unique_account_slug( $all_account_slugs, $accounts_count ); $accountName = give_stripe_convert_slug_to_title( $accountSlug ); $accountEmail = ''; $accountCountry = ''; $stripeAccountId = give_get_option( 'give_stripe_user_id' ); $accountDetails = give_stripe_get_account_details( $stripeAccountId ); // Setup Account Details for Connected Stripe Accounts. if ( ! empty( $accountDetails->id ) && 'account' === $accountDetails->object ) { $accountName = ! empty( $accountDetails->business_profile->name ) ? $accountDetails->business_profile->name : $accountDetails->settings->dashboard->display_name; $accountSlug = $accountDetails->id; $accountEmail = $accountDetails->email; $accountCountry = $accountDetails->country; } $stripeAccounts[ $accountSlug ] = [ 'type' => 'connect', 'account_name' => $accountName, 'account_slug' => $accountSlug, 'account_email' => $accountEmail, 'account_country' => $accountCountry, 'account_id' => $stripeAccountId, 'live_secret_key' => $liveSecretKey, 'test_secret_key' => $testSecretKey, 'live_publishable_key' => $livePublishableKey, 'test_publishable_key' => $testPublishableKey, ]; // Set first Stripe account as default. give_update_option( '_give_stripe_default_account', $accountSlug ); } give_update_option( $settingKey, $stripeAccounts ); // Remove legacy settings. give_delete_option( 'live_secret_key' ); give_delete_option( 'test_secret_key' ); give_delete_option( 'live_publishable_key' ); give_delete_option( 'test_publishable_key' ); give_delete_option( 'give_stripe_connected' ); give_delete_option( 'give_stripe_user_id' ); } } // Do not need to go beyond this if you are on fresh install and on fresh install donationmeta property is not defined for $wpdb. // Below code is to check if site have donations which processed with Stripe payment method // if not then we will auto complete stripe background update. if ( ! property_exists( $wpdb, 'donationmeta' ) ) { return; } $canStoreStripeInformationInDonation = (bool) $wpdb->get_var( $wpdb->prepare( " SELECT COUNT(donation_id) FROM $wpdb->donationmeta WHERE meta_key=%s AND meta_value LIKE %s", '_give_payment_gateway', '%stripe%' ) ); if ( ! $canStoreStripeInformationInDonation || ! $stripeAccounts ) { give_set_upgrade_complete( 'v270_store_stripe_account_for_donation' ); } } /** * This manual upgrade routine is used set the default Stripe account for all the existing donations. * This process will help us to identify which Stripe account is used to process a specific donation. * * @since 2.7.0 * * @return void */ function give_v270_store_stripe_account_for_donation_callback() { /* @var Give_Updates $give_updates */ $give_updates = Give_Updates::get_instance(); $donations = new WP_Query( [ 'paged' => $give_updates->step, 'status' => 'any', 'order' => 'ASC', 'post_type' => [ 'give_payment' ], 'posts_per_page' => 100, ] ); if ( $donations->have_posts() ) { $give_updates->set_percentage( $donations->found_posts, $give_updates->step * 100 ); while ( $donations->have_posts() ) { $donations->the_post(); $donationId = get_the_ID(); // Continue, if the donation is not processed with any of the supported payment method of Stripe. if ( ! Stripe::isDonationPaymentMethod( give_get_payment_gateway( $donationId ) ) ) { continue; } Stripe::addAccountDetail( $donationId, give_get_payment_form_id( $donationId ) ); } wp_reset_postdata(); } else { // Update Ran Successfully. give_set_upgrade_complete( 'v270_store_stripe_account_for_donation' ); } } /** * Removes any leftover export files that should've been deleted * * @since 2.9.0 */ function give_v290_remove_old_export_files() { @unlink( WP_CONTENT_DIR . '/uploads/give-payments.csv' ); @unlink( WP_CONTENT_DIR . '/uploads/give-donors.csv' ); }