'ids', 'number' => 100, 'offset' => $offset, ) ); foreach ( $sites as $site_id ) { switch_to_blog( $site_id ); try { self::deactivate(); } finally { restore_current_blog(); } } $offset += 100; $count = count( $sites ); } while ( 100 === $count ); return; } wp_clear_scheduled_hook( 'devoynx_rewards_expire_points' ); wp_unschedule_hook( 'devoynx_rewards_backfill_batch' ); wp_unschedule_hook( 'devoynx_rewards_basic_emails' ); wp_unschedule_hook( 'devoynx_rewards_guest_cleanup' ); wp_unschedule_hook( 'devoynx_rewards_referral_retry' ); if ( function_exists( 'as_unschedule_all_actions' ) ) { as_unschedule_all_actions( 'devoynx_rewards_expire_points', array(), 'devoynx-rewards' ); as_unschedule_all_actions( 'devoynx_rewards_backfill_batch', null, 'devoynx-rewards' ); as_unschedule_all_actions( 'devoynx_rewards_basic_emails', null, 'devoynx-rewards' ); as_unschedule_all_actions( 'devoynx_rewards_guest_cleanup', null, 'devoynx-rewards' ); as_unschedule_all_actions( 'devoynx_rewards_referral_retry' ); } flush_rewrite_rules(); } /** * Run upgrades only when the stored schema is behind. * * @return void */ public static function maybe_upgrade() { if ( self::SCHEMA_VERSION !== get_option( self::OPTION_NAME ) ) { self::migrate(); self::add_capabilities(); } } /** * Create or update custom tables using dbDelta. * * @return void */ private static function migrate() { global $wpdb; require_once ABSPATH . 'wp-admin/includes/upgrade.php'; $charset_collate = $wpdb->get_charset_collate(); $ledger = $wpdb->prefix . 'devoynx_rewards_ledger'; $balances = $wpdb->prefix . 'devoynx_rewards_balances'; $sql_ledger = "CREATE TABLE {$ledger} ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, user_id bigint(20) unsigned NOT NULL, points bigint(20) unsigned NOT NULL, from_bucket varchar(20) NOT NULL DEFAULT '', to_bucket varchar(20) NOT NULL DEFAULT '', event_type varchar(50) NOT NULL, source_type varchar(50) NOT NULL, source_id varchar(100) NOT NULL DEFAULT '', idempotency_key varchar(191) NOT NULL, rule_id varchar(100) NOT NULL DEFAULT '', rule_version bigint(20) unsigned NOT NULL DEFAULT 0, calculation_trace longtext NULL, expires_at datetime NULL, created_at datetime NOT NULL, PRIMARY KEY (id), UNIQUE KEY idempotency_key (idempotency_key), KEY user_created (user_id,created_at), KEY source_lookup (source_type,source_id), KEY bucket_lookup (user_id,from_bucket,to_bucket), KEY expiry_lookup (expires_at,user_id) ) ENGINE=InnoDB {$charset_collate};"; $sql_balances = "CREATE TABLE {$balances} ( user_id bigint(20) unsigned NOT NULL, pending bigint(20) unsigned NOT NULL DEFAULT 0, available bigint(20) unsigned NOT NULL DEFAULT 0, reserved bigint(20) unsigned NOT NULL DEFAULT 0, redeemed bigint(20) unsigned NOT NULL DEFAULT 0, expired bigint(20) unsigned NOT NULL DEFAULT 0, reversed bigint(20) unsigned NOT NULL DEFAULT 0, version bigint(20) unsigned NOT NULL DEFAULT 0, updated_at datetime NOT NULL, PRIMARY KEY (user_id), KEY available (available) ) ENGINE=InnoDB {$charset_collate};"; dbDelta( $sql_ledger ); dbDelta( $sql_balances ); if ( false === get_option( 'devoynx_rewards_settings', false ) ) { add_option( 'devoynx_rewards_settings', array( 'points_per_currency' => 1, 'currency_per_point' => 0.01, 'award_status' => 'completed', 'signup_points' => 0, 'review_points' => 0, 'max_redemption' => 0, 'points_expiry_days' => 0, 'show_excluded_message' => 1, 'delete_on_uninstall' => 0, ), '', false ); } update_option( self::OPTION_NAME, self::SCHEMA_VERSION, false ); } /** * Grant the least-privilege management capability to commerce roles. * * @return void */ private static function add_capabilities() { foreach ( array( 'administrator', 'shop_manager' ) as $role_name ) { $role = get_role( $role_name ); if ( $role ) { $role->add_cap( 'manage_devoynx_rewards' ); } } } }